使用Java+CPLEX求解优化模型时遇UnsupportedOperationException问题求助
CPLEX Java 建模错误解决方案:UnsupportedOperationException: CpxRange for general expressions
问题背景
- 开发环境:eclipse-java-2022-03-R-win32-x86_64
- 工具:Java + CPLEX
- 优化模型:
目标函数:min (x_1x_4(x_1+x_2+x_3)+x_4)
约束条件:- (x_1x_2x_3x_4 \geq 25)
- (x_1^2 + x_2^2 + x_3^2 + x_4^2 = 40)
- (1 \leq x_1,x_2,x_3,x_4 \leq 5)
运行代码后抛出错误:
Exception in thread "main" java.lang.UnsupportedOperationException: CpxRange for general expressions at ilog.cplex.CpxRange.<init>(CpxRange.java:1335) at ilog.cplex.IloCplexModeler.addRange(IloCplexModeler.java:2716) at ilog.cplex.IloCplexModeler.addEq(IloCplexModeler.java:2781) at ms.bb4.main(bb4.java:24)
错误原因
- 线性表达式误用:代码中用
IloLinearNumExpr定义线性表达式c,但目标函数包含乘积项属于非线性表达式,CPLEX不允许通过addEq将非线性表达式赋值给线性表达式。 - 目标函数添加逻辑错误:不需要通过
addEq绑定目标表达式,直接将非线性表达式传入addMinimize即可。
修正后的代码
public class bb4 { public static void main(String args[]) { try { IloCplex cplex = new IloCplex(); IloNumVar x1 = cplex.numVar(1, 5, "x1"); IloNumVar x2 = cplex.numVar(1, 5, "x2"); IloNumVar x3 = cplex.numVar(1, 5, "x3"); IloNumVar x4 = cplex.numVar(1, 5, "x4"); // 直接构建非线性目标表达式并添加最小化目标 IloNumExpr objective = cplex.sum(x4, cplex.prod(x1, x4, cplex.sum(x1, x2, x3))); cplex.addMinimize(objective); // 添加约束条件 cplex.addGe(cplex.prod(x1, x2, x3, x4), 25); cplex.addEq(cplex.sum(cplex.square(x1), cplex.square(x2), cplex.square(x3), cplex.square(x4)), 40); // 求解并输出结果 if (cplex.solve()) { System.out.println("目标函数值: " + cplex.getObjValue()); System.out.println("x1 = " + cplex.getValue(x1)); System.out.println("x2 = " + cplex.getValue(x2)); System.out.println("x3 = " + cplex.getValue(x3)); System.out.println("x4 = " + cplex.getValue(x4)); } else { System.out.println("模型无解"); } cplex.end(); } catch (IloException exc) { exc.printStackTrace(); } } }
关键修正点
- 用
IloNumExpr替代IloLinearNumExpr,后者仅支持线性表达式,前者可承载非线性运算。 - 删除错误的
addEq绑定操作,直接将目标表达式传入addMinimize。 - 添加求解逻辑与结果输出,方便验证模型运行状态。
- 调用
cplex.end()释放CPLEX资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Nada ALainiah
相关产品推荐
相关产品推荐

