Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sebastian Weitzler
Introduccin
OPL es un lenguaje de programacin, que es
empleado en el software ILOG OPL STUDIO, el
cual permite el modelado, anlisis y resolucin de
modelos matemticos, tales como son problemas
de optimizacin.
Caractersticas ms Importantes
1.
2.
3.
Ejemplo
Problema de transporte
Considrese un conjunto de consumidores y productores. Conocida la demanda
de cada consumidor, la produccin mxima de los productores, y el costo de transporte
de los productos desde los productores hasta los consumidores, el problema de transporte
consiste en determinar la cantidad de producto a transportar de forma que el costo sea
mnimo. Se tienen i productores y j consumidores.
Variables de decision
xij: Cantidad de producto que se transporta desde el productor i hasta el consumidor j, en
toneladas.
Ejemplo
Datos
cij: costo de tranportar desde el productor i al consumidor j.
ai: produccin mxima del productor i, en toneladas.
bj: demanda del consumidor j, en toneladas
m1
m2
m3
p1
2.0
1.6
1.8
p2
2.5
1.2
1.4
Las producciones mximas son de 300 y 500 toneladas respectivamente. Las demandas son
de 100, 200 y 300 toneladas respectivamente. Y el costo de transporte en euros es de 0.09 por tonelada
y kilmetro.
Ejemplo
Formulacin del problema
cij xij
Minimizar:
i
Sujeto a:
xij
ai ,
xij
bj ,
xij
0,
j, i
Ejemplo
En OPL, el problema anterior se codifica y almacena en un fichero cuya extensin por
defecto es .mod. El contenido de este fichero es el siguiente:
//Definicin de sub-ndices.
int productores = 2;
range i 1..productores;
int consumidores = 3;
range j 1..consumidores;
//Definicin Parmetros
float+ d[i,j] =[[2, 1.6, 1.8],[2.5,1.2,1.4]];
float+ a[i] = [300,500];
float+ b[j] = [100, 200, 300];
float+ f = 0.09;
Ejemplo
//Definicin de variable
var float+ X[i, j];
// F.O.
minimize
sum(ii in i, jj in j) ((d[ii,jj]*f) * X[ii,jj])
// S.A.
subject to {
forall(ii in i)
sum(jj in j)X[ii,jj] <= a[ii];
forall(jj in j)
sum(ii in i)X[ii,jj] >= b[jj];
};
8
Ejemplo
Si se observa el modelo matemtico propuesto para resolver el problema y el modelo escrito en OPL,
se puede examinar que ambos modelos poseen la misma estructura lgica y solo varia la estructura,
donde la simbologa matemtica es remplazada por los comandos que tiene definido OPL.
La primera parte del modelo corresponde a la definicin de los sub-indices que sern empleados en el
modelo, los cuales establecern la dimensin de este. Para este fin se utilizan el comando int, que
define que se esta haciendo referencia a un valor entero y el comando range hace referencia a la
creacin de un sub-ndice.
Cabe sealar que el comando // tiene la finalidad de indicar que lo que se esta escribiendo no debe
ser considerado como parte del modelo y se emplea principalmente para poner notas en el modelo que
permitan una mejor comprensin de est.
En la definicin de los parmetros se utiliza el comando float+ que hace referencia a la creacin de un
valor positivo. En este punto se le pueden instaurar los valores de forma directa a los parmetro, como
se realiza en el ejemplo, o estos pueden ser llamados desde una base de datos.
Ejemplo
En la creacin de variables solo se hace referencia al tipo y se antepone el comando var, en este
ejemplo se crea mediante el comando var float+ que crea una variable no negativa.
Para construir la funcin objetivo primero se identifica si esta busca minimizar (cuyo comando es
minimize) o maximizar (cuyo comando es maximize), para despus poner la funcin objetivo que se
quiere resolver.
Para instaurar las condiciones bajo las cuales se construye el modelo, se emplea el comando subject
to, en el cual se deben de escribir todas las condiciones que sern analizadas.
Para la construccin de las ecuaciones se emplean los comando sum, que hace referencias a sumatoria
y el comando forall, el cual indica se debe analizar una condicin para todos las condiciones que en
ella se indiquen.
10
Ejemplo
OPL entrega los valores de todas las variables que son procesadas y el valor de la
funcin objetivo como se muestra a continuacin.
11
Obs:
1. Un parmetro puede ser creado sin valor, par despus asignarle
una ms adelante en el modelo de la siguiente manera.
int par_int = ;
2. Siempre que se termina una lnea de comando se debe de poner ;
al final de est.
int par_int = 4;
12
13
15
16
2.
Cada lnea de comando debe terminar con un punto y coma. El olvido de este
separador de rdenes puede provocar muchos errores de compilacin.
3.
Se debe seguir el orden para la construccin del modelo, siendo este el siguiente:
1.
2.
3.
4.
5.
6.
7.
8.
Cargar las hojas de calculo con las que trabaja el modelo. (opcional)
Definir los rangos (sub-ndices)
Definir los parmetros.
Carga datos de los parmetros desde las hojas de datos. (opcional)
Definir las variables.
Definir la Funcin Objetivo.
Establecer la restricciones.
Escribir los resultados en las hojas de calculo correspondientes. (opcional)
17
5.
Es posible escribir varios comandos en una misma lnea siempre que estn
separadas por punto y coma. El compilador considera sucesivos espacios en blanco
como uno solo.
6.
Los identificadores usados en OPL deben comenzar por una letra y pueden ir
seguidos por hasta nueve caracteres alfanumricos, no estando permitida la letra ,
ni los caracteres especiales como los acentos (esto ltimo tampoco est permitido
en los textos explicativos).
18
21
22
24
25
26
28
forall (oo in o, pp in p)
C_E[oo,pp,2] = C_E2[oo,pp];
forall (oo in o, pp in p)
C_E[oo,pp,3] = C_E3[oo,pp];
}
SheetWrite(sheet,"B3:G10")(C_E1);
SheetWrite(sheet,B15:G22")(C_E2);
SheetWrite(sheet, "B27:G34")(C_E3);
29
30