用 scipy.optimize.linprog 实现线性规划

1 概述

线性规划:在线性等式和不等式约束下最小化线性目标函数。
线性编程可解决以下形式的问题:

min{\quad}c^Tx

\begin{aligned}
{s.t.}{\quad}A_{ub}x≤b_{ub} \\
A_{eq}x=b_{eq} \\
l≤x≤u
\end{aligned}

也就是说求解使得 c^Tx 最小的x,同时x又要符合约束条件。
其中x是决策变量的向量;cb_{ub}b_{eq}lu是向量;A_{ub}A_{eq}是矩阵。

2 实例

2.1 问题

要最小化 Z=0.4X_1+0.5X_2,约束如下:

\begin{aligned}
0.3x_1+0.1x_2≤2.7 \\
0.5x_1+0.5x_2=6 \\
0.6x_1+0.4x_2≥6 \\
x_1,x_2≥0
\end{aligned}

2.2 求解

这里我们使用scipy中的linprog进行求解,其用法如下:

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确定边界,如x≥0为(0,None),x无约束则为(None,None),method是求解器的类型,’simplex’ 为单纯形法,其他的参数暂时可忽略。
要使用linprog,目标函数要变成求最小值,如果原题目要求求max(最大值),只需对目标函数取负,但要注意求解的最终值是取负后的目标函数的最小值,取负即为最大值。

最终分析如下:

python代码:

import numpy as np
from scipy.optimize import linprog

c = np.array([0.4, 0.5])
A_ub = np.array([[0.3, 0.1], [-0.6, -0.4]])  # 不等式约束
b_ub = np.array([2.7, -6])
A_eq = np.array([[0.5, 0.5]])                # 等式约束
b_eq = np.array([6])
r = linprog(c, A_ub, b_ub, A_eq, b_eq, bounds=((0, None), (0, None)))
print(r)

运行结果:
con: array([9.3865955e-09])
fun: 5.2499999910145405
message: ‘Optimization terminated successfully.’
nit: 5
slack: array([2.67959077e-09, 2.99999992e-01])
status: 0
success: True
x: array([7.5 , 4.49999999])

fun 为目标函数的最优值,slack 为松弛变量,status 表示优化结果状态,x 为最优解。
此模型的求解结果为:当 x1=7.5,x2=4.49999999 时,函数取得最小值5.2499999910145405

参考

https://www.pianshen.com/article/39912031011/
https://www.freesion.com/article/98311054345/
https://blog.csdn.net/weixin_43638511/article/details/104236557

原文:https://www.cnblogs.com/MorStar/p/14967794.html

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权,转载请注明出处。
文章名称:《用 scipy.optimize.linprog 实现线性规划》
文章来自:泰恩数据
文章链接:https://tyne.cc/668.html
本站资源仅供个人学习使用,请勿用于商业用途。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址