You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:55:07