当前位置: 首页 > news >正文

【Python】线性规划模型(笔记)

线性规划的作用

求一个线性目标函数在线性可行域内的最值问题

线性规划的典型应用

  • 配送运输问题:选大车还是小车
  • 生产规划问题:每种原料各买多少
  • 几何切割问题:切割长宽各多少
  • 买卖利润问题:最多能挣多少钱

线性规划的本质

问题是线性的
约束是线性的

线性代数基本概念

线性代数基本概念:向量

向量的基本运算:
![[Pasted image 20240814153235.png]]

向量的集合:矩阵
这里不细讲了,忘了就复习线性代数

运用Python进行矩阵运算

  1. 首先导入numpy库
import numpy as np
  1. 使用np.array创建矩阵
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[1,2],[3,4],[5,6]])
c = np.array([[1,2,3]])
d = np.array([[9,8,7],[3,2,1]])
  1. 矩阵加法和数乘
sum = a + b #加法
e = 3 * a #数乘
  1. 使用np.dot进行矩阵相乘
e = np.dot(a, b)
  1. 元素乘(要求行列一致)
e = a * d
  1. 矩阵转置
e = c.T
  1. 使用np.linalg.inv求逆
result = np.linalg.inv(e)
  1. 使用np.linalg.det求行列式
reslut = np.linalg.det(e)
  1. 使用np.linalg.matrix_rank求矩阵的秩
e = np.linalg.matrix_rank(d)

运用Python求解一次方程组

例如:
{ 10 x − y − 2 z = 72 − x + 10 y − 2 z = 83 − x − y + 5 z = 42 ) \left\{\begin{aligned} 10 x-y-2 z= & 72 \\ -x+10 y-2 z= & 83 \\ -x-y+5 z= & 42 \end{aligned}\right) 10xy2z=x+10y2z=xy+5z=728342

解法:
x = A − 1 b x=A^{-1} b x=A1b

求数值解:使用numpy库

import numpy as np  A = np.array([[10, -1, -2], [-1, 10, -2], [-1, -1, 5]])  # A为系数矩阵  
b = np.array([72, 83, 42])  # b为常数列  
inv_A = np.linalg.inv(A)  # 求A的逆矩阵  
x = inv_A.dot(b)  # A的逆矩阵点乘b  
x = np.linalg.solve(A, b)  # 5,6行可用本行替代  
print(x)

结果:[11. 12. 13.]

我们还可以使用sympy库求符号解或数值解:

from sympy import symbols, Eq, solve  x, y, z = symbols('x y z')  
# 直接写入方程形式
eqs = [Eq(10 * x - y - 2 * z, 72),  Eq(-x + 10 * y - 2 * z, 83),  Eq(-x - y + 5 * z, 42)]  
print(solve(eqs, [x, y, z]))

结果:{x: 11, y: 12, z: 13}

从矩阵角度思考线性规划的标准形式

  1. 不等式组条件矩阵化
  2. 方程组条件矩阵化
  3. 写出变量自身的取值范围
  4. 把目标函数向量化
  5. 求极值

