Documentos de Académico
Documentos de Profesional
Documentos de Cultura
OPL, Un Lenguaje de Programación de Restricciones.: Nacho Castiñeiras
OPL, Un Lenguaje de Programación de Restricciones.: Nacho Castiñeiras
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.
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.
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
¾ 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 SCHEDULER
Código OPL
10
OPL Studio 3.7
IDE.
¿Cómo…
Abrir/Crear
Modelar
Resolver/Ver resultados
?
11
Sintaxis mínima 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};
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];
19
Datos. Tipos estructurados
arrays
int camisetas[i in 1..3] = i+1;
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};
23
Sintaxis mínima 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
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
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
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.
37
Sintaxis mínima OPL
Condiciones
z //filtrado de un conjunto
{Conexion} nuevas_conexiones = { p | p in
conexiones : p.origen + p.destino = 4};
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 //Restricciones globales
alldifferent(entero2);
40
Fin
41