首页 > 解决方案 > 如何在具有求和功能的 cplex 中包含带有决策变量的 if 语句

问题描述

如何在具有决策变量的约束部分转换 If 语句。costvship 是装运的可变成本,仅当 sum(m in M)x[m][n]*h[p][n]*weight[m] 大于阈值权重时才需要包括在内。这里 x[m][n] 和 h[p][n] 是二进制变量。

 forall(p in P, n in N){costship[p][n] == costfship*z[p][n] + costvship*(sum(m in M)(x[m][n]*h[m][p]*weight[m])- Weight);

}

标签: optimizationcplexopl

解决方案


如果约束为真,您可以使用逻辑约束来添加额外成本。

让我更改动物园示例以表明:

int nbKids=300;
float costBus40=500;
float costBus30=400;

int penalty=1000;
 
dvar int+ nbBus40;
dvar int+ nbBus30;
 
minimize
 costBus40*nbBus40  +nbBus30*costBus30  + (nbBus40+nbBus30<=8)*penalty;
 
subject to
{
 40*nbBus40+nbBus30*30>=nbKids;
} 

你也可以用 sum 写

int nbKids=300;

{int} sizes={40,30};
float costBus[sizes]=[500,400];


int penalty=1000;
 
dvar int+ nbBus[sizes];

 
minimize
  sum(s in sizes)costBus[s]*nbBus[s] + (sum(s in sizes) nbBus[s]<=8)*penalty;
 
subject to
{
 sum(s in sizes)s*nbBus[s]>=nbKids;
} 

推荐阅读