2016-09-14 5 views
1

Предположим, у меня есть OptimizationModel abc.lp, который я хочу импортировать с помощью CPlex java-API. Я использую: importModel функция (click), чтобы импортировать его. Теперь я хочу изменить некоторые факторы переменной принятия решения в ограничении или цели. Например импортируемая модель abc.lp выглядит следующим образом:Устанавливать динамические термины из импортированного cplex-модели

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

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

Для меня factor1 и factor2 входные параметры функции. Так я получаю:

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 предназначены для отладки. Я сделал это быстро, поэтому убедитесь, что вы его протестировали. В противном случае вы сможете изменить это в соответствии с вашими потребностями. Надеюсь, это поможет.