数学模型:Python实现线性规划

news2025/3/6 15:45:20

文章摘要:线性规划的Python实现。
参考书籍:数学建模算法与应用(第3版)司守奎 孙玺菁。
PS:只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现:可以参考1.最优化模型与算法——基于Python实现 渐令 粱锡军2.算法导论(原书第3版)Thomas H.Cormen Charles E.Leiserson、Ronald L.Rivest Clifford Stein
文章声明:如有发现错误,还望批评指正。

文章目录

  • 线性规划简述
  • 线性规划实现
    • 模型一:固定风险,最大收益
    • 模型二:固定收益,最小风险
    • 模型三:目标函数加权求和

线性规划简述

目标函数:
max ⁡    o r    min ⁡    y = ∑ i = 1 n a i x i \max\;or\;\min\; y=\sum\limits_{i=1}^{n}a_ix_i maxorminy=i=1naixi

约束条件:
∑ j = 1 n a i j x j ≤ o r = o r ≥ b i , i = 1 , 2 , … , m \sum\limits_{j=1}^{n}a_{ij}x_{j}\leq or = or \geq b_i,i=1,2,\dots,m j=1naijxjor=orbi,i=1,2,,m
x j ≥ 0 , j = 1 , 2 , … , n x_j\geq0,j=1,2,\dots,n xj0j=1,2,,n

一些名词: 可行解,可行域与最优解。

PS:至于如何找到最优解的还请参考最前面的PS,没有兴趣可以不用进行研究。希望以后上了最优化的课程或者有时间了能够手搓。感觉工程量有点大,哈哈也许没有必要。所以博主没有学习过最优化相关理论,对于求解器的方法同样也不知道。但是从工程的角度,我们可以不用知道,那是理论学家需要去做的事。看需要,看兴趣。

线性规划实现

参考书籍例1.9
目标函数:
max ⁡ ∑ i = 0 n ( r i − p i ) x i \max\sum\limits_{i=0}^n(r_i-p_i)x_i maxi=0n(ripi)xi
min ⁡ { max ⁡ 1 ≤ i ≤ n { q i x i } } \min\{\max\limits_{1\leq i\leq n}\{ q_ix_i\} \} min{1inmax{qixi}}
约束条件:
∑ i = 0 n ( 1 + p i ) x i = M \sum\limits_{i=0}^{n}(1+p_i)x_i=M i=0n(1+pi)xi=M
x i ≥ 0 , i = 0 , 1 , 2 , … , n x_i\geq0,i=0,1,2,\dots,n xi0,i=0,1,2,,n

模型一:固定风险,最大收益

目标函数:
max ⁡ ∑ i = 0 n ( r i − p i ) x i \max\sum\limits_{i=0}^n(r_i-p_i)x_i maxi=0n(ripi)xi
约束条件:
q i x i M ≤ a , i = 0 , 1 , 2 , … , n \frac{q_ix_i}{M}\leq a,i=0,1,2,\dots,n Mqixia,i=0,1,2,,n
∑ i = 0 n ( 1 + p i ) x i = M \sum\limits_{i=0}^{n}(1+p_i)x_i=M i=0n(1+pi)xi=M
x i ≥ 0 , i = 0 , 1 , 2 , … , n x_i\geq0,i=0,1,2,\dots,n xi0,i=0,1,2,,n

from scipy.optimize import linprog
import numpy  as np
M=10000
lt1=np.array([0.05,0.28,0.21,0.23,0.25])
lt2=np.array([0,0.01,0.02,0.045,0.065])
c=lt1-lt2;c=-c
A_ub1=np.diag([0,0.025,0.015,0.055,0.026]);A_ub2=np.diag([-1,-1,-1,-1,-1]);A_ub=np.vstack((A_ub1,A_ub2))
A_eq=1+lt2;A_eq=A_eq.reshape(1,-1)
b_eq=np.array([M])
lt=[]
for i in range(0,50):
    b_ub=np.array([i/1000*M for _ in range(5)]+[0 for _ in range(5)])
    result=linprog(c,A_ub,b_ub,A_eq,b_eq)
    lt.append(-result.fun)
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i for i in range(len(lt))],lt,ms=10,marker="o",linestyle="--",linewidth=5,color="green")
plt.xlabel("a");plt.ylabel("收益");plt.show()

