java - 从导入的 cplex 模型动态设置项因子

标签 java optimization cplex

假设我有一个 OptimizationModel abc.lp ,我想使用 CPlex java-API 导入。我用:importModel函数(click)来导入它。现在我想改变约束或目标中的一些决策变量因素。例如导入的模型abc.lp看起来如下:

Objective: Minimize <factor1>x1 + <factor2>x2

Constraint: <factor1>x1 + <factor2>x2 <= 40

对我来说factor1factor2是函数的输入参数。所以我得到:

public void(double factor1, double factor2){
...
cplexModel.import("path/to/abc.lp")
// Change parameters, how to do it?

是否有一种方便的方法可以使用 CPLEX-API 从导入的模型动态设置因子?

非常感谢!

最佳答案

是的,这是可能的。这不是很直观,至少对我来说是这样。

下面是一个假设 LP(线性目标和约束)的示例片段:

 // 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.
} 

在这里,我们正在寻找一个名为“x1”的变量。我们在目标和所有线性约束中将其系数设置为 42。 println 用于调试。我做的很快,所以一定要测试一下。否则,您应该能够修改它以满足您的需要。希望有帮助。

关于java - 从导入的 cplex 模型动态设置项因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39495861/

相关文章:

java - Eclipse 崩溃后在 Tomcat 下运行 Java 项目的问题

javascript - 查找幂集的加权子集和的最大值

c - 两个决策变量的最小值

c++ - 我正在寻找一种在从模型中删除并重新添加修改后的对象后操作 iloextractable 对象的方法

java - 关于eclipse中src文件夹的问题

java - 错误java.lang.OutOfMemoryError:超出了GC开销限制

java - 如何使用spring boot连接oracle数据库

html - 如何清理 DotNetNuke 页面以便在移动设备上查看?

optimization - 差分进化算法中交叉的重要性是什么?

java - 使用什么来避免 Cplex Java 多目标模型中的过度补偿?