Soy un principiante en el estudio de optimización de ibm ilog cplex.
Recibo un error cuando intento ejecutar este código:
{int} job=...; // {int} mch=...; // {int} opes=...; float M=...; // tuple capableMchs{ int j; // jobs int o; // operations int m; //machines }; {capableMchs} capableMch=...; {int} Ope[j in job] = { o | <j,o,m> in capableMch}; tuple jointMchs { int j; //jobs int o; //operation of j int h; // jobs int g; // operation of h int m; } //machine {jointMchs} jointMch={}; execute IniciarTupleSet { for (var j in job) { for (var op in Ope[j]) { for (var h in job , (j < h)) { for (var g in Ope[h]) { for (var m in mch, <j,op,m> in capableMch) { if (<h,g,m> in capableMch) jointMch.add(j,op,h,g,m) } } } } } }El error que obtengo es: "expresión faltante"
Creo que el problema reside en la parte "for (var m in mch, <j,op,m> in ableMch)", pero no sé cómo solucionarlo. Sin ese bloque de preprocesamiento tengo que hacer mucho trabajo a mano.
Por contexto: jointMch se usa para indexar una variable booleana Z que representa que la operación g de un trabajo h precede a la operación o del trabajo j en la máquina m.
Aquí hay un ejemplo de lo que espero que genere el código:
job = { 1 2 3} ; mch = {1 2 3} ; opes = {1 2 3} ; capableMch={ //tuple set of doable operation of jobs in a machine <1,1,1>, <1,1,2>, <1,2,1>, <1,2,2> <1,3,3>, <2,1,2>, <2,2,2>, <3,1,3>, <3,2,3>, <3,3,3>, }; jointMch = { <1,1,2,1,2>, <1,2,2,1,2>, <1,2,2,2,2>, <1,1,1,2,2>, <1,3,3,1,3>, <1,3,3,2,3>, <1,3,3,3,3>, };Por ejemplo, debido a que la operación 1 del trabajo 1 y la operación 1 del trabajo 2 se pueden realizar en la máquina 2, necesito el elemento: <1,1,2,1,2> y así sucesivamente.
en OPL tienes 2 idiomas: la parte de modelado y la parte de javascript. En la parte de javascript use el lenguaje javascript.
{int} job={1,2}; // {int} mch={1,2};; // {int} opes={1,2};; float M=100; // tuple capableMchs{ int j; int o; int m; }; {capableMchs} capableMch={<1,2,3>}; {int} Ope[j in job] = { o | <j,o,m> in capableMch}; tuple jointMchs { int j; int o; int h; int g; int m;} {jointMchs} jointMch={}; execute IniciarTupleSet { for (var j in job) { for (var op in Ope[j]) { for (var h in job) if (j < h) { for (var g in Ope[h]) { for (var m in mch) for(var jopm in capableMch) if (jopm.j==j) { if (capableMch.find(h,g,m)) jointMch.add(j,op,h,g,m) } } } } } }obras
pero con tu último comentario te animo a que confíes en el modelado OPL y escribas
{jointMchs} jointMch={<j,o,h,g,m> | <j,o,h> in capableMch,g in Ope[h],m in mch :<h,g,m> in capableMch && j<h};lo que da
1,1,2,1,2 1,1,2,2,2 1,2,2,1,2 1,2,2,2,2 1,3,3,1,3 1,3,3,2,3 1,3,3,3,3