OPL CPLEX - 使用具有不同 KPI 的多目标优化
OPL CPLEX - Using Multiobjective Optimization with Distinct KPIs
我正在尝试使用 staticLexFull objective 函数在 OPL IDE 的 CPLEX 版本 12.10 中实现多 objective 决策优化。我有 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 的 staticLexFull 可用示例不同 IDE;提供的示例显示了当数组的每个元素都处理相同的决策变量时如何初始化 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];
当我尝试 运行 上述代码时,出现“Opl运行 进程没有响应,您必须重新启动 运行 配置”错误。然后,我通过命令提示符直接使用 Opl运行 尝试 运行ning 并收到错误:“ERROR[GENERATE 209]:元素“kpis”的初始化表达式无效。”
我不知道如何一般地初始化这个数组,这似乎是 运行 staticLexFull 的要求。这看起来很奇怪,因为似乎大多数用例都与我的匹配,而不是示例中提供的示例。有没有办法像我尝试的那样使用 staticLexFull?
请注意,我试图在 IBM 决策优化社区论坛上提出这个问题,但是当我点击“发送”按钮时 post 不会出现。
你能不能把你的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
{
}
工作正常
我正在尝试使用 staticLexFull objective 函数在 OPL IDE 的 CPLEX 版本 12.10 中实现多 objective 决策优化。我有 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 的 staticLexFull 可用示例不同 IDE;提供的示例显示了当数组的每个元素都处理相同的决策变量时如何初始化 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];
当我尝试 运行 上述代码时,出现“Opl运行 进程没有响应,您必须重新启动 运行 配置”错误。然后,我通过命令提示符直接使用 Opl运行 尝试 运行ning 并收到错误:“ERROR[GENERATE 209]:元素“kpis”的初始化表达式无效。”
我不知道如何一般地初始化这个数组,这似乎是 运行 staticLexFull 的要求。这看起来很奇怪,因为似乎大多数用例都与我的匹配,而不是示例中提供的示例。有没有办法像我尝试的那样使用 staticLexFull?
请注意,我试图在 IBM 决策优化社区论坛上提出这个问题,但是当我点击“发送”按钮时 post 不会出现。
你能不能把你的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
{
}
工作正常