Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

MengFanjun的博客

这是为了准备国赛突击学习的模型算法,我在原有的基础上加上自己的理解虽然不知道对不对,就是为了记录下自己学的模型他究竟是个什么东西,语言通俗,但是极不准确,只适合做一个大概的了解,建议大家详细的还是要看更专业的文章去学习,但是自己看着还是挺顺眼的,欢迎批评指正,里面我说的程序包就是老哥提供的程序包

视频来源:泰山教育小石老师数学建模教程 【零基础教程】老哥:数学建模算法、编程、写作和获奖指南全流程培训!

ahp决策比较

c1/c2为4表示c1比c2更加重要,如果是数值小于1,则表示其c1没有c2重要 z表示旅游选择要去的目的地,a1,a2,a3,a4,a5表示五个不同的考虑因素,例如,饮食,费用,居住等,b1,b2,b3表示旅游要去的地点

2.层次分析法算法用于多个元素之前,有多个决策条件,决策条件所占的比重不同,根据不同的比重,比较出最符合题目要求的结果; 3.多属性决策模型也是和层次分析算法一样,也是进行多属性元素的决策; 4.比较完多个矩阵后,得到的值,A的矩阵中的值,分别与B1,B2等中的对应第一个数乘起来,才是最终的比较结果

层次分析法使用方法

把代码直接复制到Matlab的命令行中,然后输入判决矩阵A,注意A一定要满足逻辑,不然一致性检验会不通过

插值与拟合

插值与拟合代码使用方法

数据之间有空缺,我们利用代码进行补全

1
2
3
一维插值步骤
1)输入已知数据,x,y
2)输入待插自变量的值x1
1
2
3
4
5
二维插值步骤
1)先输入二维数据的x,y坐标值
2)输入Z数据
3)输入待插点的x,y坐标
4)应用函数插值即可
1
2
3
多项式拟合步骤
(1)输入待拟合数据x,y
(2)输入函数公式进行拟合

灰色预测模型

1.灰色预测模型是通过少量的、不完全的信息,建立出数学模型,并做出预测的一种预测方法,预测是根据过去和现在的发展规律,借助科学的方法对其未来趋势进行预测,描述和分析。 2.运用GM(1,1)的方法对数据进行预测,得出的结果需要检验,检验表格如下

最后拟合出数据的下一个值和下下个值

灰色预测使用方法

1
2
3
4
灰色预测步骤
1)输入前期的小样本数据,要加上中括号
2)输入预测个数
3)运行

dijkatra模型

最短路径问题求解 weight= [0 2 8 1 Inf Inf Inf Inf Inf Inf Inf; 2 0 6 Inf 1 Inf Inf Inf Inf Inf Inf; 8 6 0 7 5 1 2 Inf Inf Inf Inf; 1 Inf 7 0 Inf Inf 9 Inf Inf Inf Inf; Inf 1 5 Inf 0 3 Inf 2 9 Inf Inf; Inf Inf 1 Inf 3 0 4 Inf 6 Inf Inf; Inf Inf 2 9 Inf 4 0 Inf 3 1 Inf; Inf Inf Inf Inf 2 Inf Inf 0 7 Inf 9; Inf Inf Inf Inf 9 6 3 7 0 1 2; Inf Inf Inf Inf Inf Inf 1 Inf 1 0 4; Inf Inf Inf Inf Inf Inf Inf 9 2 4 0;]; [dis, path]=dijkstra(weight,1, 11) 1为起始点,11位终点,根据所给的图形列出矩阵模型,用vi,与 vj进行比较

从起点数组(S)开始,遍历周围的点,从这些点(数组U)中找到距离最短的点,放入起点数组(S)中,就是这样的过程 ### dijkatra模型使用方法

1
可以使用图论软件进行计算

floyd算法

计算最短路径问题 制作好加权距离矩阵,然后写进tulun的m中,用这个算法的时候,可以用dijistra喝floyd两种算法,经过比较,用最合适的

模拟退火模型

用来解决tsp问题,就是一个旅行商要拜访n个城市,要走的路径是每个城市只能拜访一次,而且最后要回到出发的城市,路径选择的目标是要求得路径路程为所有路径之中的最小值。 需要更改的的只有tsp.m里面的城市坐标参数 模拟退火算法主要用于难以准确求出具体的解的问题之中。通过多次迭代,它可以不断地接近最优解。每次求解可能的结果可能都不一样,因为是在不断趋于最优解的。

就是在随机中找到全局的最优解,和爬山算法不同,爬山算法找不到全局的最优解,只能找到部分区间的最优解。 ### 模拟退火使用方法 例子