在这里插入图片描述
以下两个模型需要目标函数进行线性转换。但是这样会造成不等式约束右侧包含变量,scipy库无法解决所以使用cvxpy库(至少我没找功能函数)。

模型二:固定收益,最小风险

目标函数:
min ⁡ { max ⁡ 1 ≤ i ≤ n { q i x i } } \min\{\max\limits_{1\leq i\leq n}\{ q_ix_i\} \} min{1inmax{qixi}}
约束条件:
∑ i = 0 n ( r i − p i ) x i ≥ k M \sum\limits_{i=0}^n(r_i-p_i)x_i\geq kM i=0n(ripi)xikM
∑ i = 0 n ( 1 + p i ) x i = M \sum\limits_{i=0}^{n}(1+p_i)x_i=M i=0n(1+pi)xi=M
x i ≥ 0 , i = 0 , 1 , 2 … , n x_i\geq0,i=0,1,2\dots,n xi0,i=0,1,2,n

import numpy as np
import cvxpy as cp
M=10000
x=cp.Variable(6,pos=True)
obj=cp.Minimize(x[5])
p=np.array([0,0.01,0.02,0.045,0.065])
con1=(1+p)@x[:-1]==M
q=np.array([0,0.025,0.015,0.055,0.026])
con2=cp.multiply(q,x[:5])<=x[5]
r=np.array([0.05,0.28,0.21,0.23,0.25])
lt=[]
for i in range(100):
    con3=(r-p)@x[:-1]>=i/100*M
    con=[con1,con2,con3]
    pro=cp.Problem(obj,con)
    pro.solve(solver='ECOS')
    lt.append(x.value[5])
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i for i in range(len(lt))],lt,ms=10,marker="o",linewidth=5,color="green")
plt.xlabel("k");plt.ylabel("风险");plt.savefig("figure")

在这里插入图片描述

分析:收益到0.26之后便就没有解了。
注释:(默认问题为凸问题,具体是不是我证明不了)ECOS是一个求解凸优化的方法(具体理论我不知道),具有数值稳定,求解效率等等优点,

模型三:目标函数加权求和

目标函数:
min ⁡ { ω { max ⁡ 1 ≤ i ≤ n { q i x i } } − ( 1 − ω ) ∑ i = 0 n ( r i − p i ) x i \min \{\omega\{\max\limits_{1\leq i\leq n}\{ q_ix_i\} \}-(1-\omega) \sum\limits_{i=0}^n(r_i-p_i)x_i min{ω{1inmax{qixi}}(1ω)i=0n(ripi)xi}
约束条件:
∑ i = 0 n ( 1 + p i ) x i = M \sum\limits_{i=0}^{n}(1+p_i)x_i=M i=0n(1+pi)xi=M
x i ≥ 0 , i = 0 , 1 , 2 , … , n x_i\geq0,i=0,1,2,\dots,n xi0,i=0,1,2,,n

import numpy as np
import cvxpy as cp
M=10000
x=cp.Variable(6,pos=True)
p=np.array([0,0.01,0.02,0.045,0.065])
con1=(1+p)@x[:-1]==M
q=np.array([0,0.025,0.015,0.055,0.026])
con2=cp.multiply(q,x[:5])<=x[5]
con=[con1,con2]
r=np.array([0.05,0.28,0.21,0.23,0.25])
lt1=[];lt2=[]
for i in range(100):
    obj=cp.Minimize(i*x[5]-(1-i/100)*((r-p)@x[:-1]))
    pro=cp.Problem(obj,con);pro.solve(solver='ECOS')
    lt1.append((r-p)@x.value[:-1]);lt2.append(x[5].value)
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i for i in range(len(lt1))],lt1,ms=10,marker="o",linewidth=5,color="green")
plt.xlabel("w");plt.ylabel("收益");plt.savefig("figure1")
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i for i in range(len(lt2))],lt2,ms=10,marker="o",linewidth=5,color="green")
plt.xlabel("w");plt.ylabel("风险");plt.savefig("figure2")

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vim复制,剪切觉得麻烦?今天就来教会你:vim复制和剪切教程

