问题描述
我正在尝试使用staticLexFull目标函数在OPL IDE的CPLEX版本12.10中实现多目标决策优化。我已经将12个决策表达式包含在KPI数组中,这些表达式将作为第一个参数传递给staticLexFull。尽管我不能共享生产代码,但实际上它看起来像这样:
dvar int a[1..10];
dvar int b[1..10];
dvar int c[1..25];
dvar int d[1..20];
dexpr float a_sum = sum(i in 1..10) a[i]*e[i] //e is a variable declared earlier
dexpr float b_sum = sum(i in 1..10) b[i]*f[i] //f declared earlier
dexpr float c_sum = sum(i in 1..25) c[i]*g[i]*h[i] //g & h declared earlier
dexpr float d_sum = sum(i in 1..20) d[i]*j[i] //j declared earlier
dexpr float kpis[1..4] = [a_sum,b_sum,c_sum,d_sum];
float weights[i in 1..4] = 1;
int priorities[1 in 1..4] = [1,2,3,3];
float abstol[i in 1..4] = 0.001;
float reltol[i in 1..4] = 0.001;
minimize staticLexFull(kpis,weights,priorities,abstol,reltol);
这与Opl IDE的staticLexFull可用示例不同;提供的示例显示了如何在数组的每个元素处理相同的决策变量时初始化kpis数组,因此可以通用地对其进行初始化,例如:
dvar int Life[Bord][Bord] in States;
dexpr float kpis[i in Bord1] = sum(i1 in Bord,j1 in Bord : i1 != i] Life[i1][j1];
当我尝试运行以上代码时,出现“ OplRun进程未响应,您必须重新启动运行配置”错误。然后,我尝试通过命令提示符直接用OplRun运行并得到错误:“ ERROR [GENERATE 209]:元素“ kpis”的无效初始化表达式。”
我不知道如何通用地初始化此数组,这似乎是运行staticLexFull的要求。这似乎很奇怪,因为似乎大多数用例都将与我的用例匹配,而不是示例中提供的示例。有没有一种方法可以尝试使用staticLexFull?
请注意,我试图在IBM决策优化社区论坛上提出这个问题,但是当我按下“发送”按钮时,该帖子不会显示。
解决方法
您可以将kpis重写为
dexpr float kpis[i in 1..4] = (i==1)?a:((i==2)?b:((i==3)?c:d));
?
dvar int a;
dvar int b;
dvar int c;
dvar int d;
dexpr float kpis[i in 1..4] = (i==1)?a:((i==2)?b:((i==3)?c:d));
float weights[i in 1..4] = 1;
int priorities[1..4] = [1,2,3,3];
float abstol[i in 1..4] = 0.001;
float reltol[i in 1..4] = 0.001;
minimize staticLexFull(kpis,weights,priorities,abstol,reltol);;
subject to
{
}
工作正常