如何使用Gurobi来解决这个优化问题?

How to use Gurobi to solve this optimization problem?

问题如下:

object:min z
s.t.
 r1 >= 0 
 r2 >= 0
 r3 >= 0 
 r1 + r2 + r3 = 1
 15 * (1 - r1) <= z
 12 * (1 - r2) <= z
 12 * (1 - r3) <= z
 240 * r1 <= z
 27 * r2 <= z
 27 * r3 <= z

或者像这样的格式:

object:
 min z; z = max( 15 * (1 - r1), 12 * (1 - r2), 12 * (1 - r3) ,240 * r1, 27 * r2, 27 * r3)
s.t.
 r1 >= 0 
 r2 >= 0
 r3 >= 0 
 r1 + r2 + r3 = 1

这个问题出自一篇论文,在这篇论文中,作者使用了Gurobi来解决这个问题。我下载了 Gurobi 并研究了 LP 示例,但该示例的对象类似于 min x + y + 2 z。 我想知道这个问题能不能用Guribo解决,如果能,模型怎么写。 非常感谢。

我应该承认我不是 java 的忠实粉丝,这是我第一次使用 Gurobi 的 Java 界面,因此它可能不是最优雅的解决方案。无论如何,这是在 Java:

中建模和解决您的问题的方法
// example.java
import gurobi.*;

public class example {
  public static void main(String[] args) {
    try {
      GRBEnv    env   = new GRBEnv("example.log");
      GRBModel  model = new GRBModel(env);

      // Create variables
      GRBVar r1 = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "r1");
      GRBVar r2 = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "r2");
      GRBVar r3 = model.addVar(0.0, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "r3");
      GRBVar z = model.addVar(-GRB.INFINITY, GRB.INFINITY, 1.0, GRB.CONTINUOUS, "z");

      // Set objective: minimize z
      GRBLinExpr expr = new GRBLinExpr();
      expr.addTerm(1.0, z);
      model.setObjective(expr, GRB.MINIMIZE);

      // Add constraint: r1 + r2 + r3 = 1
      expr = new GRBLinExpr();
      expr.addTerm(1.0, r1); expr.addTerm(1.0, r2); expr.addTerm(1.0, r3);
      model.addConstr(expr, GRB.EQUAL, 1.0, "c0");

      // Add constraint: 15 * (1-r1) <= z  <-> -15 r1 - z <= -15
      expr = new GRBLinExpr();
      expr.addTerm(-15.0, r1); expr.addTerm(-1.0, z);
      model.addConstr(expr, GRB.LESS_EQUAL, -15.0, "c1");

      // Add constraint: 12 * (1-r2) <= z  <-> -12 r2 - z <= -12
      expr = new GRBLinExpr();
      expr.addTerm(-12.0, r2); expr.addTerm(-1.0, z);
      model.addConstr(expr, GRB.LESS_EQUAL, -12.0, "c1");

      // Add constraint: 12 * (1-r3) <= z  <-> -12 r3 - z <= -12
      expr = new GRBLinExpr();
      expr.addTerm(-12.0, r3); expr.addTerm(-1.0, z);
      model.addConstr(expr, GRB.LESS_EQUAL, -12.0, "c1");

      // Add constraint: 240 r1 <= z  <-> 240 r1 - z <= 0
      expr = new GRBLinExpr();
      expr.addTerm(240.0, r1); expr.addTerm(-1.0, z);
      model.addConstr(expr, GRB.LESS_EQUAL, 0.0, "c1");

      // Add constraint: 27 r2 <= z  <-> 27 r2 - z <= 0
      expr = new GRBLinExpr();
      expr.addTerm(27.0, r2); expr.addTerm(-1.0, z);
      model.addConstr(expr, GRB.LESS_EQUAL, 0.0, "c1");

      // Add constraint: 27 r3 <= z  <-> 27 r3 - z <= 0
      expr = new GRBLinExpr();
      expr.addTerm(27.0, r3); expr.addTerm(-1.0, z);
      model.addConstr(expr, GRB.LESS_EQUAL, 0.0, "c1");

      // Optimize model
      model.write("model.lp");
      model.optimize();

      System.out.println(r1.get(GRB.StringAttr.VarName)
                         + " " +r1.get(GRB.DoubleAttr.X));
      System.out.println(r2.get(GRB.StringAttr.VarName)
                         + " " +r2.get(GRB.DoubleAttr.X));
      System.out.println(r3.get(GRB.StringAttr.VarName)
                         + " " +r3.get(GRB.DoubleAttr.X));

      System.out.println("Obj: " + model.get(GRB.DoubleAttr.ObjVal));

      // Dispose of model and environment

      model.dispose();
      env.dispose();

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

这还将创建一个 model.lp 文件,其中包含您的 LP:

Minimize
    obj: z
Subject To
    c0: r1 + r2 + r3 = 1
    c1: -15 r1 - z <= -15
    c2: -12 r2 - z <= -12
    c3: -12 r3 - z <= -12
    c4: 240 r1 - z <= 0
    c5: 27 r2 - z <= 0
    c6: 27 r3 - z <= 0
Bounds
    r1 >= 0
    r2 >= 0
    r3 >= 0
End

这么小的问题我建议直接把你的LP写成这样model file. Then you can solve it from the command line via Gurobi's command line tool:

gurobi_cl ResultFile=model.sol model.lp 

其中 model.sol 是包含解决方案的文件。

请注意,对于这样一个简单的 LP,您不需要使用 Gurobi。有一些很好的非商业求解器( lp_solve or GLPK 例如)可以轻松解决这个问题。使用 GLPK,您可以通过

解决它
glpsol --cpxlp model.lp -o solution.txt

从命令行。 --cpxlp 标志告诉 glpk model.lp 以 cplex 格式写入,而 -o solution.txt 告诉 glpk 将解决方案写入文件 solution.txt.