如何在OPL CPLEX非线性问题中为13个节点定义浮点变量?
OPL CPLEX非线性优化报错解决方案:Cannot use type range for int
错误原因分析
出现Cannot use type range for int报错,是因为定义浮点变量的dexpr语句中,直接对整个数组范围scalenbBus40[Node]做除法运算,OPL不支持这种批量操作,必须针对数组的每个元素单独计算。另外目标函数里还有一处语法错误:nbBus30*costBus30[n]混淆了变量和参数的维度,costBus30是全局单值变量,不是数组。
修正后的代码
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[n in Node] = scalenbBus40[n]/scale; dexpr float nbBus30[n in Node] = scalenbBus30[n]/scale; minimize sum (n in Node)(costBus40*nbBus40[n] + nbBus30[n]*costBus30); // 修正costBus30的调用方式 subject to { forall (n in Node){ 40*nbBus40[n]+nbBus30[n]*30>=nbKids; } }
关键修改点
- dexpr定义修正:通过
[n in Node]遍历每个节点,对数组的单个元素scalenbBus40[n]做除法,生成对应的浮点变量nbBus40[n] - 目标函数修正:将
nbBus30*costBus30[n]改为nbBus30[n]*costBus30,匹配变量和参数的维度
内容的提问来源于stack exchange,提问作者Vandana Kumari
相关产品推荐
相关产品推荐

