Java 向数组列表中添加约束时出现的问题
我正在学习使用Java API对优化问题进行编码,在将以下简单LP的最后一个约束保存到名为Java 向数组列表中添加约束时出现的问题,java,cplex,Java,Cplex,我正在学习使用Java API对优化问题进行编码,在将以下简单LP的最后一个约束保存到名为constraints的数组列表中时遇到了一个问题。如果没有这些,代码就会运行,但是,当我激活这行代码时,会弹出一个错误:Constraints.add(model.addEq(proportalweight[j],y)) 而不是以下行: model.addEq(比例重量[j],y) MWE: 导入ilog.concert.*; 导入ilog.cplex。*; 导入java.util.*; 公共类Simpl
constraints
的数组列表中时遇到了一个问题。如果没有这些,代码就会运行,但是,当我激活这行代码时,会弹出一个错误:Constraints.add(model.addEq(proportalweight[j],y))代码>
而不是以下行:
model.addEq(比例重量[j],y)代码>
MWE:
导入ilog.concert.*;
导入ilog.cplex。*;
导入java.util.*;
公共类SimpleLP{
公共静态void main(字符串[]args){
Solve();
}
公共静态void Solve(){
int n=4;
int m=3;
双[]p={310.0380.0350.0285.0};
双[]v={480.0650.0580.0390.0};
双[]a={18.0,15.0,23.0,12.0};
双[]c={10.0,16.0,8.0};
双[]V={6800.08700.05300.0};
试一试{
IloCplex模型=新的IloCplex();
IloNumVar[][]x=新的IloNumVar[n][];
对于(int i=0;i
如果有人能帮我解决这个问题,我将不胜感激。
问候,
Bahman我应该使用model.diff(比例重量[j],y),0.0),而不是.addEq() 出现了什么错误?什么是约束?嗨,Jokster,错误:线程“main”java.lang中的异常。错误:未解决的编译问题:类型列表中的方法add(IloRange)不适用于SimpleLP.Solve(SimpleLP.java:69)和SimpleLP.main(SimpleLP.java:8)中的参数(IloConstraint) .................................................................................................... 约束被认为是将线性不等式和性质存储为一个数组。我对这个问题有异议:Constraints.add(model.addEq(proportalweight[j],y));其中y是一个决策变量。ThanksAlso,error:“add”-类型列表中的方法add(IloRange)不适用于参数(IloConstraint),例如,如果我将“y”更改为数组,如V[j],则错误将被消除。我认为IloRange和add方法不能保存y,因为它是一个决策变量。但是,我不知道如何将这个约束保存到数组lis约束中。这个问题是交叉发布的。
import ilog.concert.*;
import ilog.cplex.*;
import java.util.*;
public class SimpleLP {
public static void main(String[] args) {
Solve();
}
public static void Solve() {
int n = 4;
int m = 3;
double[] p = { 310.0, 380.0, 350.0, 285.0 };
double[] v = { 480.0, 650.0, 580.0, 390.0 };
double[] a = { 18.0, 15.0, 23.0, 12.0 };
double[] c = { 10.0, 16.0, 8.0 };
double[] V = { 6800.0, 8700.0, 5300.0 };
try {
IloCplex model = new IloCplex();
IloNumVar[][] x = new IloNumVar[n][];
for (int i = 0; i < n; i++) {
x[i] = model.numVarArray(m, 0, Double.MAX_VALUE);
}
IloNumVar y = model.numVar(0, Double.MAX_VALUE);
IloLinearNumExpr obj = model.linearNumExpr();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
obj.addTerm(p[i], x[i][j]);
}
}
model.addMaximize(obj);
for (int i = 0; i < n; i++) {
model.addLe(model.sum(x[i]), a[i]);
}
List<IloRange> Constraints = new ArrayList<IloRange>();
IloLinearNumExpr [] usedWeightCap = new IloLinearNumExpr[m];
IloLinearNumExpr [] usedVolumeCap = new IloLinearNumExpr[m];
IloLinearNumExpr [] proportionalWeight = new IloLinearNumExpr[m];
for (int j = 0; j < m; j++) {
usedWeightCap[j] = model.linearNumExpr();
usedVolumeCap[j] = model.linearNumExpr();
proportionalWeight[j] = model.linearNumExpr();
for (int i = 0; i < n; i++) {
usedWeightCap[j].addTerm(1.0, x[i][j]);
usedVolumeCap[j].addTerm(v[i], x[i][j]);
proportionalWeight[j].addTerm(1/c[j], x[i][j]);
}
}
for (int j = 0; j < m; j++) {
Constraints.add(model.addLe(usedWeightCap[j], c[j]));
Constraints.add(model.addLe(usedVolumeCap[j], V[j]));
//model.addEq(model.prod(1/c[j], usedWeightCap[j]), y);
//Constraints.add(model.addEq(proportionalWeight[j], y)); /*This is my problem that I cannot add this constraint into the list*/
model.addEq(proportionalWeight[j], y);
}
if (model.solve()) {
System.out.println("Objective Value: "+ model.getObjValue());
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
System.out.println("x*["+(i+1)+"]"+"["+(j+1)+"] : "+model.getValue(x[i][j]));
}
}
System.out.println("y* : "+ model.getValue(y));
} else {
System.out.println("Problem not solved :(");
}
model.end();
} catch (IloException ex) {
ex.printStackTrace();
}
}
}