数学建模:运筹优化类——线性规划

数学建模:运筹优化类——线性规划本文将带你快速了解并掌握线性规划的模型及使用 文末有案例演示

大家好,欢迎来到IT知识分享网。

目录

1.线性规划

2.线性规划模型三要素

3.模型特点

4.建模步骤

5.案例演示


1.线性规划

线性规划(LP)是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。可为合理利用有限人力、物力、财力等资源作出最优决策,提供科学依据。
 

2.线性规划模型三要素

  • 决策变量问题中要确定的未知量,用于表明规划问题中的用数量表示的方案、措施等,可由决策者决定和控制。
  • 目标函数决策变量的函数,优化目标通常是求该函数的最大值或最小值
  • 约束条件决策变量的取值所受到的约束限制条件,通常用含有决策变量的等式或不等式表示。

3.模型特点

  • 要解决的问题是优化类的(即在有限的资源条件下,获取最大的收益)。
  • 目标函数和约束条件都是决策变量的线性函数,即不存在x^2,e^x,\frac{1}{x},\sin x,log_{2}x等。
  • 线性规划模型:在一组线性约束条件下,求线性目标函数的最大值或最小值

4.建模步骤

1.根据影响所要达到目的的因素找到决策变量

2.由决策变量和所在达到目的之间的函数关系确定目标函数

3. 由决策变量所受的限制条件确定决策变量所要满足的约束条件

5.案例演示

5.1 游戏升满级

题目:该游戏每天有100点体力,可通过反复通关A、B、C三张地图来获取经验升级,通关A图可获得20点经验,通关B图可获得30点经验,通关C图可获得45点经验,但通关地图会消耗体力,其中通关A图消耗4点体力,通关B图消耗8点体力,通关C图消耗5点体力,同时A、B、C三图每天加在一起最多通关20次,求该怎么组合通关ABC三个地图的次数来使今天获得的经验最大?

