内容聚焦数学建模的数学规划模型,主要有:线性规划、整数规划、非线性规划、多目标规划、最大最小模型
线性规划:约束条件和目标函数均为决策变量的线性表达式
求解方法:构造标准形式的约束条件和目标函数,利用matlab的linprog函数进行求解。
%% Matlab求解线性规划
% [x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0)
% c是目标函数的系数向量,A是不等式约束Ax<=b的系数矩阵,b是不等式约束Ax<=b的常数项
% Aeq是等式约束Aeq x=beq的系数矩阵,beq是等式约束Aeq x=beq的常数项
% lb是X的下限,ub是X的上限,X是向量[x1,x2,...xn]' , 即决策变量。
% 迭代的初始值为x0(一般不用给)
线性规划的解可能有多个也或者没有,只要有解那么这些解组成的目标函数的值是唯一的。并且这些解落在临界区。
线性整数规划:相对于线性规划增加了决策变量为整数的条件。
0-1规划:整数规划的特例,决策变量的值只能取0或1
非线性整数规划:由于目前流行的求解整数规划的方法,往往只适用于整数线性规划,本文不对非线性整数规划做过多介绍。
求解方法:构造标准形式的约束条件和目标函数,利用matlab的intcon约束哪些自变量为整数,然后用intlinprog函数进行求解。还有分支定界法、割平面法、隐枚举法(0-1整数规划)、匈牙利法(指派问题)、蒙特卡洛法(可以求解各种类型的规划问题)
intcon = 1:9;%表示将x1到x9限制为整数
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb)
非线性规划:相对于线性规划,非线性规划的目标函数或约束条件含有决策变量的非线性表达式。
求解方法:解决非线性规划要比线性规划复杂的多,目前没有通用算法。大多算法都是在选定合适的决策变量初始值之后,采用特殊的搜索算法寻求最优的决策变量。非线性规划中的初始值的选取非常重要,可以用蒙特卡洛模拟寻求初始值。因为非线性规划的算法求解出来的是一个局部最优解,而线性规划就不存在这个问题。
%% 非线性规划的函数
% [x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
% x0表示给定的初始值(用行向量或者列向量表示),必须得写
% A b表示线性不等式约束
% Aeq beq 表示线性等式约束
% lb ub 表示上下界约束
% @fun表示目标函数
% @nonlfun表示非线性约束的函数
% option 表示求解非线性规划使用的方法,共有四种方法,内点法、序列二次规划法、有效集法、信赖域反射算法,不同的算法有其各自的优缺点和适用情况,我们可以改变求解的算法看结果是否变好来找最优解。
%选取初始值得到的结果可能会不满足限定条件,因此选择的初始值很重要,使用蒙特卡罗的方法来找初始值
最大最小化模型:指在规划问题中遇到这样的问题,就是要在最不利的条件下,寻求最有利的策略。如在投资规划时确定最大风险的最低限度、急救中心的选址问题等。为此,对于每一个决策变量,我们要先求目标函数关于决策量的最大值,然后再求这些最大值中的最小值,也就是找最小上界或者叫上确界。
%% 最大最小化模型 : min{max[f1,f2,···,fm]}
%以选址问题为例的最大最小化模型代码
x0 = [6, 6]; % 给定初始值
lb = [3, 4]; % 决策变量的下界
ub = [8, 10]; % 决策变量的上界
[x,feval] = fminimax(@Fun,x0,[],[],[],[],lb,ub)
max(feval)
%%Fun
function f = Fun(x)
a=[1 4 3 5 9 12 6 20 17 8];
b=[2 10 8 18 1 4 5 10 8 9];
% 函数向量
f=zeros(10,1);
for i = 1:10
f(i) = abs(x(1)-a(i))+abs(x(2)-b(i));
end
end
多目标规划模型:线性规划只能解决一组线性约束条件下,一个目标的最大值或最小值的问题。在实际决策中,衡量方案优劣要考虑多个目标,这些目标中,有主要的,也有次要的;有最大值的,也有最小值的;有定量的,也有定性的;有相互补充的,也有相互对立的。对于这些问题,线性规划则无能为力。
目标规划的求解思路有两种:
(1)加权系数法。为每一目标赋一个权系数,把多目标模型转化成单一目标的模型。但困难是要确定合理的权系数,以反映不同目标之间的重要程度。值得注意的是,要先将多个目标函数统一为最大化或者最小化问题才可以进行加权组合。并且如果目标函数的量纲不同,则需要对其进行标准化后再加权。
(2)优先等级法。将各目标按其重要程度不同的优先等级,转化为单目标模型。
另外,在目标规划中不提最优解的概念,只提满意解的概念,即寻求能够照顾到各个目标,并使决策者感到满意的解,由决策者来确定选取哪一个解,但满意解的数目太多而难以将其一一求出。
%fgoalattain - 求解涉及多目标的目标达到问题
fgoalattain %求解目标达到问题,这是多目标优化问题最小化的一种表示。
x = fgoalattain(fun,x0,goal,weight)
x = fgoalattain(fun,x0,goal,weight,A,b)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fgoalattain(problem)
[x,fval] = fgoalattain(___)
[x,fval,attainfactor,exitflag,output] = fgoalattain(___)
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(___)
其中weight
、goal
、b 和 beq 是向量,A 和 Aeq 是矩阵,F(x)、c(x) 和 ceq(x) 是返回向量的函数。F(x)、c(x) 和 ceq(x) 可以是非线性函数。x、lb 和 ub 可以作为向量或矩阵传递。
在约10, 000米高空的某边长160公里的正方形区域内,经常有若干架飞机作水平飞行。区域内每架飞机的位置和速度均由计算机记录其数据,以便进行飞行管理。当一架欲进入该区域的飞机到达区域边缘,记录其数据后,要立即计算并判断是否会与区域内的飞机发生碰撞。如果会碰撩,则应计算如何调整各架 (包括新进入的)飞机飞行方向角,以避免碰撞。现假定条件如下:
1)不碰撞的标准为任意两架飞机的距离大于8公里;
2)飞机飞行方向角调整的幅度不应超过30度;
3)所有飞机飞行速度均为每小时800公里;
4)进入该区域的飞机在到达区域边缘时,与区域内飞机的距离应在60公里以上;
5)最多需考虑6架飞机;
6)不必考虑飞机离开此区域后的状况。
请你对这个避免碰撞的飞行管理问题建立数学模型,列岀计算步骤,对所给数据(飞机编号、坐标、方向角)进行计算(方向角误差不超过0. 01度),要求飞机行方向角调整的幅度尽量小。
这是一个非线性规划问题,我们需要在新的飞机进入监测环境时,判断任意两架飞机是否会相撞,并做出飞机方向角转变的决策,做出的综合决策应该使得所有飞机方向角调整的幅度尽量小。
定义决策变量为6架飞机调整的飞行角度,目标函数很清晰,就是6架飞机调整的飞行角度幅度最小。
约束条件根据题意有两个,1. 每架飞机的调整角度不超过30度。2. 任意两架飞机距离始终大于8公里。对于第二个约束条件需要我们做出转化。
该约束条件的数学意义转换
要求飞机不相撞的条件是任何时刻任意两架飞机之间的距离大于8km,转化成数学意义可以有下列表述:
先看第一个转述,这是最容易想到的,但怎么算这个最小距离,这需要知道在什么时刻两架飞机之间的距离达到最小。只要知道了达到最小距离的时刻,根据欧几里得距离公式就可以计算出任意两架飞机的最小距离。那么问题又来了,怎么确定最小距离的时刻?很简单,列出任意两架飞机距离随时间的函数表达式,求距离关于时间的一阶导数,如果有驻点(就是一阶导数等于0的点),根据实际意义可以推断该驻点一定是极小值点。那如果没有驻点呢,则表示这个距离函数是随时间单调的,距离最小的时刻出现在临界值处,表示在出入监测范围时存在距离最小。这样就可以求解出最小距离的时刻与决策变量相关的函数表达式,带入约束条件即可。这样转化约束条件会使得到的解比题目中的约束还要强。
第二个转述,这个相当于要实时监测任意两架飞机的距离是否会小于8km,一旦小于就要实时做出调整角度的决策。但是这里太看重第三个维度了,就是时间,需要先计算出每一架飞机在监测区域内的时间跨度。题目要求是即时判断即时调整,按照实际经验,也应该是要尽量减少一次调整之后还要调整的情况,应该做到一次调整就到位,后面就不需要再调整了,等到有新的飞机进入监测区域再做这样的判断和调整。这个方法就相当于模拟了。
第三个转述,比较考验抽象思维和物理功底,这里的思路是根据相对运动的观点在考察两架飞机i和飞机j时,可以将飞机i视为静止,而飞机j以相对速度相对于飞机i运动。需要确定任意j相对任意i的相对速度,结合飞行角度和距离的关系,把最小距离的约束转化为任意两架飞机相对飞行方向角度区间,只要满足这个区间,两架飞机就不可能相撞。觉得这个思想很妙,老是喜欢套模型的聪明人可以多想想这种思维来优化约束。
市场上有n 种资产(如股票、债券、…)Si ( i=1,…n) 供投资者选择,某公司有数额为M 的一笔相当大的资金可用作一个时期的投资。公司财务分析人员对这n 种资产进行了评估,估算出在这一时期内购买Si 的平均收益率为 ri,并预测出购买Si的风险损失率为qi 。考虑到投资越分散,总的风险越小,公司确定,当用这笔资金购买若干种资产时,总体风险可用所投资的Si 中最大的一个风险来度量。
购买Si 要付交易费,费率为 pi,并且当购买额不超过给定值 ui时,交易费按购买ui 计算(不买当然无须付费)。另外,假定同期银行存款利率是r0, 且既无交易费又无风险。( r0=5% )
1)已知n = 4 时的相关数据如下:
Si ri(%) qi(%) pi(%) ui(元)
S1 28 2.5 1 103
S2 21 1.5 2 198
S3 23 5.5 4.5 52
S4 25 2.6 6.5 40
试给该公司设计一种投资组合方案,即用给定的资金 ,有选择地购买若干种资产或存银行生息,使净收益尽可能大,而总体风险尽可能小。
题目要求设计一种投资组合方案,使得净收益尽可能大,总体风险尽可能小,这是一个多目标规划模型。我们很容易想到要定义两个目标函数净收益最大,和总体风险最小,以及两个约束条件,用的资金总额不超过M,每种投资额为非负数。但实际上,我们可以对模型做出简化,即将多目标规划优化为单目标规划问题。
思路一:在实际投资中,投资者承受风险的程度是不一样的,我们可以先给定一个a,为此我们可以做出固定风险水平,优化收益的单目标规划模型。由于a是任意给定的风险损失率,不同的投资者有不同的风险承受能力,为了衡量风险损失率a对投资方案的影响,以固定步长对a做出增量,进行循环搜索,最后模拟出风险损失率与收益之间的关系。matlab代码如下(这里定义了M为1)
clc,clear
a=0;%先给定一个风险损失率
store = [];%定义一个空矩阵存储每一次的决策
hold on
while a<0.05%以给定步长循环搜索
c=[-0.05,-0.27,-0.19,-0.185,-0.185];%目标函数系数
A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];%不等式约束的系数矩阵
b=a*ones(4,1);%不等式约束的常数项
Aeq=[1,1.01,1.02,1.045,1.065];%等式约束
beq=1;
LB=zeros(5,1);
[x,Q]=linprog(c,A,b,Aeq,beq,LB);
Q=-Q;
plot(a,Q,'*k');
a=a+0.001;
end
xlabel('a'),ylabel('Q')
现画出投资组合与风险损失率的关系如下图,可以发现投资越分散,投资者承担的风险就越小,这与题意一致。这说明冒险的投资者会出现集中投资的情况,而保守的投资者则尽量分散投资。
风险损失率与收益的关系如上图所示。可以看出风险损失率与收益存在一定的正相关的关系,说明在一定范围内,风险损失率越大,收益就越高。同时,注意到在a=0.005附近出现了一个转折点,在该点左边,风险增加很少时,利润的增幅很大,在这一点右边时,利润增长的很缓慢,所以对于风险和收益没有特殊偏好的投资者来说,应该选择曲线的转折点作为最优投资组合。
最终在综合考虑净收益和总体风险的情况下,结果为:
a = 0.006
存入银行:0
S1: 0.240000000000000
S2: 0.400000000000000
S3: 0.109090909090909
S4: 0.221220657276995