用程序做线性规划问题时的规范形式:
min ⁡ x c T x s.t.  { A x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b \begin{aligned} & \min _x c^T x \\ & \text { s.t. }\left\{\begin{array}{l} A x \leq b \\ A e q \cdot x=b e q \\ l b \leq x \leq u b \end{array}\right. \end{aligned} xmincTx s.t.  AxbAeqx=beqlbxub

  1. 求一个线性函数的极小值
  2. 不等式约束一定是小于等于号

线性规划的三要素:决策变量、目标函数、约束条件

线性规划的Python程序求解

例:

max ⁡ z = 2 x 1 + 3 x 2 − 5 x 3 \max \quad z=2 x_1+3 x_2-5 x_3 maxz=2x1+3x25x3
s . t . { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 > = 10 x 1 + 3 x 2 + x 3 < = 12 x 1 , x 2 , x 3 > = 0 s.t. \left\{\begin{array}{l}x_1+x_2+x_3=7 \\ 2 x_1-5 x_2+x_3>=10 \\ x_1+3 x_2+x_3<=12 \\ x_1, x_2, x_3>=0\end{array}\right. s.t. x1+x2+x3=72x15x2+x3>=10x1+3x2+x3<=12x1,x2,x3>=0

前面提到,规范形式中要求极小值,且不等式约束必须是小于等于号

所以目标函数和第一条不等式需要乘以-1

import numpy as np  
from scipy import optimize  # 向量化  
c = np.array([-2, -3, 5])  # 乘以-1变为求极小值  
Aeq = np.array([[1, 1, 1]])  # 方程  
beq = np.array([7])  
A = np.array([[-2, 5, -1], [1, 3, 1]])  # 不等式  
b = np.array([-10, 12])  
x1, x2, x3 = (0, None), (0, None), (0, None) # 范围 res = optimize.linprog(c, A, b, Aeq, beq, bounds=(x1, x2, x3)) # 计算
print(res)

结果:

message: Optimization terminated successfully. (HiGHS Status 7: Optimal)success: Truestatus: 0fun: -14.571428571428571 # 最优函数值(因为要取最大值所以结果要取fun的相反数)x: [ 6.429e+00  5.714e-01  0.000e+00] # x的结果nit: 3 # 3轮计算得出结果lower:  residual: [ 6.429e+00  5.714e-01  0.000e+00]marginals: [ 0.000e+00  0.000e+00  7.143e+00]upper:  residual: [       inf        inf        inf]marginals: [ 0.000e+00  0.000e+00  0.000e+00]eqlin:  residual: [ 0.000e+00]marginals: [-2.286e+00]ineqlin:  residual: [ 0.000e+00  3.857e+00]marginals: [-1.429e-01 -0.000e+00]mip_node_count: 0mip_dual_bound: 0.0mip_gap: 0.0

算法的特性:输入、输出、有穷性、确定性、可行性

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 编译aws并访问minio
  • Spring boot 使用 jSerialComm 对串口使用发送信息并接收
  • 【香菇带你学Mysql】Linux下Mysql8使用二进制安装包安装教程【建议收藏】
  • 案例分享—国外深色UI界面设计赏析
  • 使用 C++ 实现简单的插件系统
  • 程序员的最爱,FRP实现无公网IP的内网穿透,搭建远程服务:http、ssh、samba,基于最新FRP0.59.0版本
  • 【网络协议】网络劫持 - ARP/DNS欺骗篇
  • Windows11 WSL2 Ubuntu编译安装perf工具
  • 【C++深度探索】哈希表介绍与实现
  • 并查集-应用方向以及衍生汇总+代码实现(c++)-学习一个数据结构就会做三类大题!
  • 【QT常用技术讲解】多线程处理+全局变量处理异步事件并获取多个线程返回的结果
  • 【区块链+金融服务】广东省区域性股权市场区块链创新服务平台 | FISCO BCOS应用案例
  • git用法
  • 《Unity3D高级编程 主程手记》第四章 用户界面(六) UI 优化(上)
  • MySQL事务深度讲解
  • [笔记] php常见简单功能及函数
  • Angularjs之国际化
  • Node项目之评分系统(二)- 数据库设计
  • 彻底搞懂浏览器Event-loop
  • 大型网站性能监测、分析与优化常见问题QA
  • 容器服务kubernetes弹性伸缩高级用法
  • 首页查询功能的一次实现过程
  • 微信小程序设置上一页数据
  • 一天一个设计模式之JS实现——适配器模式
  • 原生Ajax
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ###STL(标准模板库)
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #LLM入门|Prompt#3.3_存储_Memory
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #职场发展#其他
  • (09)Hive——CTE 公共表达式
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (数据结构)顺序表的定义
  • .md即markdown文件的基本常用编写语法
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET中的Exception处理(C#)
  • /etc/fstab 只读无法修改的解决办法
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @SuppressWarnings注解
  • []T 还是 []*T, 这是一个问题
  • [AI StoryDiffusion] 创造神奇故事,AI漫画大乱斗!
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android 13]Input系列--获取触摸窗口
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C#]调用本地摄像头录制视频并保存