如何修正CPLEX主程序中的增量约束?解决lloNumVar类型错误
问题修正方案
错误根源
setCoef()方法要求第二个参数必须是决策变量(lloNumVar类型),但你代码里传的thisOplModel.Nchannels/thisOplModel.adj_beams[i]是数值计算结果(常数),不是变量,所以触发类型不匹配错误。
修正方法(两种可选)
方法一:直接在约束块中定义(推荐,更简洁)
既然你的目标是实现beam_nomusedchannel[i] >= ceil(Nchannels/adj_beams[i]),直接把约束写在subject to块里即可,不用在主程序里动态修改空约束:
subject to { forall ( i in beams) ctEmpty: beam_nomusedchannel[i] >= ceil(Nchannels/adj_beams[i]); } main { cplex.solve(); thisOplModel.postProcess(); }
方法二:主程序中动态构建约束(如果必须用动态方式)
如果一定要在主程序里动态添加约束,不要用setCoef处理常数项,而是把常数移到约束右侧,或者用addGe方法直接创建约束:
subject to { // 无需预定义空约束,直接在主程序创建 } main { for(i in thisOplModel.beams) { // 计算右侧常数项 var rhs = ceil(thisOplModel.Nchannels / thisOplModel.adj_beams[i]); // 创建约束:beam_nomusedchannel[i] >= rhs var newCt = thisOplModel.cplex.addGe(thisOplModel.beam_nomusedchannel[i], rhs); // 给约束命名方便调试 newCt.setName("ctEmpty_" + i); } cplex.solve(); thisOplModel.postProcess(); }
额外说明
- 如果业务不需要取整,直接去掉
ceil()函数即可。 - 原代码里预定义
0<=0的空约束完全没必要,直接定义正确约束或动态创建更高效。
内容的提问来源于stack exchange,提问作者MO MO MA
相关产品推荐
相关产品推荐

