OPL, un lenguaje de
programación de restricciones.
Nacho Castiñeiras
Índice
z
Primeros pasos
zILOG CPLEX
z
ILOG SOLVER
Primeros pasos.
Objetivo de esta fase previa.
Uhm, ¡cómo me gustaría usar OPL! Lástima que deba conocer la sintaxis
Primeros pasos
Primeros pasos
z
Motivación
Motivación
¿Qué queremos?
Resolver problemas de :
¾
Satisfacción de restricciones.
¾Optimización de restricciones.
Motivación
¿Cómo resolverlos?
Ciclo de vida
Descripción ‘en Castellano’
del problema Modelarlo
Mapa de componentes
¿Qué nos ofrece ILOG?
¾
Resolutores especializados.
¾
Un lenguaje de modelado: OPL
Mapa de componentes
Modelo
OPL Resolutor(modelo) Æ solución Descripción
Mapa de componentes
Código OPL
OPL Studio 3.7
ILOG CPLEX ILOG SOLVER
Sintaxis mínima OPL
Estructura de un modelo OPL.
1.
Datos
2.
Variables
3.
Función de óptimo
4.Restricciones
Sintaxis mínima OPL.
Datos
¾
Tipos básicos.
int, float, enum ¾
Tipos estructurados.
Datos.
Tipos básicos
int
z int numero1 = 2;
z int numero2 = numero1 * numero1 + 1; z int numero3 = ...;
Datos. Tipos básicos
float
z float real = -3.2;
Datos. Tipos básicos.
enum
z enum Color { Azul, Grana, Naranja };
z enum Days { Lunes, Miercoles, Viernes,
Domingo};
Datos. Tipos estructurados
range
z range coches 1..6;
Datos. Tipos estructurados
arrays
Dos aspectos a estudiar
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];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] ];Datos. Tipos estructurados
z int muy_elegante[Days, Color] = ...;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.
Sintaxis mínima OPL
Estructura de un modelo OPL.
1.
Datos
2.
Variables
3.
Función de óptimo
4.Restricciones
Sintaxis mínima OPL
Variables de decisión
Variables de decisión
int
z var int entero1 in 0..5;
z var int nuevo_concesionario1[coches] in 0..1;
enum
Variables de decisión
float
z var float x3; z var float+ x4;
Sintaxis mínima OPL
assert
Restricciones dependientes únicamente de datos de entrada.
assert
Sintaxis mínima OPL
Estructura de un modelo OPL.
1.
Datos
2.
Variables
3.
Función de óptimo
4.
Restricciones
Sintaxis mínima OPL
Estructura de un modelo OPL.
1.
Datos
2.
Variables
3.
Función de óptimo
4.
Restricciones
Sintaxis mínima OPL
Restricciones
¾ Lineales
Restricciones
Lineales
Restricciones
No lineales
Sintaxis mínima OPL
Estructura de un modelo OPL.
1.
Datos
2.
Variables
3.
Función de óptimo
4.Restricciones
Sintaxis mínima OPL
Procedimientos de búsqueda search{
tryall(j in 0..5 ordered by decreasing j) entero1 = j;
Sintaxis mínima OPL
Operadores.
Sobre grupo elementos. sum, prod, max, min Relacionales. =, <>, <, <=, >, >=
Lógicos. \/, &, not, =>, <=> Binarios. +, -, *, /, mod
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 };
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