1
求目标函数f(x)=x1^2+x2^2+8在x1^2-x2>0;-x1-x2^2+2=0约束下的最小值问题  

1
2
3
1.复制代码
2.调整参数,把变量名都改过来
3.执行程序

在这里修改程序参数

1
2
3
%产生随机扰动(3)新解的产生  
sol_new2=sol_new2+rand*0.2;
sol_new1=2-sol_new2^2;

1
2
%检查是否满足约束  
if sol_new1^2-sol_new2>=0 && -sol_new1-sol_new2^2+2==0 && sol_new1>=0 &&sol_new2>=0
1
2
%退火过程  
E_new=sol_new1^2+sol_new2^2+8;%(2)目标函数

种群竞争模型

表示两个种群在竞争后的结果

这是初始条件的配置

1
2
3
4
5
6
7
8
function dx=fun(t,x,r1,r2,n1,n2,s1,s2)
r1=1;%r1和r2都表示为自然增长率
r2=1;
n1=100;%甲种群初始数量
n2=100;%乙种群初始数量
s1=0.5;%表示甲物种的生存能力较强
s2=2;%表示乙物种的生存能力较弱,以1为分界点,大于1,生存能力弱
dx=[r1*x(1)*(1-x(1)/n1-s1*x(2)/n2);r2*x(2)*(1-s2*x(1)/n1-x(2)/n2)];

这是进行运算

1
2
3
4
5
6
7
8
h=0.1;%所取时间点间隔
ts=[0:h:30];%时间区间
x0=[10,10];%初始条件
opt=odeset('reltol',1e-6,'abstol',1e-9);%相对误差1e-6,绝对误差1e-9
[t,x]=ode45(@fun,ts,x0,opt);%使用5级4阶龙格—库塔公式计算
plot(t,x(:,1),'r',t,x(:,2),'b','LineWidth',2),grid;
pause;%r表示为第一个种群,b表示为第二个种群
plot(x(:,1),x(:,2),'LineWidth',2),grid %作相轨线
若要使物种同时存活,主要是改变s1,s2的数值,才能改变竞争的结果,且s1<1,s2<1

排队论

现实生活中的排队现象 排队过程是一个随机过程

1.顾客的输入过程 2.排队结构和排队规则,列间转移的意思是:我排这个队的时候,发现另一个队列人更少,所以我去排另一个了 3.服务结结机构和服务规则 系统运行指标参数,用来评价排队系统的优劣

  • 队长:系统中的顾客数,包括被服务的顾客和正在排队的顾客
  • 排队长:系统中等待服务的顾客数
  • 逗留时间:指一个顾客在系统中的所有时间
  • 等待时间:一个顾客在系统中的排队等待时间
  • 服务强度:

M/M/1排队系统 M/M/S排队系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

s=2;%窗口数量
mu=4;%每小时服务台服务人数
lambda=3;%每小时到达人数
ro=lambda/mu;
ros=ro/s;
sum1=0;

for i=0:(s-1)
sum1=sum1+ro.^i/factorial(i);
end

sum2=ro.^s/factorial(s)/(1-ros);

p0=1/(sum1+sum2);
p=ro.^s.*p0/factorial(s)/(1-ros);
Lq=p.*ros/(1-ros);
L=Lq+ro;
W=L/lambda;
Wq=Lq/lambda;
fprintf('排队等待的平均人数为%5.2f人\n',Lq)
fprintf('系统内的平均人数为%5.2f人\n',L)
fprintf('平均逗留时间为%5.2f分钟\n',W*60)
fprintf('平均等待时间为%5.2f分种\n',Wq*60)

排队论使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
步骤:
1)确定问题是否属于排队论领域
2)确定修理工个数s
3)确定机器源数m
4)找到时间终止点T
5)带入模型即可
function out=MMSmteam(s,m,mu1,mu2,T)
%M/M/S/m排队模型
%s——修理工个数
%m——机器源数
%T——时间终止点
%mu1——机器离开-到达时间服从指数分布
%mu2——修理时间服从指数分布
%事件表:
% p_s——修理工空闲概率
% arrive_time——机器到达事件
% leave_time——机器离开事件
%mintime——事件表中的最近事件
%current_time——当前时间
%L——队长
%tt——时间序列
%LL——队长序列
%c——机器到达时间序列
%b——修理开始时间序列
%e——机器离开时间序列
%a_count——到达机器数
%b_count——修理机器数
%e_count——损失机器数
以上是需要修改的参数

主成分分析法

