1

저는 파이썬에서 PuLP 모듈을 사용하여 혼합 정수 프로그램을 공식화하고 있습니다. PuLP 인터페이스를 통해 MIP start (즉, 프로그램을 시작할 수있는 가능한 솔루션)을 설정하는 방법을 알아 보려고합니다. MIP start을 설정하는 방법에PuLP에서 Gurobi 솔버로 MIP 시작 (초기 솔루션)을 설정하는 방법은 무엇입니까?

세부 사항은 주어진

here 그리고 PuLP 패키지의 개발자는 here 아래에 붙여

두 개의 완벽한 모델입니다 당신이 PuLP 인터페이스를 통해 전체 Gurobi 모델에 액세스 할 수 있다고 주장한다. 나는 이것을 가능한 한 작게 만들었지 만, gurobi 솔버가 발견 적 방법을 사용하여 최적의 값을 찾지 못하도록 막았습니다.

두 모델 모두에서 최적의 값으로 초기 솔루션을 설정하려고 시도했지만 PuLP 모델에서는 무시되지만 gurobipy 모델에서는 예상대로 작동합니다.

PuLP 인터페이스를 통해 Gurobi 해결을위한 초기 솔루션을 어떻게 설정합니까?

Optimize a model with 3 rows, 4 columns and 12 nonzeros 
Coefficient statistics: 
    Matrix range [1e+00, 6e+00] 
    Objective range [3e+00, 9e+00] 
    Bounds range [0e+00, 0e+00] 
    RHS range  [2e+00, 3e+00] 
Found heuristic solution: objective 12 
Presolve removed 0 rows and 1 columns 
Presolve time: 0.00s 
Presolved: 3 rows, 3 columns, 9 nonzeros 
Variable types: 0 continuous, 3 integer (0 binary) 

Root relaxation: objective 7.400000e+00, 1 iterations, 0.00 seconds 

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

    0  0 7.40000 0 1 12.00000 7.40000 38.3%  - 0s 
H 0  0      8.0000000 7.40000 7.50%  - 0s 

Explored 0 nodes (1 simplex iterations) in 0.00 seconds 
Thread count was 8 (of 8 available processors) 

Optimal solution found (tolerance 1.00e-04) 
Best objective 8.000000000000e+00, best bound 8.000000000000e+00, gap 0.0% 
('Gurobi status=', 2) 
Status: Optimal 
x1 = 1.0 
x2 = 1.0 
x3 = -0.0 
x4 = -0.0 
OF = 8.0 

가 두 번째로 나는 gurobipy 모듈을 사용하여 동일한 모델을 구현할 수 있지만,이 경우 MIP 시작 실제로 사용됩니다 :

from pulp import * 

prob = LpProblem("min example",LpMinimize) 

x1=LpVariable("x1",0,None,LpInteger) 
x2=LpVariable("x2",0,None,LpInteger) 
x3=LpVariable("x3",0,None,LpInteger) 
x4=LpVariable("x4",0,None,LpInteger) 

# Objective function 
prob += 3*x1 + 5*x2 + 6*x3 + 9*x4 

# A constraint 
prob += -2*x1 + 6*x2 -3*x3 + 4*x4 >= 2, "Con1" 
prob += -5*x1 + 3*x2 + x3 + 3*x4 >= -2, "Con2" 
prob += 5*x1 - x2 + 4*x3 - 2*x4 >= 3, "Con3" 

# Choose solver, and set it to problem, and build the Gurobi model 
solver = pulp.GUROBI() 
prob.setSolver(solver) 
prob.solver.buildSolverModel(prob) 

# Attempt to set an initial feasible solution (in this case to an optimal solution) 
prob.solverModel.getVars()[0].start = 1 
prob.solverModel.getVars()[1].start = 1 
prob.solverModel.getVars()[2].start = 0 
prob.solverModel.getVars()[3].start = 0 

# Solve model 
prob.solve() 

# Status of the solution is printed to the screen 
print "Status:", LpStatus[prob.status] 

# Each of the variables is printed with it's resolved optimum value 
for v in prob.variables(): 
    print v.name, "=", v.varValue 

# Optimised objective function value is printed to the screen 
print "OF = ", value(prob.objective) 

반환

from gurobipy import * 

m = Model("min example") 
m.modelSense = GRB.MINIMIZE 

objFcnCoeffs = [3, 5, 6, 9] 
xVars = [] 
for i in range(4): 
    xVars.append(m.addVar(vtype=GRB.INTEGER, obj=objFcnCoeffs[i], name="Open%d" % i)) 

# Update model to integrate new variables 
m.update() 

# Constraints 
m.addConstr(-2*xVars[0] + 6*xVars[1] -3*xVars[2] + 4*xVars[3] >= 2, "Con1") 
m.addConstr(-5*xVars[0] + 3*xVars[1] + xVars[2] + 3*xVars[3] >= -2, "Con2") 
m.addConstr(5*xVars[0] - xVars[1] + 4*xVars[2] - 2*xVars[3] >= 3, "Con3") 


# Attempt to set an initial feasible solution (in this case to an optimal solution) 
startValues = [1, 1, 0, 0] 
for i in range(4): 
    xVars[i].start = startValues[i] 

# Solve model 
m.optimize() 

# Print solution 
print('\nTOTAL COSTS: %g' % m.objVal) 
for i in range(4): 
    print('\n xVar[%s] = %g' % i, xVars[i]) 

반환 :

Optimize a model with 3 rows, 4 columns and 12 nonzeros 
Coefficient statistics: 
    Matrix range [1e+00, 6e+00] 
    Objective range [3e+00, 9e+00] 
    Bounds range [0e+00, 0e+00] 
    RHS range  [2e+00, 3e+00] 
Found heuristic solution: objective 12 
Presolve removed 0 rows and 1 columns 
Presolve time: 0.00s 
Presolved: 3 rows, 3 columns, 9 nonzeros 

Loaded MIP start with objective 8 

Variable types: 0 continuous, 3 integer (0 binary) 

Root relaxation: infeasible, 0 iterations, 0.00 seconds 

Explored 0 nodes (0 simplex iterations) in 0.00 seconds 
Thread count was 8 (of 8 available processors) 

Optimal solution found (tolerance 1.00e-04) 
Best objective 8.000000000000e+00, best bound 8.000000000000e+00, gap 0.0% 

TOTAL COSTS: 8 

xVar[0] = 1 

xVar[1] = 1 

xVar[2] = 0 

xVar[3] = 0 

답변

4

prob.solverModel.getVars()[0].start = 1 

처럼 시작 값을 설정하고 당신이

prob.solver.callSolver(prob) 

를 호출하는 경우는,

prob.solve(). 

가 oritinal prob이 변경되지 않습니다이 호출 모델을 해결하는 구로비는 시작 벡터를 사용할 것입니다.

+0

이것은 완벽하게 감사합니다. 'pulp.pulp.LpProblem'과'gurobipy.Model' 클래스에 대한 나의 이해는 조금 제한적이라고 생각합니다. 어떤 문서라도 나에게 가르쳐 줄 수 있습니까? – kabdulla

+1

답변에 큰 감사드립니다. 펄프와 구로 비 사이의 상호 작용에 대해서는 잘 설명되어 있지 않지만 solvers.py에서 코드를 보면 모델이 만들어진 후 구로비 변수와 모델이 펄프 변수와 모델에 첨부되어 있음을 알 수 있습니다. 솔버 특유의 모델링을하고 있다면 30 분 정도 걸릴 것이고 펄프 모델을 gurobi로 바꿀 것을 권장합니다 (구문은 매우 비슷합니다). 스투 –