2016-09-14 9 views
1

私はCPlex java-APIでインポートするOptimizationModel abc.lpを持っているとしましょう。私はそれを使用する:importModel関数(click)をインポートします。さて、私は、制約内または目的において、いくつかの決定変数の要因を変更したいと思います。たとえば、次のようにインポートされたモデルabc.lpに見えます:私factor1factor2についてはインポートされたcplexから動的に期間要素を設定するモデル

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

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

は、関数の入力パラメータです。だから私は得る:

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はデバッグ用です。私はこれをすばやくやったので、必ずテストしてください。それ以外の場合は、ニーズに合わせて変更する必要があります。希望が役立ちます。

関連する問題