Java调用CPLEX时数组线性表达式相加的实现问题咨询
解决Java CPLEX中线性表达式相加的问题
我一眼就看出问题出在你调用U[i].addTerm(cplex.sum(A[i],B[i]))的地方——IloLinearIntExpr.addTerm()方法是用来添加单个变量和对应系数的,它的参数要求是(double coef, IloIntVar var),但你传入的cplex.sum(A[i], B[i])是一个IloIntExpr类型的完整表达式,类型完全不匹配,这就是报错的核心原因。
下面给你两种可行的解决方案:
方案1:用IloLinearIntExpr.add()合并表达式
IloLinearIntExpr类自带add()方法,可以直接把另一个线性表达式的所有项合并到当前表达式中,完美适配你的需求。修改后的代码如下:
IloLinearIntExpr[] U = new IloLinearIntExpr[n]; IloLinearIntExpr[] A = new IloLinearIntExpr[n]; IloLinearIntExpr[] B = new IloLinearIntExpr[n]; for(int i = 0; i < n; i++){ U[i] = cplex.linearIntExpr(); A[i] = cplex.linearIntExpr(); B[i] = cplex.linearIntExpr(); } for(int i = 0; i < n; i++){ B[i].addTerm(1, P(X)); // 假设P(X)是IloIntVar类型 B[i].addTerm(1, C(Y)); // 假设C(Y)是IloIntVar类型 A[i].addTerm(X, 1); // 假设X是IloIntVar类型 // 用add方法将A[i]和B[i]的所有项合并到U[i]中 U[i].add(A[i]); U[i].add(B[i]); cplex.addMaximize(U[i]); }
方案2:直接用cplex.sum()创建目标表达式
如果你不需要单独保留U[i]作为IloLinearIntExpr类型,还可以直接用CPLEX的sum()方法生成合并后的表达式,简化代码结构:
IloLinearIntExpr[] A = new IloLinearIntExpr[n]; IloLinearIntExpr[] B = new IloLinearIntExpr[n]; for(int i = 0; i < n; i++){ A[i] = cplex.linearIntExpr(); B[i] = cplex.linearIntExpr(); } for(int i = 0; i < n; i++){ B[i].addTerm(1, P(X)); B[i].addTerm(1, C(Y)); A[i].addTerm(X, 1); // 直接生成合并后的表达式作为目标函数 IloIntExpr U_i = cplex.sum(A[i], B[i]); cplex.addMaximize(U_i); }
最后额外提醒一句:如果n大于1,你当前的代码会添加n个最大化目标函数,这在CPLEX默认的单目标优化模式下是不允许的。如果你的需求是多目标优化,需要改用CPLEX的多目标API(比如cplex.addMultiObjective());如果是误操作,记得确认自己实际只需要一个目标函数哦。
内容的提问来源于stack exchange,提问作者Ibrahem
相关产品推荐
相关产品推荐

