代码之家  ›  专栏  ›  技术社区  ›  ccc

将模型信息添加到Gurobi日志

  •  0
  • ccc  · 技术社区  · 7 年前

    我在Python中使用了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%
    

    但经过一定的迭代,我的答案并不是我所期望的。因此,我希望在每次迭代时将我的所有模型细节(目标函数、约束等)打印在Gurobi日志中。我该怎么做?

        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 “允许我们访问模型中可用的所有信息?它将产生什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Greg Glockner    7 年前

    换句话说,“古罗比回调”是否允许我们访问所有 模型中可用的信息?它将生产什么?

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

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

    2. 您没有添加所有违反的惰性约束。如前所述 in the documentation 你的懒惰约束,包括那些已经