我必须为 OPL Cplex 中的每个节点定义浮点变量,例如 nbBus40 和 nbBus30,并且优化问题是非线性的。我正在编写代码以及代码的错误。
using CP;
int nbKids=310;
float costBus40=500;
float costBus30=400;
int scale=100;
int num_Node = 13;
range Node = 1..num_Node;
dvar int+ scalenbBus40[Node];
dvar int+ scalenbBus30[Node];
*dexpr float nbBus40[Node]=scalenbBus40[Node]/scale;*
*dexpr float nbBus30[Node]=scalenbBus30[Node]/scale;*
minimize
sum (n in Node)(costBus40*nbBus40[n] + nbBus30*costBus30[n]);
subject to
{
forall (n in Node){
40*nbBus40[n]+nbBus30[n]*30>=nbKids;
}
}
上述代码斜体部分的错误是它不能使用 int 类型范围。
dexpr float nbBus40[Node]=scalenbBus40[Node]/scale;
是错误的。你应该写:
dexpr float nbBus40[i in Node]=scalenbBus40[i]/scale;
以下模型工作正常
execute
{
cp.param.timelimit=10;
}
using CP;
int nbKids=310;
float costBus40=500;
float costBus30=400;
int scale=100;
int num_Node = 13;
range Node = 1..num_Node;
dvar int+ scalenbBus40[Node];
dvar int+ scalenbBus30[Node];
dexpr float nbBus40[i in Node]=scalenbBus40[i]/scale;
dexpr float nbBus30[i in Node]=scalenbBus30[i]/scale;
minimize
sum (n in Node)(costBus40*nbBus40[n] + nbBus30[n]*costBus30);
subject to
{
forall (n in Node){
40*nbBus40[n]+nbBus30[n]*30>=nbKids;
}
}