根据spss进行数据分析,结合多个因素,对一个因素进行分析,例如:对对各城市进行分析,通过城市的多项数据,结合spss计算出F1和F2,最后将F1和F2相加,算出总F,将F排序,得出最终结果。 ### 主成分分析降维使用方法

1
2
3
4
5
6
7
8
9
PCA步骤:

1)对原始数据进行标准化处理

2)计算样本相关系数矩阵

3)计算相关系数矩阵R的特征值和相应的特征向量

4)选择重要的主成分,写出主成分表达式

聚类分析

聚类分析不必事先给出分析的标准,从样本出发,自动进行分析。 进行spss进行分析,主要看的是树状图,冰柱图直接放到论文里面就行,没那么重要 ### 聚类分析使用方法 3种聚类方法区别不大,直接把函数导入进行使用就好 ## 多元回归分析 为了了解多个变量之间是否相关。

虽然自变量和因变量之间没有严格的、确定的函数关系,但可以设法找出最代表他们的数学关系。

BP神经网络模型

关于这个模型我实在不是很理解,所以只能进行一下粗略的阐述,我感觉其实就是用来分类的,将多种元素进行分类 。(上面是我一年前说的话了)这个暑假我又入坑了机器学习,自己也搭建了几个神经网络,他这里说到的BP神经网络的核心其实就是这个BP,反向传播,在python里面我记得有个优化器直接就叫反向传播,这个神经网络分为前向传播和反向传播,反向传播太详细的我也说不清,大概意思就是使每一个神经元更准确

神经网络更多的是用来解决分类问题,但不同于SVM那些,如果数据互相穿插的很多,那SVM会出现过拟合,行不通,所以这个神经网络就是你输入一些数据进行学习,学习几轮之后,再输进去要预测的数值进行分类,现在Matlab的Classification应该是没有python的全,到时候如果能用python做尽量用python

BP神经网络模型使用方法

选择神经网络的判断指标可以由层次分析法进行精确筛选,比如一开始有10个指标,然后利用层次分析法选5个出来,再利用神经网络这5个指标的数据进行分类,结果会更精确

1
2
3
4
5
P的每一行代表一个指标,每一列代表一个元素
P=[-1 -1 2 2 4;
0 5 0 5 7];%-1和0作比较,代表两个元素一个多一个少,剩下的依次类推,两个矩阵列要一致
T=[-1 -1 1 1 -1]; %-1和1代表两个事件的结果,用来进行评价

Performance表示误差,误差小表示其模型合理; Training State表示中间参数的运转过程; 看最后的结果和谁更接近,如果接近-1就是-1的类,如果接近1就是1的类。

遗传算法

求某一个函数的极值问题,解决规划问题中最大值和最小值的关系; ### 遗传算法的使用方法 例子

1
2
3
4
5
6
% 求下列函数的最大值 %
% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %
% 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 。 %
% 将变量域 [0,10] 离散化为二值域 [0,1023], x=0+10*b/1023, 其中 b 是 [0,1023] 中的一个二值数。 %
把所有的函数保存到函数库中
再执行主程序

SVM分类器

在高维空间进行分类 ### SVM分类器使用方法

1
2
3
1.先给出分类样本进行学习
2.再输入新的需要分类的数据
3.再执行以下函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%更新部分值
sum = zeros(n,1);
for k = 1 : n
for i = 1 : n
sum(k) = sum(k) + a(i) * y(i) * K(i,k);
end
end
Wold = Wnew;
Wnew = 0;%更新a后的W(a)
tempSum = 0;%临时变量
for i = 1 : n
for j = 1 : n
tempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j);
end
Wnew= Wnew+ a(i);
end

但我这里更推荐py的算法,直接导入数据就好

K-means算法

先定义一个类,找到类的中心点,然后再判断样本离每个中心点的距离,将这些点在都判断完之后,形成一个大的类,形成大的类以后再重新计算中心点,再将这些中心点进行比较,以此类推。 ### K-means算法使用方法 在演示数据中导入自己的数据,然后执行程序

1
2
3
4
5
6
7
8
9
10
11
12
13
%演示数据
%% 1 random sample
%随机生成三组数据
a = rand(30,2) * 2;
b = rand(30,2) * 5;
c = rand(30,2) * 10;
figure(1);
subplot(2,2,1);
plot(a(:,1), a(:,2), 'r.'); hold on
plot(b(:,1), b(:,2), 'g*');
plot(c(:,1), c(:,2), 'bx'); hold off
grid on;
title('raw data');

蒙特卡洛算法模拟

