Записать в файл: Ограничения и переменные Gurobi GRBModel в Java - PullRequest
0 голосов
/ 22 января 2020

Я рассматриваю некоторый код для целочисленной линейной программы, и он выполняется так, как ожидается (см. В конце вопроса). Теперь я ищу процедуру, которая позволит мне записать ILP в файл, чтобы человек мог прочитать его, например, в файле он должен прочитать что-то вроде следующего:

maximize x + y + 2 z
c0: x + 2 y + 3 z <= 4
c1: x + y >= 1
x binary
y binary
z binary

точный формат не имеет значения, мне просто нужно уметь его читать. Как мне этого добиться?

Код:

import gurobi.*;

public class Mip1 {
  public static void main(String[] args) {
  try {

  // Create empty environment, set options, and start
  GRBEnv env = new GRBEnv(true);
  env.set("logFile", "mip1.log");
  env.start();

  // Create empty model
  GRBModel  model = new GRBModel(env);

  // Create variables
  GRBVar x = model.addVar(0.0, 1.0, 0.0, GRB.BINARY, "x");
  GRBVar y = model.addVar(0.0, 1.0, 0.0, GRB.BINARY, "y");
  GRBVar z = model.addVar(0.0, 1.0, 0.0, GRB.BINARY, "z");

  // Set objective: maximize x + y + 2 z
  GRBLinExpr expr = new GRBLinExpr();
  expr.addTerm(1.0, x); expr.addTerm(1.0, y); expr.addTerm(2.0, z);
  model.setObjective(expr, GRB.MAXIMIZE);

  // Add constraint: x + 2 y + 3 z <= 4
  expr = new GRBLinExpr();
  expr.addTerm(1.0, x); expr.addTerm(2.0, y); expr.addTerm(3.0, z);
  model.addConstr(expr, GRB.LESS_EQUAL, 4.0, "c0");

  // Add constraint: x + y >= 1
  expr = new GRBLinExpr();
  expr.addTerm(1.0, x); expr.addTerm(1.0, y);
  model.addConstr(expr, GRB.GREATER_EQUAL, 1.0, "c1");

  // Optimize model
  model.optimize();

  // Dispose of model and environment
  model.dispose();
  env.dispose();

} catch (GRBException e) {
  System.out.println("Error code: " + e.getErrorCode() + ". " +
                     e.getMessage());
}
}
}

1 Ответ

0 голосов
/ 24 января 2020

Вы можете сделать это, записав свою модель в виде файла LP. Формат файла LP не стандартизирован для разных решателей, но в целом он близко соответствует описанному вами формату.

В API Gurobi Java мы можем записать модель в файл, используя GRBModel .write () метод. Например, если мы добавим model.write("mip1.lp"); непосредственно перед вызовом GRBModel.optimize(), Gurobi создаст файл mip1.lp со следующим содержимым:

\ LP format - for model browsing. Use MPS format to capture full model detail.
Maximize
  x + y + 2 z
Subject To
 c0: x + 2 y + 3 z <= 4
 c1: x + y >= 1
Bounds
Binaries
 x y z
End

Поскольку LP-файлы предназначены для чтения человеком, Gurobi может обрезать некоторые цифры при записи файла. Если вы хотите написать модель с использованием полной точности, вам следует использовать формат файла MPS (который не легко читается людьми).

Файл можно прочитать в объект GRBModel, используя имя файла модели в качестве второго аргумента в конструкторе GRBModel () . Например:

GRBModel model = new GRBModel(env, "mip1.lp");
...