【python数据分析】用scipy.optimize.linprog实现线性规划

本文详细介绍使用scipy.optimize.linprog进行线性规划求解的方法,包括求最小值和最大值的问题转换技巧,并通过两个实例演示如何在Python中实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为近期要参加一个建模比赛,没有安装MATLAB,所以熟悉下算法的python实现,本篇为用scipy.optimize.linprog线性规划。

函数文档参考scipy.optimize.linprog — SciPy v1.8.0 Manual 

线性规划主要解决下面这种问题:

\underset{x}{min} c^{T}x \\ s.t. \begin{cases} & \ Ax\leq b\\ & \ Aeq\cdot x=beq \\ & \ lb \leq x \leq ub \end{cases}(第一次用LaTex,公式做的不好看,不是这样要转化一下,如求最大值)

scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)

其中,c是价值向量;A_ub和b_ub对应线性不等式约束;A_eq和b_eq对应线性等式约束;bounds对应公式中的lb和ub,决策向量的下界和上界;method是求解器的类型,如单纯形法;其他的参数暂时不用。

例题1:

min f=-1\times x_{0} + 4\times x_{1}\\ s.t.\begin{cases} & -3\times x_{0} +1\times x_{1} \leq 6 \\ & 1\times x_{0} + 2\times x_{1} \leq 4 \\ & x_{1} \geq -3 \end{cases}

用scipy.optimize.linprog计算

from scipy.optimize import linprog
C = [-1,4] 
A = [[-3,1],[1,2]]
b = [6,4]
X0_bounds = [None,None]
X1_bounds = [-3,None]
res = linprog(C,A,b,bounds=(X0_bounds,X1_bounds))
print(res)
     fun: -22.0
 message: 'Optimization terminated successfully.'
     nit: 1
   slack: array([39.,  0.])
  status: 0
 success: True
       x: array([10., -3.])

最优解为-22,x0=10,x1=-3.

例题2:

如果是求最大值

max f=-1\times x_{0} + 4\times x_{1}\\ s.t.\begin{cases} & -3\times x_{0} +1\times x_{1} \leq 6 \\ & 1\times x_{0} + 2\times x_{1} \leq 4 \\ & x_{1} \geq -3 \end{cases}

我们转化为

min -f=1\times x_{0} + -4\times x_{1}\\ s.t.\begin{cases} & -3\times x_{0} +1\times x_{1} \leq 6 \\ & 1\times x_{0} + 2\times x_{1} \leq 4 \\ & x_{1} \geq -3 \end{cases}

用scipy.optimize.linprog计算

from scipy.optimize import linprog
C = [1,-4] 
A = [[-3,1],[1,2]]
b = [6,4]
X0_bounds = [None,None]
X1_bounds = [-3,None]
res = linprog(C,A,b,bounds=(X0_bounds,X1_bounds))
print(res)
     fun: -11.428571428571429
 message: 'Optimization terminated successfully.'
     nit: 2
   slack: array([0., 0.])
  status: 0
 success: True
       x: array([-1.14285714,  2.57142857])

最优解为11.428571428571429,x0=-1.14285714,x1=2.57142857。

单纯形法是解决线性规划问题的经典迭代算法,而Pythonscipy库为求解这类问题提供了强大的工具。为了掌握如何使用scipy.optimize.linprog函数来求解线性规划问题,并通过单纯形法得到最优解,建议阅读以下资源:《线性规划与单纯形法:Python实现解析》。这本资料详细讲解了单纯形法的基本原理和步骤,并结合Python代码进行了实践解析,非常适合想要深入理解算法并应用于编程实践的读者。 参考资源链接:[线性规划与单纯形法:Python实现解析](https://wenku.csdn.net/doc/6401acbdcce7214c316ecf5d?spm=1055.2569.3001.10343) 在使用scipy.optimize.linprog函数时,你需要定义目标函数的系数、约束矩阵、约束边界以及指定变量的非负性。函数将自动执行单纯形法,从一个可行的基解开始迭代,直到找到最优解。具体步骤如下: 1. **定义目标函数和约束**:首先,你需要定义你的线性规划问题,包括目标函数的系数、不等式和等式约束以及约束的边界值。 2. **调用函数**:使用scipy.optimize.linprog函数求解线性规划问题。你需要指定目标函数的系数、约束矩阵A和向量b(不等式约束),以及约束的类型(不等号的方向和等式约束)。 3. **检查结果**:函数返回一个包含最优解、目标函数值和返回状态的数组。如果返回状态为0,则表示算法成功找到了最优解。 4. **处理特殊情况**:如果问题无解或无界,则需要根据返回的状态码进行相应的处理。 通过阅读《线性规划与单纯形法:Python实现解析》,你将能够更好地理解算法的每一步,并通过实际的Python代码示例加深理解。在你掌握了scipy.optimize.linprog函数的使用和单纯形法的原理后,你可以尝试解决更复杂的问题,或者继续探索scipy库中的其他优化工具,进一步提升你在数学优化领域的技能。 参考资源链接:[线性规划与单纯形法:Python实现解析](https://wenku.csdn.net/doc/6401acbdcce7214c316ecf5d?spm=1055.2569.3001.10343)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个甜甜的大橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值