从Pulp和Linprog获得不同的结果

时间:2020-07-03 01:10:36

标签: python scipy linear-programming pulp

我是线性编程的新手,同时尝试了Pulp和(SciPy)Linprog。每个给我不同的结果。

我认为可能是因为Linprog使用的是内部点方法,而Pulp可能使用的是单纯形?如果是这样,是否有办法让Pulp产生与Linprog相同的结果?

import pulp
from pulp import *
from scipy.optimize import linprog

# Pulp

# Upper bounds
r = {1: 11, 2: 11, 3: 7, 4: 11, 5: 7}

# Create the model
model = LpProblem(name="small-problem", sense=LpMaximize)

# Define the decision variables
x = {i: LpVariable(name=f"x{i}", lowBound=0, upBound=r[i]) for i in range(1, 6)}

# Add constraints
model += (lpSum(x.values()) <= 35, "headroom")

# Set the objective
model += lpSum([7 * x[1], 7 * x[2], 11 * x[3], 7 * x[4], 11 * x[5]])

# Solve the optimization problem
status = model.solve()

# Get the results
print(f"status: {model.status}, {LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")

for var in x.values():
    print(f"{var.name}: {var.value()}")

for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")

# linprog

c = [-7, -7, -11, -7, -11]
bounds = [(0, 11), (0, 11), (0, 7), (0, 11), (0, 7)]
A_ub = [[1, 1, 1, 1, 1]]
B_ub = [[35]]
res = linprog(c, A_ub=A_ub, b_ub=B_ub, bounds=bounds)
print(res)

上面代码的输出:

status: 1, Optimal
objective: 301.0
x1: 10.0
x2: 0.0
x3: 7.0
x4: 11.0
x5: 7.0
headroom: 0.0
     con: array([], dtype=float64)
     fun: -300.9999999581466
 message: 'Optimization terminated successfully.'
     nit: 4
   slack: array([4.60956784e-09])
  status: 0
 success: True
       x: array([7., 7., 7., 7., 7.])

奖金问题:在给定一些约束的情况下,我如何表达要最大化x [i]值的问题?以上,我试图最大化x [i]的总和,但想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

正如@Erwin Kalvelagen在评论中指出的那样,并非所有LP都有独特的解决方案。在您的情况下,您有两组变量{x1, x2, x4}{x3, x5},它们在所有情况下的系数都相同。

在您的情况下,最好使用x3, x5的最大可能值,并且约束中朝35可用的值将在x1, x2, x4之间任意分配(因为这对目标没有影响)。

请注意,您的果肉溶液是basic solution,而稀溶液不是。是的,这可能是因为两者使用不同的算法来解决问题。