Python数模笔记-Scipy库线性规划问题
Posted youcans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数模笔记-Scipy库线性规划问题相关的知识,希望对你有一定的参考价值。
1、最优化问题建模
最优化问题的三要素是决策变量、目标函数和约束条件。
(1)分析影响结果的因素是什么,确定决策变量
(2)决策变量与优化目标的关系是什么,确定目标函数
(3)决策变量所受的限制条件是什么,确定约束条件
最优化问题的建模,通常按照以下步骤进行:
(1)问题定义,确定决策变量、目标函数和约束条件;
(2)模型构建,由问题描述建立数学方程,并转化为标准形式的数学模型;
(3)模型求解,用标准模型的优化算法对模型求解,得到优化结果;
(4)模型检验,统计检验和灵敏度分析。
欢迎关注 Youcans 原创系列,每周更新数模笔记
Python数模笔记-PuLP库
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn
Python数模笔记-NetworkX
Python数模笔记-模拟退火算法
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_ubX
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 原创系列,每周更新数模笔记
Python数模笔记-PuLP库(1)线性规划入门
Python数模笔记-PuLP库(2)线性规划进阶
Python数模笔记-PuLP库(3)线性规划实例
Python数模笔记-StatsModels 统计回归(1)简介
Python数模笔记-StatsModels 统计回归(2)线性回归
Python数模笔记-StatsModels 统计回归(3)模型数据的准备
Python数模笔记-StatsModels 统计回归(4)可视化
Python数模笔记-Sklearn (1)介绍
Python数模笔记-Sklearn (2)聚类分析
Python数模笔记-Sklearn (3)主成分分析
Python数模笔记-Sklearn (4)线性回归
Python数模笔记-Sklearn (5)支持向量机
Python数模笔记-模拟退火算法(1)多变量函数优化
Python数模笔记-模拟退火算法(2)约束条件的处理
Python数模笔记-模拟退火算法(3)整数规划问题
Python数模笔记-模拟退火算法(4)旅行商问题
Python数模笔记-NetworkX(1)图的操作
Python数模笔记-NetworkX(2)最短路径
Python数模笔记-NetworkX(3)条件最短路径
以上是关于Python数模笔记-Scipy库线性规划问题的主要内容,如果未能解决你的问题,请参考以下文章