为什么我在线性规划问题中得到不同的结果使用纸浆

问题描述

我使用pulp库在python中编写了一些代码,以解决线性问题。但是,如果将 y 变量的名称更改为 s 或 r 并重新运行程序,则会得到不同的结果。不同的结果是指正在打印的变量 x1,x2 ... x10 和 y1...y10 。但是最小值保持不变,为 36650。

代码如下:

from pulp import LpMaximize,LpProblem,LpStatus,lpSum,LpVariable,LpMinimize

model = LpProblem(name="resource",sense=LpMinimize)

x = {i: LpVariable(name=f"x{i}",lowBound=0) for i in range(1,11)}
y = {i: LpVariable(name=f"y{i}",11)}

model += (x[1] + 50 - y[1] >= 100,"x1")
model += (x[2] + y[1] - y[2] >= 200,"x2")
model += (x[3] + y[2] - y[3] >= 150,"x3")
model += (x[4] + y[3] - y[4] >= 400,"x4")
model += (x[5] + y[4] - y[5] >= 300,"x5")
model += (x[6] + y[5] - y[6] >= 400,"x6")
model += (x[7] + y[6] - y[7] >= 150,"x7")
model += (x[8] + y[7] - y[8] >= 150,"x8")
model += (x[9] + y[8] - y[9] >= 200,"x9")
model += (x[10] + y[9] - y[10] >= 250,"x10")
model += (0 <= x[1] <= 400,"ti")
model += (0 <= x[2] <= 500,"tii")
model += (0 <= x[3] <= 300,"tiii")
model += (0 <= x[4] <= 400,"tiv")
model += (0 <= x[5] <= 400,"tv")
model += (0 <= x[6] <= 300,"tvi")
model += (0 <= x[7] <= 300,"tvii")
model += (0 <= x[8] <= 500,"tviii")
model += (0 <= x[9] <= 500,"tix")
model += (0 <= x[10] <= 300,"tx")

model += 13*x[1] + 15*x[2] + 17*x[3] + 19*x[4] + 17*x[5] + 18*x[6] + 14*x[7] + 12*x[8] + 14*x[9] + 15*x[10] + 2*y[1] + 2*y[2] + 2*y[3] + 2*y[4] + 2*y[5] + 2*y[6] + 2*y[7] + 2*y[8] + 2*y[9] + 2*y[10]

status = model.solve()

print(f"The minimal total cost is: {model.objective.value()}")

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

完整的结果可以在下面看到

Results comparison

解决方法

考虑下面的例子

>>> x = pulp.LpVariable('x',3,pulp.LpInteger)
>>> y = pulp.LpVariable('y',pulp.LpInteger)
>>> prob = pulp.LpProblem('example',pulp.LpMaximize)
>>> prob += x+y  
>>> prob += x+y <= 3

最优值是 3,但有几个 (x,y) 对导致这个最优值,即 (3,0),(2,1),(1,2),(0,3)