上次讲了vim移动光标的快捷键&#xff0c;今天我们来了解一下vim的复制多行的功能。 快速复制多行 第一步&#xff1a;将光标移动到复制的文本开始的地方&#xff0c;按下v进入可视模式&#xff0c;这里的v的意思就是visual的缩写&#xff0c;就是可视的意思。 第二步&#x…

DBSCAN 集群

目录 DBSCAN 集群 主要代码 DBSCAN 绘制结果中的集群 DBSCAN 集群 基于密度的空间聚类应用&#xff08;DBSCAN&#xff09;是一种基于密度的聚类算法&#xff0c;由Martin Ester等人在1996年提出。该算法在半径为ε的圆内找到数据点的相邻点&#xff0c;并将它们加入到同一…

Git原理详解+指令操作,带你快速掌握Git

一、相关概念 版本控制 什么是版本控制&#xff1f; 用于管理多人协同开发项目的技术对文件的版本控制&#xff0c;要对文件进行修改、提交等操作 版本控制的分类 1.本地版本控制 就是放在本地 2.集中版本控制 SVN 所有的版本数据都保存在服务器上&#xff0c;协同开发…

GDAL读取属性表值乱码解决方法

文章目录 方法1&#xff1a;方法2&#xff1a;1.通过在线网网站&#xff0c;查看编码2.参考C中gbk和utf8互相转换文章 gdal示例代码 方法1&#xff1a; 在网上查看的推荐方法&#xff08;C代码&#xff09;&#xff0c;但没解决我遇到的问题&#xff1b; CPLSetConfigOption(&…

SSM整合快速入门案例

文章目录 前言一、设计数据库表二、创建工程三、SSM技术整合四、功能模块开发五、接口测试总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作者…

Java网络开发(Tomcat)——登陆和注册功能 的 迭代升级 从Jsp到JavaScript + axios + vue 诸多bug 同步到异步

目录 引出前置工作vueaxiosresp0.vue版本的jsp模板1.导包--Json&#xff1a;pom.xml文件&#xff1a;2.新建一个专门用来处理响应的实体类ResData3.在axios中&#xff0c;所有响应必须是 resp.getWriter().write() 的方式&#xff0c;核心代码如下4.在jsp前端代码中导包&#x…

华为OD机试真题B卷 JavaScript 实现【查字典】,附详细解题思路

一、题目描述 输入一个单词前缀和一个字典&#xff0c;输出包含该前缀的单词。 二、输入描述 单词前缀字典长度字典。 字典是一个有序单词数组。 输入输出都是小写。 三、输出描述 所有包含该前缀的单词&#xff0c;多个单词换行输出。 若没有则返回-1。 四、解题思路…

SLAM十四讲——ch3实践

ch3的实践及避坑 一、ch3的总体步骤二、文件的执行1. 实践&#xff1a;Eigen2. 实践&#xff1a;Eigen几何模块3. 可视化演示 出现的问题 一、ch3的总体步骤 确保已经安装Eigen库&#xff0c;Eigen库是一个C开源线性代数库。 sudo apt-get install libeigen3-dev说明&#xf…

在 Compose 中实现缓存列表数据提升用户体验(Stale-while-revalidate)

前言 最近在利用业余时间使用 Compose 实现一个 Github APP 客户端。 对标的是 GSY 大佬使用多种不同语言框架实现的 Github APP。 在实现过程中发现一些问题&#xff0c;因为这个客户端的数据几乎全部来自于 Github API&#xff0c;所以 UI 渲染也极度依赖于请求到的数据。…

