Java 从导入的cplex模型动态设置术语因子
假设我有一个优化模型Java 从导入的cplex模型动态设置术语因子,java,optimization,cplex,Java,Optimization,Cplex,假设我有一个优化模型abc.lp,我想用cplexjavaapi导入它。我使用:importModel函数()导入它。现在我想在约束或目标中改变一些决策变量的因子。例如,导入的模型abc.lp如下所示: 目标:最小化x1+x2 有没有一种简便的方法可以通过CPLEXAPI从导入的模型中动态设置因子 非常感谢 是的,这是可能的。至少对我来说,这不是很直观 下面是一个假设LP(线性目标和约束)的示例片段: //将模型从名为args[0]的文件读取到cplex优化器对象中 cplex.importMo
abc.lp
,我想用cplexjavaapi导入它。我使用:importModel
函数()导入它。现在我想在约束或目标中改变一些决策变量的因子。例如,导入的模型abc.lp
如下所示:
目标:最小化x1+x2
有没有一种简便的方法可以通过CPLEXAPI从导入的模型中动态设置因子
非常感谢 是的,这是可能的。至少对我来说,这不是很直观 下面是一个假设LP(线性目标和约束)的示例片段:
//将模型从名为args[0]的文件读取到cplex优化器对象中
cplex.importModel(args[0]);
//获取目标并修改它。
ILObObjective obj=cplex.getObjective();
IloLinearNumExpr objExpr=(IloLinearNumExpr)obj.getExpr();
ILOLinearNumeriterator iter=objExpr.lineartierator();
//循环线性目标并根据需要进行修改。
while(iter.hasNext()){
IloNumVar=iter.nextNumVar();
System.out.println(““+var+”的旧系数:“+iter.getValue()”);
//根据需要修改。
if(var.getName().equals(“x1”)){
iter设定值(42);
System.out.println(“新系数为“+var+”:“+iter.getValue()”);
}
}
//保存更改。
obj.setExpr(objExpr);
//假设存在一个LP矩阵。我们使用
//上面的importModel()保证至少
//一个。
IloLPMatrix lp=(IloLPMatrix)cplex.LPMatrixIterator().next();
for(int i=0;i
这里,我们正在寻找一个名为“x1”的变量。在目标和所有线性约束条件下,我们将其系数设置为42。
println
用于调试。我做得很快,所以一定要测试它。否则,您应该能够修改它以满足您的需要。希望有帮助。我的回答能解决你的问题吗?你认为还有什么需要解决的吗?
Constraint: <factor1>x1 + <factor2>x2 <= 40
public void(double factor1, double factor2){
...
cplexModel.import("path/to/abc.lp")
// Change parameters, how to do it?
// Read model from file with name args[0] into cplex optimizer object
cplex.importModel(args[0]);
// Get the objective and modify it.
IloObjective obj = cplex.getObjective();
IloLinearNumExpr objExpr = (IloLinearNumExpr) obj.getExpr();
IloLinearNumExprIterator iter = objExpr.linearIterator();
// Loop through the linear objective and modify, as necessary.
while (iter.hasNext()) {
IloNumVar var = iter.nextNumVar();
System.out.println("Old coefficient for " + var + ": " + iter.getValue());
// Modify as needed.
if ( var.getName().equals("x1") ) {
iter.setValue(42);
System.out.println("New coefficient for " + var + ": " + iter.getValue());
}
}
// Save the changes.
obj.setExpr(objExpr);
// Assumes that there is an LP Matrix. The fact that we used
// importModel() above guarantees that there will be at least
// one.
IloLPMatrix lp = (IloLPMatrix) cplex.LPMatrixIterator().next();
for (int i = 0; i < lp.getNrows(); i++) {
IloRange range = lp.getRange(i);
System.out.println("Constraint " + range.getName());
IloLinearNumExpr conExpr = (IloLinearNumExpr) range.getExpr();
IloLinearNumExprIterator conIter = conExpr.linearIterator();
// Loop through the linear constraints and modify, as necessary.
while (conIter.hasNext()) {
IloNumVar var = conIter.nextNumVar();
System.out.println("Coefficient for " + var + ": " + conIter.getValue());
// Modify as needed (as above).
if ( var.getName().equals("x1") ) {
conIter.setValue(42);
System.out.println("New coefficient for " + var + ": " + conIter.getValue());
}
}
// Save changes (as above).
range.setExpr(conExpr);
}
cplex.exportModel("modified.lp");
// Solve the model and display the solution if one was found
if ( cplex.solve() ) {
// do something here.
}