美赛BOOM数学建模1-1线性规划

注明:本文根据数学建模BOOM网课简单整理,自用

模型简介:

优化类问题:有限的资源,最大的收益

简单例子

•华强去水果摊找茬,水果摊上共3个瓜,华强总共有40点体力值

• 每劈一个瓜能带来40点挑衅值

• 每挑一个瓜问“你这瓜保熟吗”能带来30点挑衅值

• 劈瓜消耗20点体力值,问话消耗10点体力值

• 问如何利用这些瓜,使挑衅值最大?

注意事项:比赛时,读不懂题是很正常的

• 去百度搜,去查文献,尽快了解问题背景

• 遇到大量陌生专有名词就尽量别选,例如国赛A题

数学建模的过程,就是把题目翻译成数学语言

线性模型规划三要素:决策变量,目标函数,约束函数

线性规划模型:

• 要解决的问题是优化类问题(有限的资源,最大的收益)

• 所有变量的关系式都是线性的,不存在sinx等

• 线性规划模型:在一组线性约束条件下,求线性目标函数的最大值或最小值

适用赛题:

❑ 题目中提到“XXX有多少多少”“怎样安排/分配” “最多(少)”“利润最大” 等词;

❑ 生产安排:原材料、设备有限制,总利润最大

❑ 投资收益:涉及资产配置、收益率、损失率、组合投资,总收益最大

• 若总资金为M,有n种资产可以配置

• 每种资产的平均收益率…,风险损失率…,手续费…;问题:设计组合投资方案,使得收益尽可能大,

总体风险尽可能小(本质是多目标规划,可化简为一个目标的线性规划)

• 收益率= 收益/成本,设收益率为r,收益为g,成本为c

• 如果要求“总收益最大”,一般可以用线性规划

• 如果要求“总收益率最大”,一般是非线性规划(不绝对),由公式得会出现分数

❑ 销售运输:产地、销地、产量、销量、运费,总运费最省

❑ 车辆安排:路线、起点终点、承载量、时间点、车次安排最合理

典型例题与原理讲解:

❑投资收益问题

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

❑ 问题分析

• 有目标函数(净收益尽可能大、总风险尽可能小)

• 有约束条件(总资金有限,和隐含数学条件:每一笔投资都是非负数)

❑ 基本假设:假设每一笔交易额xi都大于对应的定额ui

❑ 模型的建立(多目标线性规划模型)

❑ 模型的简化

现实中,不同人所能承受的风险不同

• 设某一类投资者,能接受的最大投资风险率为定值

只要风险率小于等于该定值,可视为对该类投资者满足“总风险尽可能小”

• 即风险率(风险率=投资额*损失率/总资产)满足:

• 分情况讨论:设低风险投资者能接受的=5%,中风险投资者能接受的=15%,等等

转化为了约束条件

(总体风险小于某个常数即可)

❑ 模型改进:在求解时,对不同a取值分别进行求解(该操作实现了把a作为了“变量”)

代码求解:

调用matlab自带的linprog函数

(等号左边的x返回最优解的变量取值,fval返回目标函数的最优值)

[x,fval]= linprog(f,A,b,Aeq,beq,lb,ub)

• 注意:要调用linprog函数,填入的变量必须取自matlab标准型的形式

• matlab标准型:模型的目标函数是求最小值、约束条件都是小于等于号或等号

• 运筹学中求解优化类问题有很多方法,做数模则不需要掌握,模型建好后能求解就行

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 (𝑓,𝐴,𝑏)

若题目求最大值:目标函数等号两端加负号转为求最小值,求解后目标值再取负

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值