用大量的数据实现一些确定性问题的计算,通过计算交点下的面积占一个矩形的比例,计算其面积。 ### 蒙特卡洛算法使用方法

1
2
3
4
蒙特卡洛法是经过大量事件的统计结果来实现一些确定性问题的计算。
使用蒙特卡洛法必须使用计算机生成相关分布的随机数。
例如:y = x^2 ,y = 12 - x与X轴在第一象限与X轴围成一个曲边三角形。设计一个随机试验,求该图形的近似值。
利用撒豆子的方法,计算一个图形面积占用另一个图形面积的比例,利用此种方法计算其面积

Topsis算法

基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣方案(分别用最优向量和最劣向量表示),然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。

根据一个矩阵和一个标准矩阵对比,评价哪个矩阵是最好的

Topsis算法使用方法

1
构建好矩阵直接执行程序就OK

回归预测分析

提供一定的原始数据,执行模型,得出新的预测结果。 ### 回归预测分析使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
先修改原始数据
%原始数据
%公路客运量(万人)
glkyl=[12815 15543 19326 22864 26150 28468 30882 39375 45759 49589 52560 48726 51083 56495 62767 83606 92090 101370 107317 108654 111847 112872 116997 126007 128980];
%公路货运量(万吨)
glhyl=[2690 2998 3012 3042 3616 3728 3988 9397 17680 19426 24128 24354 22879 24162 28957 36439 40593 45052 47400 45224 45338 45815 47151 55705 63532];
%市区人数(万人)
sqrs=[47.8 52.2 59 63.1 68.5 70 72 79.2 84.7 88.6 91 93 97.5 103.7 110 123 129.6 132 137.6 141 145 155.5 157 163.1 165.9];
%市区机动车数(万辆)
sqjdcs=[1.2 1.5 1.7 1.8 2.1 2.7 2.9 3.2 3.4 3.7 4.3 4.4 4.5 4.7 5 5.2 5.4 5.7 5.9 6.2 6.3 6.7 7.2 7.5 7.9];
%市区公路面积(万平方公里)
sqglmj=[0.2 0.25 0.25 0.3 0.45 0.5 0.5 0.7 0.7 0.75 0.8 0.8 0.85 1.1 1.25 1.3 1.3 1.5 1.55 1.75 1.8 1.8 2.05 2.1 2.3];
这里是原始数据输入的矩阵
bb=[sqrs;sqjdcs;sqglmj]'; %输入数据矩阵
cc=[glkyl;glhyl]'; %输出数据矩阵

ycc是输出的结果

智能粒子群算法

求函数的极值,求最大值,好处是有动态变化图。 ### 智能粒子群算法使用方法

1
2
3
4
粒子群算法基本步骤
1 找出待优化的目标函数
2 设定种群规模大小(不会设置可直接采用下方代码的)
3 替换掉下方公式即可

小波异常提取

提取异常值,找到异常值之后,画出图像,即可找到异常值 ### 小波异常提取使用方法

1
将数值赋值给cuspamax,然后再直接执行程序

灰色关联分析

构建各个指标之间的关联度,找到谁与标准数据的关联度最大 ### 灰色关联分析使用方法

1
2
3
4
5
6
灰色关联分析步骤
1】确定比较对象(评价对象)(就是数据,并且需要进行规范化处理,就是标准化处理,见下面例题的表格数据)和参考数列(评价标准,一般该列数列都是1,就是最优的的情况)
2】确定各个指标权重,可用层次分析确定
3】计算灰色关联系数
4】计算灰色加权关联度
5】评价分析

小波特征提取

提取出一个图像中具有特征的部分 ### 小波特征提取使用方法

1
直接执行代码

元胞自动机

元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。元胞的变化规则&元胞状态典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。 元胞自动机的应用 元胞自动机已被应用于物理模拟,生物模拟等领域。 元胞自动机的matlab编程 结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。 元胞和规则才构成了元胞自动机,主要适用于模拟地震火灾等情况,因为一处着火,会引燃其他地方,等等,附和元胞自动机的条件 元胞之间通过物理规则来演变的,没有很复杂的函数,每一个元胞根据规则来判断周围环境,然后再去执行。 所以元胞自动机不存在复杂的公式,只存在各种各样的规则

红色代表的是活的,黑色代表的是死的,开始运行后,最后得到的稳定结果,就是火灾模拟后得到的结果

线性规划

视频来源:

老哥数学建模

因为matlab只能求解线性规划问题的最小值,所以,求最大值的时候,要在前面加一个负号

先来做一道例题

