CPLEX Java多目标优化中staticLex方法参数不匹配问题求解
多目标字典序优化代码错误解决
问题背景
我需要融合两个目标函数f1和f2,其中c为连续变量,C_{ug}为二进制变量,a、d、f为参数。在Eclipse中使用CPLEX Studio IDE 22.1.0的Java版本编写代码后,调用IloCplex.staticLex(objective, secobj )时出现错误:
the method staticLex(IloNumExpr, String) in the type IloCplex is not applicable for the arguments (IloLinearNumExpr, IloLinearNumExpr)
错误原因
你调用的IloCplex.staticLex()方法重载不匹配。当前传入两个IloLinearNumExpr参数,但该方法没有对应的重载;其支持的重载要么是单个表达式加优先级字符串,要么是传入目标表达式数组来实现多目标字典序优化。
解决方法
- 将f1和f2两个目标表达式存入
IloNumExpr类型的数组中 - 调用
IloCplex.staticLex(IloNumExpr[] objectives)生成字典序组合目标 - 通过
cplex.setObjective()将组合目标设置到CPLEX模型中
修正后的代码
// 创建目标函数f1 IloLinearNumExpr firstPart = cplex.linearNumExpr(); int aSum = 0; for (int k = 0; k < inst.n + inst.m; k++) { firstPart.addTerm(1, c[k]); aSum += -inst.a[k]; } firstPart.setConstant(aSum); IloLinearNumExpr secondPart = cplex.linearNumExpr(); for (int k = 0; k < inst.n + inst.m; k++) { // 等价于 z[k] = max(c[k] - d[k], 0) cplex.addEq(z[k], cplex.max(0, cplex.sum(c[k], -inst.d[k]))); secondPart.addTerm(inst.f[k], z[k]); } IloLinearNumExpr objective = cplex.linearNumExpr(); objective.add(firstPart); objective.add(secondPart); // 创建目标函数f2 IloLinearNumExpr secobj = cplex.linearNumExpr(); for (int tt = 0; tt < inst.T; tt++) { for (int k = 0; k < inst.q; k++) { for (int j = 0; j < inst.B; j++) { secobj.addTerm(1, C[j][k]); } } } // 修正:使用数组传入多目标,调用正确的staticLex重载 IloNumExpr[] objectives = new IloNumExpr[]{objective, secobj}; cplex.setObjective(IloCplex.staticLex(objectives));
内容的提问来源于stack exchange,提问作者MARWA
相关产品推荐
相关产品推荐

