Python数模笔记-Scipy库(1)线性规划问题



  Scipy 是 Python默认安装的标准库,可以用于最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号和图像处理、常微分方程的求解。


欢迎关注 [Youcans 原创系列](https://www.jianshu.com/u/5df8372991c5),数模笔记每周更新

Python数模笔记-PuLP线性规划
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn机器学习
Python数模笔记-NetworkX图论
Python数模笔记-模拟退火算法



1、最优化问题建模

最优化问题的三要素是决策变量、目标函数和约束条件。

(1)分析影响结果的因素是什么,确定决策变量
(2)决策变量与优化目标的关系是什么,确定目标函数
(3)决策变量所受的限制条件是什么,确定约束条件

最优化问题的建模,通常按照以下步骤进行:

(1)问题定义,确定决策变量、目标函数和约束条件;
(2)模型构建,由问题描述建立数学方程,并转化为标准形式的数学模型;
(3)模型求解,用标准模型的优化算法对模型求解,得到优化结果;
(4)模型检验,统计检验和灵敏度分析。



2、线性规划

线性规划(Linear programming),是研究线性约束条件下线性目标函数的极值问题的优化方法,常用于解决利用现有的资源得到最优决策的问题。
  线性规划模型的一般形式如下:

min  fx = c1*x1 + ...+ cn*xn
  s.t. a11*x1+...+a1n*Xn ≤ b1
    ...
    am1*x1+...+amn*Xn ≤ bm
    x1≥0,...,xn≥0

其中:fx 是目标函数,求最小值;x1,...xn 是决策变量;aij, bi 是不等式约束的参数。



3、Scipy 求解线性规划

Python 的 SciPy 库带有用于解决线性编程问题的 linprog 函数。
  linporg 函数对于线性规划模型的描述为:

min fx = C'*X fx 是目标函数
  s.t. A_ub*X <= B_ub 不等式约束
    A_eq*X = B_eq 等式约束
    lb <= X <= ub 取值范围

其中:

fx 是目标函数,求最小值;
X 是决策变量,向量;
C 是目标函数的参数向量;
A_ub 是不等式约束的参数矩阵,B_ub 是不等式约束的参数向量;
A_eq 是等式约束的参数矩阵,B_eq 是等式约束的参数向量;
lb,ub 是参数向量,(lb,ub) 是 X 的取值范围。

注意:
  (1)问题表示为:求 fx 的最小值,如果问题要求 fx 的最大值则要通过 fx‘= -fx 将问题转化为求 fx' 的最小值;
  (2)不等式约束条件表示为:小于等于,如果约束条件为大于等于则要通过不等式两侧乘以 -1 将约束条件转化为小于等于的形式。
linporg 函数求解线性规划问题的输出参数为:

con: 等式约束的残差(名义上为 0),B_eq - A_eqX
fun: 目标函数的当前值(最小值),C'X
message: 算法状态描述
nit: 当前迭代次数
slack: 不等式约束的松弛值,B_ub - A_ub
X
status: 算法退出时的状态,0:优化完成,1:达到最大迭代次数,2:不可行,3:不收敛,4:数值困难
success: 当算法成功完成时为 True
x: 当前解,向量



4 实例

4.1 问题模型:

    max     fx = 2*x1 + 3*x2 - 5*x3
    s.t.    x1 + x2 + x3 = 7
            2*x1 - 5*x2 + x3 >= 10
            x1 + 3*x2 + x3 <= 12
            x1, x2, x3 >=0

4.2 模型转换:

首先要将求解问题的模型转化为 Linprog 的标准形式:

(1)求最大值问题要转换为求最小值问题:C = [-2, 3, 5]
(2)当约束条件为 大于等于 时要加负号:A_ub = [[-2, 5, -1], [1, 3, 1]]
(3)由 x1,x2,x3>=0 和 x1+x2+x3=7 可知:0 <= x1,x2,x3 <= 7

4.3 python 程序:

import numpy as np  # 导入 numpy
from scipy.optimize import linprog  # 导入 scipy

c = np.array([-2, -3, 5])
A_ub = np.array([[-2, 5, -1], [1, 3, 1]])  # 不等式约束参数矩阵
B_ub = np.array([-10, 12])  # 不等式约束参数向量
A_eq = np.array([[1, 1, 1]])  # 等式约束参数矩阵
B_eq = np.array([7])  # 等式约束参数向量
x1 = (0, 7)  # x1 的取值范围,lb1 < x1 < ub1
x2 = (0, 7)  # x2 的取值范围,lb2 < x2 < ub2
x3 = (0, 7)  # x3 的取值范围,lb3 < x3 < ub3
res = linprog(c, A_ub, B_ub, A_eq, B_eq, bounds=(x1, x2, x3))
print(res)

4.4 运行结果:

     con: array([1.19830306e-08])
     fun: -14.57142854231215
 message: 'Optimization terminated successfully.'
     nit: 5
   slack: array([-3.70231543e-08,  3.85714287e+00])
  status: 0
 success: True
       x: array([6.42857141e+00, 5.71428573e-01, 9.82192085e-10])


版权说明:
YouCans 原创作品
Copyright 2021 YouCans, XUPT
Crated:2021-04-28


欢迎关注 [Youcans 原创系列](https://www.jianshu.com/u/5df8372991c5),数模笔记每周更新

Python数模笔记-PuLP线性规划
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn机器学习
Python数模笔记-NetworkX图论
Python数模笔记-模拟退火算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容