Está en la página 1de 41

OPL, un lenguaje de

programación de restricciones.

Nacho Castiñeiras
Grupo de programación declarativa

1
Índice

z Primerospasos
z ILOG CPLEX
z ILOG SOLVER
z ILOG SOLVER SCHEDULER

2
Primeros pasos.

Comprender el entorno y empezar


a trabajar en él.

3
Objetivo de esta fase previa.

Uhm, ¡cómo me
gustaría usar OPL!
¡Sé lo suficiente
Lástima que deba
para empezar!
conocer la sintaxis

Primeros pasos

4
Primeros pasos

z Motivación

z Mapa de componentes.

z Sintaxis mínima OPL

5
Motivación

¿Qué queremos?

Resolver problemas de :
¾ Satisfacción de restricciones.
¾ Optimización de restricciones.
¾ Búsqueda del valor óptimo.

6
Motivación

¿Cómo resolverlos?

Ciclo de vida

Descripción
Algoritmo(modelo)
‘en Castellano’ Modelarlo
Æ solución
del problema

7
Mapa de componentes

¿Qué nos ofrece ILOG?

¾ Resolutores especializados.
¾ Un lenguaje de modelado: OPL
¾ Orientado a naturaleza de estos problemas.
¾ Reduce salto modelo-algoritmo.

8
Mapa de componentes

Descripción
Modelo Resolutor(modelo)
‘en Castellano’
del problema OPL Æ solución

9
Mapa de componentes

ILOG CPLEX ILOG SOLVER

ILOG SCHEDULER

OPL Studio 3.7

Código OPL

10
OPL Studio 3.7

IDE.
¿Cómo…
Abrir/Crear

Modelar

Resolver/Ver resultados
?

11
Sintaxis mínima OPL

Estructura de un modelo OPL.

1. Datos
2. Variables
3. Función de óptimo
4. Restricciones
5. Procedimiento búsqueda

12
Sintaxis mínima OPL.

Datos
¾ Tipos básicos.
int, float, enum
¾ Tipos estructurados.
range, array, struct, set

13
Datos. Tipos básicos

int
z int numero1 = 2;
z int numero2 = numero1 * numero1 + 1;
z int numero3 = ...;
z int dimeTu << "Pasame un entero";

14
Datos. Tipos básicos

float
z float real = -3.2;
z float+ real_positivo = 4.27;

15
Datos. Tipos básicos.

enum
z enum Color { Azul, Grana, Naranja };
z enum Days { Lunes, Miercoles, Viernes,
Domingo};

z //Color mi_color = Azul;

16
Datos. Tipos estructurados

range
z range coches 1..6;
z range numeros [2*numero1..2*numero2];

17
Datos. Tipos estructurados

arrays
Dos aspectos a estudiar
¾ Indexación

¾ Inicialización

18
Datos. Tipos estructurados

arrays
int mi_array[2..5] = [10, 20, 30, 40];
//int a1 = mi_array[3];

Color concesionario[coches] = [Azul,


Grana, Naranja, Naranja, Azul, Azul];

//int me_gusta[Days] = [0,3,6,3];

19
Datos. Tipos estructurados

arrays
int camisetas[i in 1..3] = i+1;

int feliz[Days,1..3] = [ [1, 2, 3], [4, 5, 6],


[7, 8, 9], [10, 11, 12] ];

int muy_elegante[Days, Color] = …;

20
Datos. Tipos estructurados
z int muy_elegante[Days, Color] = ...;
//Instancia
muy_elegante = #[
Lunes : #[
Azul : 4,
Naranja : 2,
Grana : 3
]#,
Miercoles : #[
Azul : 3,
Naranja : 3,
Grana : 4
]#
… ]#;

21
Datos. Tipos estructurados

struct
z struct Conexion {
int origen;
int destino;
};
Conexion c = <2,3>;
//int orig = c.origen;

22
Datos. Tipos estructurados

sets
{int} pares_hasta4 = {0,2,4};

{Conexion} conexiones = {<1,2>, <1,3>, <2,3>};

//Array indexado por los elementos de un


conjunto. Estos elementos son estructuras.
int valores[conexiones] = [3,4,5];

23
Sintaxis mínima OPL

Estructura de un modelo OPL.

1. Datos
2. Variables
3. Función de óptimo
4. Restricciones
5. Procedimiento búsqueda

24
Sintaxis mínima OPL

Variables de decisión
¾ int
¾ float
¾ enum

25
Variables de decisión

int
z var int entero1 in 0..5;
z var int nuevo_concesionario1[coches] in 0..1;

enum
z var Color nuevo_concesionario2[coches];

26
Variables de decisión

float
z var float x3;
z var float+ x4;
z var float+ real1[1..3];

27
Sintaxis mínima OPL

assert
Restricciones dependientes únicamente de
datos de entrada.

assert
num_reinas >= 3;

28
Sintaxis mínima OPL

Estructura de un modelo OPL.

1. Datos
2. Variables
3. Función de óptimo
4. Restricciones
5. Procedimiento búsqueda

29
Sintaxis mínima OPL

Función de óptimo
z minimize
2*x3 + 3*x4

z maximize
3*x3 + 2*x4

30
Sintaxis mínima OPL

Estructura de un modelo OPL.

1. Datos
2. Variables
3. Función de óptimo
4. Restricciones
5. Procedimiento búsqueda

31
Sintaxis mínima OPL

Restricciones
¾ Lineales
¾ No lineales

32
Restricciones

Lineales
3*x3 + x4 <= 11;
-x3 + 2*x4 <= 5;

33
Restricciones

No lineales
x1 + x2 < 12;
entero1 <> 3;

34
Sintaxis mínima OPL

Estructura de un modelo OPL.

1. Datos
2. Variables
3. Función de óptimo
4. Restricciones
5. Procedimiento búsqueda

35
Sintaxis mínima OPL

Procedimientos de búsqueda
search{
tryall(j in 0..5 ordered by decreasing j)
entero1 = j;
};

36
Sintaxis mínima OPL

Operadores.

Sobre grupo elementos. sum, prod, max, min


Relacionales. =, <>, <, <=, >, >=
Lógicos. \/, &, not, =>, <=>
Binarios. +, -, *, /, mod
Sobre conjuntos. in, not in, union, diff, inter

37
Sintaxis mínima OPL

Condiciones
z //filtrado de un conjunto
{Conexion} nuevas_conexiones = { p | p in
conexiones : p.origen + p.destino = 4};

z {int} modulos[i in 3..4] = { e | e in 1..10 : e


mod i = 0 };
modulos[3] = {3,6,9}
modulos[4] = {4,8}

38
Sintaxis mínima OPL

forall
forall(i in 1..8){
reinas[i] >= 1;
reinas[i] <= 8;
}
sum
sum(i in 1..8) reinas[i] = (8*(8+1))/2

39
Sintaxis mínima OPL
Ideas extra sobre restricciones
z //Restricciones de orden superior
forall(i in Range)
s[i] = sum(j in Range) (s[j] = i);

z //Array indexado con posición de otro array


forall(m in Men)
husband[wife[m]] = m;

z //Restricciones globales
alldifferent(entero2);

40
Fin

41

También podría gustarte