解答:由上题可知:
决策变量:三个地图通关次数。设A、B、C三个地图通关的次数分别为x_{1}x_{2}x_{3}
目标函数:获得的经验最高。设经验为y,max\ y=20x_1+30x_2+45x_3
约束条件:消耗体力不能超过100(4x_{1}+8x{2}+15x_{3}\leqslant 100),三个地图最多超过20次(x_1+x_2+x_3\leq 20),隐藏约束条件(x_1,x_2,x_3\geq 0),
一般形式(代数形式)表现为:
max\ y=20x_1+30x_2+45x_3,\\\\ s.t.\left\{\begin{matrix} 4x_1 +8x_2 + 15x_3 \leq 100,\\ x_1+x_2 +x_3 \leq 20, \\ x_1,x_2,x_3\geq 0 .\end{matrix}\right.
转换为矩阵表现形式为:
max\ y=c^{T}x,\\\\ s.t.\left\{\begin{matrix} Ax\leq b,\\ x\geq 0. \end{matrix}\right.
c=[20,30,45]^{T},x=[x_1,x_2,x_3]^{T}, A=\begin{bmatrix} 4 & 8 & 15\\ 1 & 1& 1 \end{bmatrix}, b=[100,20]^{T}







其中:

  • c=[c_1,c_2,...,c_n]^{T}——目标函数的系统向量,即价值向量;
  • x=[x_1,x_2,...,x_n]^{T}——决策向量;
  • A=(a_{ij})_{mxn}——约束方程组的系数矩阵;
  • b=[b_1,b_2,...,b_m]^{T}——约束方程组的常数向量。

编程实现:

import numpy as np from scipy.optimize import linprog # 目标函数系数,这里取负值,因为linprog默认进行最小优化 c=[-20,-30,-45] # 不等式约束的系数矩阵 A_ub=[ [4,8,15], [1,1,1] ] # 不等式约束的右侧向量值b b_ub=[100,20] # 定义域 bounds=[[0,None],[0,None],[0,None]] # 求解线性规划问题 # 注意:由于linprog默认是求解最小化问题,我们通过对目标函数系数取负值来转换为最大化问题 result=linprog(c,A_ub,b_ub,bounds=bounds) # 输出结果 print('A、B、C三图分别通关的次数为:',result.x) # 解向量 # 目标函数的最大值是最小化问题的相反数 y=-result.fun print('最终获得的经验为:',y)

5.2 投资选择

题目:市场上有n种资产(如股票、债券、……)s_i(i=1,2,…,n)供投资者选择,某公司有数额为M的一笔相当大的资金可用作一个时期的投资。公司财务分析人员对这n种资产进行了评估,估算出在这一时期内购买资产s_i的平均收益率为r_i,并预测出购买s_i的风险损失率为q_i。考虑到投资越分散,总的风险越小,公司确定,当用这笔资金购买若干种资产时,总体风险可用所投资的s_i中最大的一个风险来度量。

  • 购买s_i要付交易费,费率为p_i,并且当购买额不超过给定值u_i时,交易费按购买u_i计算(不买无须付费)。另外,假定同期银行存款利率是r_0r_0=5%),且既无交易又无风险
  • 已知 n=4 时的相关数据如表所示:
  • s_i r_i(%) q_i(%) p_i(%) u_i(元)
    s_1 28 2.5 1 103
    s_2 21 1.5 2 198
    s_3 23 5.5 4.5 52
    s_4 25 2.6 6.5 40

问:给上述公司设计投资组合方案,用给定资金M,有选择地购买若干种资产或存银行生息,使净收益尽可能大,总体风险尽可能小。 

解答:由上题可知:
决策变量:投资不同项目s_i的为x_i(i=1,2,…,n)。
目标函数:净收益Q尽可能大、总风险尽可能小。
约束条件:总资金M有限,每一笔投资都是非负数。

模型假设:




  • 可供投资的资金数额M相当大。
  • 投资越分散,总的风险越小,总体风险可用所投资的s_i中最大的一个风险来度量。
  • 可供选择的 n+1 种资产(含银行存款)之间是相互独立的。
  • 每种资产可购买的数量为任意值。
  • 在当前投资周期内,r_iq_ip_iu_i(i=0,1,…,n)固定不变。
  • 不考虑在资产交易过程中产生的其他费用。
  • 由于投资数额M相当大,而题目设定的定额u_i相对M很小,p_iu_i更小,因此假设每一笔交易x_i都大于对应定额u_i

模型简化:
在实际投资中,投资者承受风险的程度不一样,这时可以给定风险一个界限a,使最大的一个风险 \frac{q_ix_i}{M}\leq a,这样就可以将目标函数中的min\begin{Bmatrix} max_{1\leq i\leq n}\begin{Bmatrix} q_ix_i \end{Bmatrix} \end{Bmatrix}转换为约束条件\frac{q_ix_i}{M}\leq a(总体风险小于某个常数)。至此,模型用一般形式表现为:
s.t.\left\{\begin{matrix} \frac{q_ix_i}{M}\leq a,i=1,2,...,n ,\\\\ \sum_{i=0}^{n}(1+p_i)x_i=M,\\\\ x_i\geq 0,i=0,1,...,n \end{matrix}\right.
将数值代入进去得:
min\ f=[0.05,0.27,0.19,0.185,0.185]\cdot [x_0,x_1,x_2,x_3,x_4]^{T}\\\\ s.t.\left\{\begin{matrix} x_0+1.01x_1+1.02x_2+1.045x_3+1.065x_4=M ,\\ 0.025x_1\leq aM ,\\ 0.015x_2\leq aM ,\\ 0.055x_3\leq aM ,\\ 0.026x_4\leq aM , \\ x_i\geq 0\ (i=0,1,...4). \end{matrix}\right.
这里 M 我们取1万元,由于 a 是任意给定的风险度,不妨 a 从0开始,以步长\Delta a=0.001进行循环搜索,搜索至 a=5%(低风险者能够接受的风险)。




 编程实现:

import matplotlib.pyplot as plt from numpy import ones,diag,c_,zeros # 用于创建和操作数组 from scipy.optimize import linprog # 用于执行线性规划 # 设置matplotlib的参数使其支持LaTeX文本和字体大小 plt.rc('text',usetex=True) plt.rc('font',size=16) # 线性规划问题的目标函数系数 c=[-0.05,-0.27,-0.19,-0.185,-0.185] # 线性不等式约束的系数矩阵 # 使用c_来合并数组,zeros创建一个全0的数组作为第1列,diag创建一个对角阵 A=c_[zeros(4),diag([0.025,0.015,0.055,0.026])] # 线性等式约束的系数矩阵和右侧的值 Aeq=[[1,1.01,1.02,1.045,1.065]] beq=[1] # 初始化参数a,以及两个用于存储结果的空列表 a=0 aa=[] ss=[] # 循环,a的值从0开始,以0.0001的步长增加,直到0.05 while a<0.05: # 创建线性不等式约束的右侧值(b) b=ones(4)*a # 执行线性规划,得到最优解 res=linprog(c,A,b,Aeq,beq,bounds=[(0,None),(0,None),(0,None),(0,None),(0,None)]) # 提取线性规划的解向量x和最优值Q x=res.x Q=-res.fun # 将当前的a值和对应的最优值Q存入列表 aa.append(a) ss.append(Q) # a增加0.001 a=a+0.001 # 绘制结果,a值与最优值Q之间的关系图 plt.plot(aa,ss,'r*') # 使用红色星号标记数据点 # 设置坐标轴标签,其中a和Q将使用LaTeX格式显示 plt.xlabel('$a$') plt.ylabel('$Q$',rotation=90) # 显示图形 plt.show()
数学建模:运筹优化类——线性规划
风险a与收益Q之间的关系

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118781.html

(0)
上一篇 2025-11-10 15:10
下一篇 2025-11-10 15:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信