是否可以在执行后处理OPL范围内包括求和表达式?

问题描述

我用一个定义为x [s,r,v,l]的变量编写了一个OPL模型,该变量具有许多可以正常工作的约束。

range V = 1..17;                        
range S = 1..20;                        
range LP=1..2;                          
range RT=1..8;

dvar float+ x[S][RT][V][LP];
.
.
.

同样,我在约束之后定义了execute(输出部分),如下所示:

execute Output{\
 writeln("---------------------Timeline---------------------------------");\
  for(var s in S){\
        writeln("Week " + s);\
        for(var l in LP){\
            for (var v in V){\
             if (sum(r in RT)(x[s,r,v,l]) > 0) {\
            writeln("            Line "+l+"  Producing product "+v+"   "+sum(r in RT)x[s,l]+" tons   "+sum(r in RT) x[s,l] / Pi_l[l]+" hours    ");\
            }\
            }\
        }\
    }\
}

但是它不起作用。有什么办法吗? (或修改语法以获得正确的句子)

解决方法

您不能在脚本中使用sum,但可以将OPL和脚本混合使用:

range V = 1..17;
range S = 1..20;
range LP=1..2;
range RT=1..8;

float Pi_l[l in LP]=l;

dvar float+ x[S][RT][V][LP]; 

subject to
{
  x[1][1][1][1]==1;
}

float su[s in S][l in LP][v in V]=sum(r in RT)(x[s,r,v,l]);

execute Output{
writeln("---------------------Timeline---------------------------------");
for(var s in S){
writeln("Week " + s);
for(var l in LP){
for (var v in V){
if (su[s][l][v] > 0) {
writeln("            Line "+l+"  Producing product "+v+"   "+su[s][l][v]+" tons   "+su[s][l][v] / Pi_l[l]+" hours    ");
}

}
}
}
}

工作正常