如何在非线性问题中定义浮点变量。该浮点变量适用于每个节点,节点总数为 13

问题描述 投票:0回答:1

我必须为 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 类型范围。

optimization opl
1个回答
0
投票
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;
}     
}
© www.soinside.com 2019 - 2024. All rights reserved.