在运筹学中,对于线性规划问题的求解,人工计算通常使用「单纯形法」。利用一个Python程序可以帮我们检查计算结果的正确性。
例:
max Z = x 1 + 2 x 2 + x 3 s . t . { 2 x 1 − 3 x 2 + 2 x 3 ≤ 15 1 3 x 1 + x 2 + 5 x 3 ≤ 20 x 1 , x 2 , x 3 ≥ 0 \max Z = x_1 + 2x_2 + x_3 \\s.t.\begin{cases}2x_1-3x_2+2x_3\leq15 \\ \dfrac 1 3x_1 + x_2 + 5x_3 \leq 20 \\ x_1, x_2, x_3 \geq 0 \end{cases} maxZ=x1+2x2+x3s.t.⎩⎪⎪⎨⎪⎪⎧2x1−3x2+2x3≤1531x1+x2+5x3≤20x1,x2,x3≥0
import numpy as np
from scipy import optimize as op
# 决策变量的取值范围,默认为(0, None(+inf)),需要更改的情况作为linprog的bounds参数传入
# bounds = (
# (0, None), # x1
# (0, None), # x2
# (0, None) # x3
# )
# 目标函数Z的系数向量c,默认求最小值(minZ),乘以-1求解最大值
c = -1 * np.array([1, 2, 1])
# 约束条件的不等式(等式传入A_eq和b_eq参数)系数矩阵
A_ub = np.array([
[2, -3, 2],
[1/3, 1, 5]
])
b_ub = np.array([15, 20])
# 问题求解
res = op.linprog(c=c, A_ub=A, b_ub=b)
print('Z* =', -res['fun'])
print(res['x'])
运行结果:
Z* = 48.333333331578594
[2.50000000e+01 1.16666667e+01 1.19224771e-11]
线性规划问题的解可能不唯一,但目标函数的最优解 Z 是唯一的,我们可以与自己人工计算的结果进行比较(程序会有一定的浮点数误差)。