1
2
3
4
5
6
7
>> f=[-2;-3;5];%因为题目给的是最大值,所以要变为负号
>> a=[-2,5,-1;1,3,1];%标准形式小于等于,则将2,5,1换号
>> b=[-10;12];%等式右侧值,因为要小于等于,10也换号
>> aeq=[1,1,1];%等式约束,x1+x2+x3=7
>> beq=7;%等式约束,x1+x2+x3=7
>> [x,y]=linprog(f,a,b,aeq,beq,zeros(3,1));%zeros创建三行一列矩阵,表示x1,x2,x3的下限
>> x,y=-y;%要求最大值,y加个负号

答案,解得

1
2
3
4
5
6
7
8
9
10
11
x =

6.4286
0.5714
0

>> y%y的数值要自己输入才能出来

y =

14.5714

下面进行实际问题的解决 下面进行假设

线性规划模型使用方法

1
2
3
4
5
6
7
线性规划步骤
1)定义决策变量
1)构造目标函数
2)寻找限制条件
4)按照步骤带入Matlab函数
线性规划是linprog
非线性规划是quadprog

整数规划

一般都是纯整数规划 整数规划一般用于指派、运输问题 一般会有一个关于产量的限制

图论算法

将顶点、边、行驶时间看作数学概念,就转化为旅行售货员的问题了 V(G)是图上的顶点E(G)是图上的边 一般见到的都是有限图 图的矩阵表示,如果两点相连就是1,不相连就是0,构建一个矩阵 有指向的图就是u1指向u2,矩阵才为1,否则为0 加权的就按照给的权重计算,如果没有指向的话,则是∞ 例:u2没有指向u1的线段,在矩阵中用无穷表示 关联矩阵,竖着写点,横着写线,如果之间相连了就是1,没有相连就是0

关联矩阵加上了方向,相连的正方向为1,反方向为-1 迹和简单链是点可以重合但是轨迹不能重合

二次指数平滑及时间序列预测使用方法

1
2
3
function [Y,S1,S2,a,b] = expsmooth2(Yt,alpha,t)
%Yt:原时间序列;alpha:平滑系数,一般都是0.5;t:预测时长
%Y:预测值;S1/S2:一次/二次指数平滑值;a/b:预测公式参数
1
填写好Yt,alpha还有t,然后执行expsmooth2就可以进行预测了

赛题思路解析学习

1.如何读懂题和定位题目

  • 抓关键词
  • 输入+条件+输出
  • 分析题目之间的关系
  • 按领域分类
  • 按数学模型分类
  • 机场要求保证短途载客车的出租车司机收益,建立模型 第一问建立出的模型,在第二问带入数据。用结果分析第一问的灵敏度 安全的条件指的是不拥挤,利用排队论,设置其变量,保证其达到“不拥挤”这一条件,并且建立评价模型。

2.三次思路法

  • 第一次思路,根据知识储备和经验的基本思路,不要一开始就去读文献;
  • 二次思路,查资料,得到基本可行的思路框架,画流程图/思维导图;
  • 三次思路,找资料+开拓思路+进行取舍;

想一道题的时间不要花太多时间,不能有太多完美主义,把题都做完,心里面不会那么慌;

3.和队友出现分歧怎么办

  • 分工很重要;
  • 考虑完成度和表现形式;

实战——19C

第一问:

  • 找数据
  • 经济学模型
  • (航班数量的处理)聚类分析

第二问 :

  • 搜集机场数据
  • 模型结果和实际结果做对比
  • 灵敏度分析

第三问:

  • 单od多目标优化模型
  • 效率+加权评价

第四问: - 减少排队时间 - 再开一个车道或者不排队 - 经济上的直接补偿

每个模型必须要做灵敏度分析

关于如何做灵敏度分析:因为数据不是那么的准确,用控制变量的思想,横轴是你要变化的量,纵轴是要得出来的结果,

4.如何查找文献

学位论文选读有用的,论文直接从知网找就行。 找综述文章

论文该如何使用? 找关键词和思路,再通过自己的经验化简模型;

模型如何突破思路?

  • 对数据的处理:异常、残缺,服从某种分布;
  • 优化模型:目标函数、决策变量的巧妙切入;
  • 分级评价-多级指标;
  • 加权评判函数:不同的变量和权重(权重是自己来设计的);
  • 阈值-特殊情况;
  • 特殊情况特殊分析;

完善模型

  • 数据处理:异常残缺等;
  • 模型的特殊情况:找到特殊值进行分析;

下面是建模的主要步骤

算出数据之后一定要给出结论

在亚太杯结束后,我会把个人的思路和解决方案放出

详细请见另一篇新的笔记

评论