python在线性规划中的应用

27 篇文章 5 订阅
5 篇文章 0 订阅

Python学习

从入门学习到机器学习、从简单绘制折线图到随机绘制各种图,附往期目录:

python入门基础知识
python绘制简单的折线图
python读取excel中数据并绘制多子图多组图在一张画布上
python绘制带误差棒的柱状图
python绘制多子图并单独显示
python读取excel数据并绘制多y轴图像
Python批量调整Word文档中的字体、段落间距及格式
python绘制带误差棒的柱状图


从本篇博文开始,开启学习一些优化算法和求解方法


线性规划的定义

提示:这里可以添加本文要记录的大概内容:

线性规划(Linear Programming 简记LP)来源于工业生产组织管理的决策问题,数学上它用来确定多变量线性函数在变量满足线性约束条件下的最优值,模型通常由三个要素—决策变量、目标函数和约束条件构成。


线性规划的一般模型:
m a x ( m i n ) z = ∑ j = 1 n c i x i ; max(min) z = \sum_{j=1}^{n} c_{i}x_{i}; max(min)z=j=1ncixi;

s . t . { ∑ j = 1 n a i j x j ≤ ( ≥ , = ) b i , i = 1 , 2 , 3 , 4 , ⋅ ⋅ ⋅ , m    x j > 0 , j = 1 , 2 , 3 , 4 , ⋅ ⋅ ⋅ , n s.t. \begin{cases} \sum\limits_{j=1}^na_{ij}x_{j}≤(≥,=)b_{i}, & i=1,2,3,4,···,m \\\\\ \ x_{j}>0,& j=1,2,3,4,···,n \\ \end{cases} s.t. j=1naijxj(,=)bi,  xj>0,i=1,2,3,4,⋅⋅⋅,mj=1,2,3,4,⋅⋅⋅,n
基于模型来看,线性规划的目标函数可以是最大化问题,也可以是最小化问题;约束条件有的是“≥ ”,有的是“≤ ”,也可以是“= ”。

一、线性规划的解

当线性规划问题有最优解时,一定可以在可行域的某个顶点上取到值,当有唯一解时,最优解就是可行域的某个顶点。当有无穷多个最优解时,其中至少有一个解是可行域的一个顶点。

二、线性规划的python求解

SciPy的scipy.optimize模块提供了一个求解线性规划的函数linprog,函数集中了求解线性规划的常用算法,如单纯形法和内点法,会根据问题的规模或用户的指定选择算法进行求解。

1、引入库

from scipy.optimize import linprog

2、SciPy中线性规划的标准型

m i n   z = c T x ; min \ z = c^{T} x; min z=cTx;

s . t . {   A ⋅ x ≤ b A e q ⋅ x = b e q   L b ≤ U b s.t. \begin{cases} \ A·x≤b \\ Aeq·x=beq \\ \ L_{b}≤U_{b} \\ \end{cases} s.t.  AxbAeqx=beq LbUb
其中,c对应于上述标准型中的目标向量,
A、b对应于不等号约束,Aeq、beq对应于等号约束,
bounds是决策向量的下界向量和上界向量所组成的 n个元素的元组bounds的默认取值下界都是0,上界都是∞ ;
返回值res.x是求得的最优解,res.fun是目标函数的最优值。
对应函数的调用模式:

#linprog的基本调用格式为:
from scipy.optimize import linprog
res=linprog(c, A, b, Aeq, beq)  #默认每个决策变量下界为0,上界为 
res=linprog(c, A=None, b=None, Aeq=None, beq=None, bounds=None, method='simplex') 
print(res.fun)   #显示目标函数最小值
print(res.x)     #显示最优解

3、训练案例1

m i n   z = − x 1 + 4 x 2 ; min \ z = -x_{1}+4x_{2}; min z=x1+4x2;
s . t . {   − 3 x 1 + x 2 ≤ 6 x 1 + 2 x 2 ≤ 4   x 2 ≥ − 3 s.t. \begin{cases} \ -3x_{1}+x_{2} ≤6 \\ x_{1}+2x_{2} ≤4 \\ \ x_{2}≥-3 \\ \end{cases} s.t.  3x1+x26x1+2x24 x23

代码如下(示例):

from scipy.optimize import linprog
c = [-1, 4]; 
A = [[-3, 1], [1, 2]]
b = [6, 4]; 
#bounds是决策向量的下界向量和上界向量所组成的 n个元素的元组bounds的默认取值下界都是0,上界都是∞ 
bound=((None,None),(-3,None))

res=linprog(c,A,b,None,None,bound)
print("目标函数的最小值:",res.fun)
print("最优解为:",res.x)
#运行结果: 目标函数的最小值: -22.0
# 最优解为: [10. -3.]

4、训练案例2

m a x   z = x 1 − 2 x 2 − 3 x 3 ; max\ z = x_{1}-2x_{2}-3x_{3}; max z=x12x23x3;
s . t . {   − 2 x 1 + x 2 + x 3 ≤ 9 − 3 x 1 + x 2 + 2 x 3 ≥ 4 4 x 1 − 2 x 2 x 3 = − 6   x 1 ≥ − 10 , x 2 ≥ 0 s.t. \begin{cases} \ -2x_{1}+x_{2} +x_{3} ≤9 \\ -3x_{1}+x_{2} +2x_{3} ≥4\\ 4x_{1}-2x_{2} x_{3}=-6\\ \ x_{1}≥-10, x_{2}≥0\\ \end{cases} s.t.  2x1+x2+x393x1+x2+2x344x12x2x3=6 x110,x20

4.1求解过程

(1)首先化成SciPy中的标准型
m i n   z = − x 1 + 2 x 2 + 3 x 3 ; min\ z = -x_{1}+2x_{2}+3x_{3}; min z=x1+2x2+3x3;
s . t . {   − 2 x 1 + x 2 + x 3 ≤ 9 3 x 1 − x 2 − 2 x 3 ≤ − 4 4 x 1 − 2 x 2 x 3 = − 6   x 1 ≥ − 10 , x 2 ≥ 0 s.t. \begin{cases} \ -2x_{1}+x_{2} +x_{3} ≤9 \\ 3x_{1}-x_{2} -2x_{3} ≤-4\\ 4x_{1}-2x_{2} x_{3}=-6\\ \ x_{1}≥-10, x_{2}≥0\\ \end{cases} s.t.  2x1+x2+x393x1x22x344x12x2x3=6 x110,x20

from scipy.optimize import linprog
c=[-1, 2, 3]; 

A = [[-2, 1, 1], [3, -1, -2]]
b=[[9], [-4]]

Aeq=[[4, -2, -1]]
beq=[-6]
LB=[-10, 0, None]

UB=[None]*len(c)  #生成3个None的列表
bound = tuple(zip(LB, UB))   #生成决策向量界限的元组
res=linprog(c,A,b,Aeq,beq,bound)
print("目标函数的最小值:",res.fun)
print("最优解为:",res.x)

# 求解结果:目标函数的最小值: 0.399999999999999
# 最优解为: [-1.6  0.  -0.4]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

群智能算法小狂人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值