2016-09-14 21 views
1

假設我有一個OptimizationModel abc.lp,我想用CPlex java-API導入它。我使用:importModel函數(click)來導入它。現在我想在約束或目標中改變一些決策變量的因素。例如導入模型abc.lp如下所示:從導入的cplex-Model動態設置術語因子

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動態地設置因子?

非常感謝!

+0

我的答案能解決你的問題嗎?你覺得還有什麼需要解決的嗎? – rkersh

回答

1

是的,這是可能的。這不是很直觀,至少對我來說。

下面是一個例子片斷,它假設一個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用於調試。我很快就做到了這一點,所以一定要測試一下。否則,您應該可以修改它以滿足您的需求。希望有所幫助。