我是线性编程的新手,同时尝试了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]的总和,但想知道是否有更好的方法。
答案 0 :(得分:0)
正如@Erwin Kalvelagen在评论中指出的那样,并非所有LP都有独特的解决方案。在您的情况下,您有两组变量{x1, x2, x4}
和{x3, x5}
,它们在所有情况下的系数都相同。
在您的情况下,最好使用x3, x5
的最大可能值,并且约束中朝35可用的值将在x1, x2, x4
之间任意分配(因为这对目标没有影响)。
请注意,您的果肉溶液是basic solution,而稀溶液不是。是的,这可能是因为两者使用不同的算法来解决问题。