CPLEX C++(Concert)目标函数中使用CEIL函数报错如何解决
CPLEX C++(Concert) 环境ceil函数调用失败解决方案
失败原因
ILOG OPL环境原生支持ceil函数,但C++ Concert环境下不能直接调用C++标准库的ceil()处理决策变量:标准库ceil()仅支持float、double等原生数值类型,无法识别Concert的建模对象(如IloNumVar、IloExpr),因此会执行失败。
实现方案
- 方案1:调用Concert原生
IloCeil函数
Concert库已经封装了适配建模表达式的向上取整方法,直接替换标准库ceil即可,代码示例如下:
注意:IloExpr TO(env); // env为你初始化的IloEnv环境对象 for (int i=0; i<I; i++){ for (int j=0; j<J; j++){ TO += IloCeil(DecisionVariable[i][j]/parameter[j]); } } // 后续将TO作为目标函数传入模型即可IloCeil返回整数类型表达式,需要模型开启整数规划支持才能正常求解。 - 方案2:手动线性化实现向上取整逻辑
若遇到CPLEX版本不兼容IloCeil的场景,可以通过引入辅助整数变量加约束的方式实现等价逻辑:- 定义辅助整数变量
IloIntVar2D aux(env, I, J, 0, IloInfinity); - 为每组i,j添加以下两组约束:
aux[i][j] >= DecisionVariable[i][j] / parameter[j]
aux[i][j] <= DecisionVariable[i][j] / parameter[j] + 1 - 1e-6- 将aux变量累加到目标函数TO中即可,此时aux[i][j]和
ceil(DecisionVariable[i][j]/parameter[j])完全等价。
- 定义辅助整数变量
注意事项
- 如果parameter[j]是决策变量而非固定参数,需要先对除法逻辑做线性化处理,再配套上述取整方案。
- 所有针对决策变量的运算都要使用Concert库提供的算子,不要直接调用标准库的数值处理函数。
内容的提问来源于stack exchange,提问作者Lizard White
相关产品推荐
相关产品推荐

