저는 파이썬에서 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
이것은 완벽하게 감사합니다. 'pulp.pulp.LpProblem'과'gurobipy.Model' 클래스에 대한 나의 이해는 조금 제한적이라고 생각합니다. 어떤 문서라도 나에게 가르쳐 줄 수 있습니까? – kabdulla
답변에 큰 감사드립니다. 펄프와 구로 비 사이의 상호 작용에 대해서는 잘 설명되어 있지 않지만 solvers.py에서 코드를 보면 모델이 만들어진 후 구로비 변수와 모델이 펄프 변수와 모델에 첨부되어 있음을 알 수 있습니다. 솔버 특유의 모델링을하고 있다면 30 분 정도 걸릴 것이고 펄프 모델을 gurobi로 바꿀 것을 권장합니다 (구문은 매우 비슷합니다). 스투 –