将模型信息添加到 Gurobi 日志

Add model information to the Gurobi log

我在 Python 中使用 Gurobi。我在一组节点上迭代,在每次迭代中,我都添加了一个约束来解决。求解后产生Gurobi日志如下:

Optimize a model with 6 rows, 36 columns and 41 nonzeros
Variable types: 0 continuous, 36 integer (36 binary)
Coefficient statistics:
  Matrix range     [1e+00, 1e+00]
  Objective range  [2e+01, 9e+01]
  Bounds range     [1e+00, 1e+00]
  RHS range        [2e+00, 2e+00]

MIP start did not produce a new incumbent solution
MIP start violates constraint R5 by 2.000000000

Found heuristic solution: objective 347.281
Presolve removed 2 rows and 21 columns
Presolve time: 0.00s
Presolved: 4 rows, 15 columns, 27 nonzeros
Found heuristic solution: objective 336.2791955
Variable types: 0 continuous, 15 integer (15 binary)

Root relaxation: objective 3.043757e+02, 6 iterations, 0.00 seconds

    Nodes    |    Current Node    |     Objective Bounds      |     Work
 Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time

*    0     0               0     304.3757488  304.37575  0.00%     -    0s

Explored 0 nodes (6 simplex iterations) in 0.02 seconds
Thread count was 4 (of 4 available processors)

Solution count 3: 304.376 336.279 339.43 

Optimal solution found (tolerance 1.00e-04)
Best objective 3.043757488224e+02, best bound 3.043757488224e+02, gap 0.0000%

但是在一定的迭代之后,我的答案不是我所期望的。所以我希望在每个 iteration.How 时在 Gurobi 日志中打印我所有的模型详细信息(objective 函数、约束等)我可以这样做吗?

但是 model.write() 打印 objective 函数和我们编码的约束。

    Minimize
  0 x(0,0) + 75.47184905645283 x(0,1) + 57.55866572463264 x(0,2)
   + 33.97057550292606 x(0,3) + 23.3238075793812 x(0,4)
   + 40.80441152620633 x(0,5) + 75.47184905645283 x(1,0) + 0 x(1,1)
   + 32.7566787083184 x(1,2) + 90.60905032059435 x(1,3)
   + 55.71355310873648 x(1,4) + 40.60788100849391 x(1,5)
   + 57.55866572463264 x(2,0) + 32.7566787083184 x(2,1) + 0 x(2,2)
   + 83.36066218546971 x(2,3) + 46.57252408878007 x(2,4)
   + 41.4004830889689 x(2,5) + 33.97057550292606 x(3,0)
   + 90.60905032059435 x(3,1) + 83.36066218546971 x(3,2) + 0 x(3,3)
   + 37.12142238654117 x(3,4) + 50.00999900019995 x(3,5)
   + 23.3238075793812 x(4,0) + 55.71355310873648 x(4,1)
   + 46.57252408878007 x(4,2) + 37.12142238654117 x(4,3) + 0 x(4,4)
   + 17.69180601295413 x(4,5) + 40.80441152620633 x(5,0)
   + 40.60788100849391 x(5,1) + 41.4004830889689 x(5,2)
   + 50.00999900019995 x(5,3) + 17.69180601295413 x(5,4) + 0 x(5,5)
Subject To
 R0: x(0,1) + x(0,2) + x(0,3) + x(0,4) + x(0,5) >= 2
 R1: x(1,0) + x(1,2) + x(1,3) + x(1,4) + x(1,5) >= 2
 R2: x(1,0) + x(1,3) + x(1,4) + x(2,0) + x(2,3) + x(2,4) + x(5,0) + 
     x(5,3)+ x(5,4) >= 2
 R3: x(3,0) + x(3,1) + x(3,2) + x(3,4) + x(3,5) >= 2
 R4: x(0,1) + x(0,2) + x(0,5) + x(3,1) + x(3,2) + x(3,5) + x(4,1) + 
     x(4,2)+ x(4,5) >= 2
 R5: x(0,1) + x(0,2) + x(3,1) + x(3,2) + x(4,1) + x(4,2) + x(5,1) + 
     x(5,2)>= 2
Bounds
Binaries
 x(0,0) x(0,1) x(0,2) x(0,3) x(0,4) x(0,5) x(1,0) x(1,1) x(1,2) x(1,3)
 x(1,4) x(1,5) x(2,0) x(2,1) x(2,2) x(2,3) x(2,4) x(2,5) x(3,0) x(3,1)
 x(3,2) x(3,3) x(3,4) x(3,5) x(4,0) x(4,1) x(4,2) x(4,3) x(4,4) x(4,5)
 x(5,0) x(5,1) x(5,2) x(5,3) x(5,4) x(5,5)
End

我需要做的是了解每次迭代发生了什么。那是因为一次迭代给了我另一个错误的答案,所以我想检查在求解时是否有任何冗余约束添加到模型中。

换句话说,“Gurobi callbacks”是否允许我们访问模型中可用的所有信息?它会产生什么?

In other words, does "Gurobi callbacks" allow us to access all information that is available in the model? What will it produce?

不,您不能打印在回调函数中生成的约束。

最有可能的问题是以下之一:

  1. 您在回调中调用了错误的函数。您可以添加两种约束:惰性约束和用户削减。结构需要惰性约束;解决方案必须满足所有惰性约束。但是,当惰性约束太多而无法添加到模型中时,您可以使用惰性约束,而您只想添加那些被违反的约束。用户削减不是必需的,但它们可以帮助移除分数解并收紧 MIP 的 LP 松弛。在你的情况下,听起来你有惰性约束。

  2. 您没有添加所有违反的惰性约束。如前所述 in the documentation:“你的回调应该准备好切断违反任何的解决方案 你的惰性约束,包括那些已经 添加。”你不应该跟踪你是否已经添加了惰性约束;你必须在每次看到它被违反时添加它。这是由于 Gurobi 求解器的并行处理。