JAVA面向对象(三)

第三章 封装与继承 目录 第三章 封装与继承 1.1.封装 1.2.包 1.3.访问权限控制 1.4.static修饰符 1.4.1.成员变量 1.4.2.成员方法 1.4.3.代码块 总结 内容仅供学习交流&#xff0c;如有问题请留言或私信&#xff01;&#xff01;&#xff01;&#xff01;&#xff0…

java并发编程:ArrayBlockingQueue详解

文章目录 一、简介二、数据结构三、源码分析3.1 属性3.2 构造方法3.3 方法3.3.1 入队3.3.2 出队3.3.3 获取元素3.3.4 删除元素 四、总结 一、简介 ArrayBlockingQueue 顾名思义&#xff1a;基于数组的阻塞队列。数组是要指定长度的&#xff0c;所以使用 ArrayBlockingQueue 时…

在知乎逮到一个腾讯10年老测试,聊过之后收益良多...

老话说的好&#xff0c;这人呐&#xff0c;一单在某个领域鲜有敌手了&#xff0c;就会闲得蛋疼。前几天我在上班摸鱼刷知乎的时候认识了一位腾讯测试大佬&#xff0c;在腾讯工作了10年&#xff0c;因为本人天赋比较高&#xff0c;平时工作也兢兢业业&#xff0c;现在企业内有一…

Python基础知识讲解——main方法

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 估计很多人跟我一样初学python看代码的时候先找一下main()方法&#xff0c;从main往下看。 但事实上python中是没有你理解中的“main()”方法的。 言归正传 if name "main":可以看成是python程序的入口&a…

数据结构与算法系列之习题练习

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 力扣习题 括号匹配问题。用队列实现栈。用栈实现队列。设计循环队列。 有效的括…

【数据分析案例】深度分析超市零售商店数据--Python数据分析实战

前言 咳咳&#xff0c;又是好久不见~这不高考已经结束了 对python感兴趣的准大学生们&#xff0c;是打算好好玩几个月还是&#xff0c;继续研究学习python呢~ &#x1f928; 我呢 还是建议大家劳逸结合哈哈 先玩再学习~ 当然啦 最重要的还是看你们自己呀 不过我以上这些都不能…

[NOI2007] 调兵遣将

题目描述 我军截获的情报显示&#xff0c;敌军正在集结兵力试图向我军重要的军械研究所发起进攻。由于我军正处于多线作战的状态&#xff0c;无法抽调大批兵力前去支援&#xff0c;指挥部决定通过有效的战前部署来提高胜率&#xff0c;减少伤亡和损失。 该军械研究所的平面图…

网络安全自学笔记+学习路线+就业规划(超详细)

每天都有新闻报道描述着新技术对人们的生活和工作方式带来的巨大乃至压倒性影响。与此同时有关网络攻击和数据泄露的头条新闻也是日益频繁。 攻击者可谓无处不在&#xff1a;企业外部充斥着黑客、有组织的犯罪团体以及民族国家网络间谍&#xff0c;他们的能力和蛮横程度正日渐…

如何使虚拟机自动生成ip地址

一. 打开虚拟机并登录账号进入命令行界面输入指令&#xff1a; vi /etc/sysconfig/network-scripts/ifcfg-ens33 通过指令进入到下面的界面当中 点击键盘输入 "i" 进入编辑模式将文件修改为 文件当中的 BOOTPROTO可以将ip地址定义为自动生成类型或者静态指定类型其中…

力扣 213. 打家劫舍 II

一、题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈&#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻…

高考后计算机人工智能大类专业的选择建议

随着GPT的出现&#xff0c;很多人开始质疑是否还需要学计算机专业&#xff0c;计算机专业是否会消失。 先给结论&#xff0c;不会&#xff01; 只是会产生分层&#xff0c;大体上是这样的&#xff1a; 核心代码部分还是需要人来写的&#xff0c;只要是代码方式出现的结果&#…