注明:本文根据数学建模BOOM网课简单整理,自用
模型简介:
优化类问题:有限的资源,最大的收益
简单例子:
•华强去水果摊找茬,水果摊上共3个瓜,华强总共有40点体力值
• 每劈一个瓜能带来40点挑衅值
• 每挑一个瓜问“你这瓜保熟吗”能带来30点挑衅值
• 劈瓜消耗20点体力值,问话消耗10点体力值
• 问如何利用这些瓜,使挑衅值最大?
注意事项:比赛时,读不懂题是很正常的
• 去百度搜,去查文献,尽快了解问题背景
• 遇到大量陌生专有名词就尽量别选,例如国赛A题
数学建模的过程,就是把题目翻译成数学语言
![](https://i-blog.csdnimg.cn/blog_migrate/80c884365be198578816902044e942ac.png)
线性模型规划三要素:决策变量,目标函数,约束函数
线性规划模型:
• 要解决的问题是优化类问题(有限的资源,最大的收益)
• 所有变量的关系式都是线性的,不存在sinx等
• 线性规划模型:在一组线性约束条件下,求线性目标函数的最大值或最小值
适用赛题:
❑ 题目中提到“XXX有多少多少”“怎样安排/分配” “最多(少)”“利润最大” 等词;
❑ 生产安排:原材料、设备有限制,总利润最大
❑ 投资收益:涉及资产配置、收益率、损失率、组合投资,总收益最大
• 若总资金为M,有n种资产可以配置
• 每种资产的平均收益率…,风险损失率…,手续费…;问题:设计组合投资方案,使得收益尽可能大,
总体风险尽可能小(本质是多目标规划,可化简为一个目标的线性规划)
• 收益率= 收益/成本,设收益率为r,收益为g,成本为c
• 如果要求“总收益最大”,一般可以用线性规划
• 如果要求“总收益率最大”,一般是非线性规划(不绝对),由公式得会出现分数
❑ 销售运输:产地、销地、产量、销量、运费,总运费最省
❑ 车辆安排:路线、起点终点、承载量、时间点、车次安排最合理
典型例题与原理讲解:
❑投资收益问题
![](https://i-blog.csdnimg.cn/blog_migrate/ca3ad1fa0f9def8fc8ee5c0724a2bc3c.png)
• 问题:给该公司设计一种投资组合方案,用给定的资金M,有选择地购买若干种资产或存银行生息,使净收益尽可能大,总体风险尽可能小。
❑ 问题分析
• 有目标函数(净收益尽可能大、总风险尽可能小)
• 有约束条件(总资金有限,和隐含数学条件:每一笔投资都是非负数)
❑ 基本假设:假设每一笔交易额xi都大于对应的定额ui
❑ 模型的建立(多目标线性规划模型)
![](https://i-blog.csdnimg.cn/blog_migrate/4c17189296db719d6c28ac3a4314a7ed.png)
❑ 模型的简化
• 现实中,不同人所能承受的风险不同
• 设某一类投资者,能接受的最大投资风险率为定值
• 只要风险率小于等于该定值,可视为对该类投资者满足“总风险尽可能小”
• 即风险率(风险率=投资额*损失率/总资产)满足:
![](https://i-blog.csdnimg.cn/blog_migrate/b307b33b33b25bb8e526aa8fb993397f.png)
• 分情况讨论:设低风险投资者能接受的=5%,中风险投资者能接受的=15%,等等
• 转化为了约束条件:
![](https://i-blog.csdnimg.cn/blog_migrate/8eb005d62c12e3aee7da3058c5e42ee3.png)
(总体风险小于某个常数即可)
❑ 模型改进:在求解时,对不同a取值分别进行求解(该操作实现了把a作为了“变量”)
代码求解:
调用matlab自带的linprog函数
(等号左边的x返回最优解的变量取值,fval返回目标函数的最优值)
[x,fval]= linprog(f,A,b,Aeq,beq,lb,ub)
![](https://i-blog.csdnimg.cn/blog_migrate/a2b0e27eb6c6a60bb50bd86fabedb642.png)
• 注意:要调用linprog函数,填入的变量必须取自matlab标准型的形式
• matlab标准型:模型的目标函数是求最小值、约束条件都是小于等于号或等号
• 运筹学中求解优化类问题有很多方法,做数模则不需要掌握,模型建好后能求解就行
![](https://i-blog.csdnimg.cn/blog_migrate/8d471cb36a183a1dc68f3c4ccd162bdd.png)
matlab代码:
% clc是清除命令行窗口,clear是清除存储空间的变量
clc,clear;
% a矩阵的元素是不同风险率,从0到0.05等差取值,相邻两个数相差0.001
a = (0:0.001:0.05);
f = [-0.05,-0.27,-0.19,-0.185,-0.185]; % 目标函数的系数向量
% A是不等式约束条件的变量系数构成的矩阵
% 用zeros(4,1)先构造4行一列的全是0的矩阵,也就是对x_0无约束;
% 再构造对角矩阵diag([0.025,0.015,0.055,0.026]),对角线上元素为约束条件中变量的系数
A = [zeros(4,1),diag([0.025,0.015,0.055,0.026])];
Aeq = [1,1.01,1.02,1.045,1.065]; % 等式约束的系数矩阵,也就是所有资产投资
beq = 1;
LB = zeros(5,1);
Q = zeros(1,length(a)); % 初始化保存最优解的矩阵Q,因为现在还没求出最优解,元素全设为0
XX = []; % 定义个空矩阵,用来存不同风险率下的最优解
% 利用矩阵Q存储风险率a(i)下最大的收益;for循环中i在变化,风险率a(i)不同,求出对应的最优解存在矩阵Q内
for i = 1:length(a) % length求出矩阵a的元素个数,有多少个元素,就循环多少次
b = a(i)*ones(4,1); % b是约束条件的常数项矩阵,4行1列,每个元素值都是常数a(i)
[x,y] = linprog(f,A,b,Aeq,beq,LB); % 调用linprog函数
Q(i) = -y; % 负负得正,就是所需求的最大值了
XX = [XX;x'];
end
plot(a,Q,'*r'); % 以风险率为横轴,收益为纵轴,绘制不同风险率下的最优收益
xlabel('风险率'); % x和y轴分别附上标签
ylabel('最大收益');
注意事项:
linprog函数的标准形式是[x, fval ]= linprog(f,A,b,Aeq,beq,lb,ub)
若不存在不等式约束,用“ [ ]” 代替Aeq和beq: [𝑥, fval ]= linprog (𝑓,[ ],[ ],𝐴𝑒𝑞, beq ,𝑙𝑏,𝑢𝑏)
若不存在等式约束,用“ [ ]” 代替𝐴𝑒𝑞和𝑏𝑒𝑞: [𝑥, fval ]= linprog (𝑓,𝐴,𝑏,[ ], [ ] ,𝑙𝑏,𝑢𝑏)
没有等式约束和最小、最大取值的约束时,可以不写𝐴𝑒𝑞,𝑏𝑒𝑞 和𝑙𝑏,𝑢𝑏: [𝑥, fval ]= linprog (𝑓,𝐴,𝑏)
若题目求最大值:目标函数等号两端加负号转为求最小值,求解后目标值再取负