Python使用scipy简单求解线性规划问题

在运筹学中,对于线性规划问题的求解,人工计算通常使用「单纯形法」。利用一个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.2x13x2+2x31531x1+x2+5x320x1,x2,x30

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 是唯一的,我们可以与自己人工计算的结果进行比较(程序会有一定的浮点数误差)。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值