CPLEX代码报错:无法将range类型用于int类型问题咨询
CPLEX错误"cannot use type range for int"修复方案
问题根源
- 数组索引错误:直接用range类型的
n作为数组下标(如y[n]),CPLEX要求通过循环逐个访问数组元素,不能用范围类型直接索引。 - 目标函数不合法:
minimize y[n]中y[n]是整个数组,必须明确最小化的具体表达式(比如元素总和、单个元素等)。 - 约束语法错误:
5<=x[n]<=20未遍历数组元素,需用forall语句为每个x[i]设置约束。
修正后的代码(简洁版)
range n=1..4; int m[n]=[1,2,3,4]; int c[n]=[5,6,7,8]; dvar float x[n]; // 直接在目标函数中计算并最小化y的总和,无需单独定义y数组 minimize sum(i in n) (m[i]*x[i]+c[i]); subject to { // 为每个x[i]设置上下界 forall(i in n) 5<=x[i]<=20; }
保留y数组的版本
如果需要单独定义y数组存储计算结果,可使用循环赋值:
range n=1..4; int m[n]=[1,2,3,4]; int c[n]=[5,6,7,8]; float y[n]; dvar float x[n]; execute { // 循环遍历每个索引,逐个赋值y[i] for(var i in n) { y[i] = m[i]*x[i] + c[i]; } } // 最小化y数组所有元素的总和(可根据需求修改为单个元素) minimize sum(i in n) y[i]; subject to { forall(i in n) 5<=x[i]<=20; }
内容的提问来源于stack exchange,提问作者haripriya
相关产品推荐
相关产品推荐

