数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享

为是赛前突击,所以就不过多的介绍理论知识了,直接上案例,matlab代码

更加详细例题解析+9.15发比赛思路(14号下架)

公众h:露露IT

目录

1.类比法

2.二分法

3.量纲分析法

4.图论法

5.差分法

6.变分法

7.数据拟合法

8.回归分析法

9.数学规划法(线性规划,非线性规划,整数规划,动态规划,目标规划)

10.机理分析

11.排队方法

12.决策方法

13.层次分析法

14.主成分分析法

15.因子分析法

16.聚类分析法

17.TOPSIS法

18.模糊评判方法

19.时间序列方法

20.灰色理论方法

21. 蒙特卡罗法

22. 现代优化算法(模拟退火算法、遗传算法、神经网络法)等​编辑

23.旅行商问题


1.类比法

无需介绍

2.二分法

二分法的matlab算法实现

在课程学习中自己编程实现的二分法计算非线性方程或者超越方程近似根的算法,

% 二分法求根的matlab算法
function [x0,n]=dichotomy(a,b,err,f_x)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%输入参数a为根的区间左端点                         %
%输入参数b为根的区间右端点                         %
%输入参数err为误差精度                             %
% 输入参数f_x为待求根函数                          %
%输出参数x0为满足精度要求的根                      %
% 输出参数n为迭代的次数                            %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=ceil((log((b-a)./err)./log(2)-1));%求迭代次数
while(sign(f_x(a))==0)%如果a的函数值为0停止迭代输出x0为a的值,迭代次数为0
    x0=a;
    n=0;
    return;
end
while(sign(f_x(b))==0)%如果b的函数值为0停止迭代输出x0为b的值,迭代次数为0
    x0=b;
    n=0;
    return;
end
while(sign(f_x(a))~=sign(f_x(b)))%a、b符号不同进行区间二分
 x0=a/2+b/2;                     %区间中点
 if(sign(f_x(a))~=sign(f_x(x0)))%判断区间中点函数值与区间端点符号
     b=x0;                      %将中点赋值给符号相同的端点
      if(b-a<=err||abs(f_x(x0))<=err)%判断是否满足精度要求
     x0=a/2+b/2;                     
     return;
      else                          %不满足精度循环调用二分法
       dichotomy(a,b,err,f_x);
      end
 else
     a=x0;                          %将中点赋值给符号相同的端点
      if(b-a<=err||abs(f_x(x0))<=err)%判断是否满足精度要求
     x0=a/2+b/2;
     return;
      else                            %不满足精度循环调用二分法
       dichotomy(a,b,err,f_x);
      end
 end
end
    

3.量纲分析法

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第1张图片

π定理的解题步骤:

(1)确定关系式:根据对所研究的现象的认识,确定影响这个现象的各个物理量及其关系式:

(2)确定基本量:从n个物理量中选取所包含的m个基本物理量作为基本量纲的代表,一般取m=3。在管流中,一般选d,v,ρ三个作基本变量,而在明渠流中,则常选用H,v,ρ。

(3)确定π数的个数N(π)=(n-m),并写出其余物理量与基本物理量组成的π表达式

(4)确定无量纲π参数:由量纲和谐原理解联立指数方程,求出各π项的指数x,y,z,从而定出各无量纲π参数。π参数分子分母可以相互交换,也可以开方或乘方,而不改变其无因次的性质。

(5)写出描述现象的关系式或显解一个π参数,或求得一个因变量的表达式。

选择基本量时的注意原则:

1)基本变量与基本量纲相对应。即若基本量纲(M,L,T)为三个,那么基本变量也选择三个;倘若基本量纲只出现两个,则基本变量同样只须选择两个。

2)选择基本变量时,应选择重要的变量。换句话说,不要选择次要的变量作为基本变量,否则次要的变量在大多数项中出现,往往使问题复杂化,甚至要重新求解。

3)不能有任何两个基本变量的因次是完全一样的,换言之,基本变量应在每组量纲中只能选择一个

4.图论法

在这里插入图片描述

function P = dgraf( A )
%A为图的邻接矩阵
%P为图的可达矩阵
n=size(A,1);
P=A;
for i=2:n
    P=P+A^i;
end
P(P~=0)=1;
P;
end

 应用举例:
A=[0 1 1 1;1 0 1 1;1 1 0 1;1 1 10];
P=dgraf(A);
P=[1 1 1 1;1 1 1 1;1 1 1 1;1 1 1 1];

5.差分法

背景差分法是采用图像序列中的当前帧和背景参考模型比较来检测运动物体的一种方法,其性能依赖于所使用的背景建模技术。背景构建的方法有多种,简单的有均值法、中值法,复杂点的有卡尔曼滤波器模型法、单高斯分布模型法、双高斯分布模型法等,这里我用的是均值法。以下是相应的matlab代码和输出结果:
 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%背景差分法
clear all;
clc;
avi=MMREADER('I:\\电影\\test.avi');
VidFrames=read(avi,[10000,10050]);
N=4;                                            
start=11;                                        
threshold=15;
bg(start).cdata=0;
i=1;
for k=start-10:start-1
    bg(k).cdata=rgb2gray(VidFrames(:,:,:,k));
    bg(start).cdata=abs((bg(start).cdata+bg(k).cdata)/i); %均值法构建背景
    i=i+1;
end
for k=1+start:N+1+start                                            
    mov(k).cdata=rgb2gray(VidFrames(:,:,:,k)); %转化成灰度图    
end
[row,col]=size(mov(1+start).cdata);            

alldiff=zeros(row,col,N); 
bgpic=zeros(row,col,1);
bgdata=bg(start).cdata>threshold;
bgpic(:,:,1)=double(bgdata);  
figure(1);
imshow(bgpic(:,:,1))   %输出构建的背景

for k=1+start:N+start
    diff=abs(mov(k).cdata-bg(start).cdata);          
    idiff=diff>threshold;                           
    alldiff(:,:,k)=double(idiff);           
end

j=2;
for k=1+start:N+start
    figure(j);
    imshow(alldiff(:,:,k)) %输出测试帧减去构建背景的效果
    title(strcat(num2str(k),'帧','-','背景'));
    j=j+1;
end

6.变分法

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

I=imread('toys.bmp'); % load image
I=double(I(20:120,10:105)); % cut a piece, convert to double
%%% Parameters
std_n=10; var_n=std_n^2;  % Gaussian noise standard deviation
reduced_pw = 1.5*var_n;   % power to reduce in first phase
sig_w = 5; ws=4*sig_w+1;  % window size
%%%%%%%%%%%%%%

%%% Add noise
In = randn(size(I))*std_n;
I0 = I + In;  % noisy input image
% show original and noisy images
figure(1); imshow(uint8(I)); title('Original')
figure(2); imshow(uint8(I0)); title('Noisy image')
snr_noisy=db(I,I0)

% run normal tv - strong denoising
tic;
J=I0; 
ep_J=0.1; % minimum mean change in image J
J_old=0;
lam=0; iter=10; dt=0.2; ep=1; 

while (mean(mean(abs(J - J_old))) > ep_J),  % iterate until convergence
   J_old=J;
   J=tv(J,iter,dt,ep,lam,I0); % scalar lam
   lam = calc_lam(J,I0,reduced_pw); % update lambda (fidelity term)
end % while
% figure(3); imshow(uint8(J)); title('residue TV')
% snr_residue= db(I,J)

Ir=I0-J;  % Ir scalar
Pr = mean(mean(Ir.^2)); % power of residue
LV = loc_var(Ir,ws,sig_w^2);  % local variance (local  power of the residue )
% P=mean(mean(LV));
Pxy=1*(var_n^2)./LV;  %%  Sxy    inverse proportional to the LV

%%% Varying Lambda
lamxy=zeros(size(I0));
J=I0; J_old=0; 
ep_J=0.001;
%eps=0.01;

while (mean(mean(abs(J - J_old))) > ep_J),  % iterate until convergence
   J_old=J;
   J=tv(J,iter,dt,ep,lamxy,I0); % adaptive lam
   %J=tv(J,iter,dt,ep_J,lamxy,I0);
   lamxy = calc_lamxy(J,I0,Pxy,sig_w); % update lambda (fidelity term)
end % while

figure(3); imshow(uint8(J)); title('Adaptive TV')
snr_adap= db(I,J)
toc
t1=toc


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Run scalar TV denoising for comparision 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tic
J=I0; 
% params
ep_J = 0.01; % minimum mean change in image J
lam=0; J_old=0;
i=0;
while (mean(mean(abs(J - J_old))) > ep_J),  % iterate until convergence
   J_old = J;
   J=tv(J,iter,dt,ep,lam,I0);     % scalar lam
   lam = calc_lam(J,I0,var_n,ep); % update lambda (fidelity term) 
end % for i
% Ir=I0-J;  % Ir scalar
% Pr = mean(mean(Ir.^2)); % power of residue

function Ig=gauss(I,ks,sigma2)
%private function: gauss (by Guy Gilboa):
% Ig=gauss(I,ks,sigma2)
% ks - kernel size (odd number)
% sigma2 - variance of Gaussian

[Ny,Nx]=size(I);
hks=(ks-1)/2;  % half kernel size
if (Ny1)
      xL=mean(I(:,1:hks)')'; xR=mean(I(:,Nx-hks+1:Nx)')';% xL,xR :Ny x 1
   else
      xL=I(:,1); xR=I(:,Nx);
   end
   eI=[xL*ones(1,hks) I xR*ones(1,hks)];   % Ny x  Nx+2hks
   if (hks>1)
      xU=mean(eI(1:hks,:)); xD=mean(eI(Ny-hks+1:Ny,:));  % xU,xD: 1 x Nx+2hks
   else
   	xU=eI(1,:); xD=eI(Ny,:);   
   end

7.数据拟合法

本次拟合是拟合一个给定的函数形式,其中带有位置参数a和b

clc;
clear;
% the first one;
R=[0.68 0.805 0.863 0.893 0.9122 0.916];
x=[1.07 2.24 3.86 5.91 8.5 11.5];
y=R./(1-R);
plot(x,y,'ro')
hold on 

x=x';    % transfer Row matrix to Column matrix;
y=y';

p=fittype('(x/a)*exp(-x/b)')  %  Fitting function
f=fit(x,y,p)  
plot(f,x,y);

8.回归分析法

在 Matlab 中,可以直接调用命令实现回归分析,

( 1 ) [b,bint,r,rint,stats]=regress(y,x) ,其中 b 是回归方程中的参数估计值, bint 是 b 的置信区间, r 和 rint 分别表示残差及残差对应的置信区间。 stats 包含三个数字,分别是相关系数, F 统计量及对应的概率 p 值。

( 2 ) recplot(r,rint) 作残差分析图。

( 3 ) rstool(x,y) 一种交互式方式的句柄命令。


数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第2张图片

例   现有多个样本的因变量和自变量的数据,下面我们利用 Matlab ,通过回归分析建立两者之间的回归方程。
%  一元回归分析
x=[1097 1284 1502 1394 1303 1555 1917 2051 2111 2286 2311 2003 2435 2625 2948 3055 3372];% 自变量序列数据
y=[698 872 988 807 738 1025 1316 1539 1561 1765 1762 1960 1902 2013 2446 2736 2825];% 因变量序列数据
X=[ones(size(x')),x'],pause 
[b,bint,r,rint,stats]=regress(y',X,0.05),pause% 调用一元回归分析函数
rcoplot(r,rint)% 画出在置信度区间下误差分布。
 
b =
 
 -479.8659
    0.9961
 
 
bint =
 
 -724.4248 -235.3071
    0.8836    1.1086
 
stats =
 
   1.0e+04 *
 
    0.0001    0.0356    0.0000    2.0095
 

 数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第3张图片

多元回归分析

%  多元回归分析
%  输入各种自变量数据
x1=[5.5 2.5 8 3 3 2.9 8 9 4 6.5 5.5 5 6 5 3.5 8 6 4 7.5 7]';
x2=[31 55 67 50 38 71 30 56 42 73 60 44 50 39 55 70 40 50 62 59]';
x3=[10 8 12 7 8 12 12 5 8 5 11 12 6 10 10 6 11 11 9 9]';
x4=[8 6 9 16 15 17 8 10 4 16 7 12 6 4 4 14 6 8 13 11]';
% 输入因变量数据
y=[79.3 200.1 163.1 200.1 146.0 177.7 30.9 291.9 160 339.4 159.6 86.3 237.5 107.2 155 201.4 100.2 135.8 223.3 195]';
X=[ones(size(x1)),x1,x2,x3,x4];
[b,bint,r,rint,stats]=regress(y,X)% 回归分析
Q=r'*r
sigma=Q/18
rcoplot(r,rint);
b =
 
  191.9906
   -0.7751
    3.1718
  -19.6849
   -0.4494
 
 
bint =
 
  103.1866  280.7946
   -7.1474    5.5972
    2.0634    4.2802
  -25.1686  -14.2012
   -3.7276    2.8288
 
stats =
 
    0.9034   35.0555    0.0000  644.5831
 
 
Q =
 
   9.6687e+03
 
 
sigma =
 
  537.1526

% 逐步回归
 X1=[x1,x2,x3,x4];
stepwise(X1,y,[1,2,3])% 逐步回归
% X2=[ones(size(x1)),x2,x3];
% X3=[ones(size(x1)),x1,x2,x3];
% X4=[ones(size(x1)),x2,x3,x4];
% [b1,b1int,r1,r1int,stats1]=regress(y,X2)
% [b2,b2int,r2,r2int,stats2]=regress(y,X3);
% [b3,b3int,r3,r3int,stats3]=regress(y,X4);

9.数学规划法(线性规划,非线性规划,整数规划,动态规划,目标规划)

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第4张图片

f=[-3,1,1];
A=[1,-2,1;4,-1,-2]
b=[11;-3];
Aeq=[-2,0,1];
beq=[1];
lb=zeros(3,1);
[x,fval]=linprog(f,A,b,Aeq,beq,lb,[])
x=-x                                                 %上述转换为求最小值,再提个符号变为上述求得目标值

 再来一道相对较难的:

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第5张图片

f=[1/2,1/2,1,1,3/2,3/2,2,2];
Aeq=[1/2,-1/2,-1/2,1/2,-1/2,1/2,1/2,-1/2;1/2,-1/2,-1/2,1/2,1/2,-1/2,-3/2,3/2;1/2,-1/2,-1/2,1/2,-1,1,3/2,-3/2];
beq=[0;1;-1/2];
lb=zeros(8,1);
[x,fval]=linprog(f,[],[],Aeq,beq,lb,[])

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第6张图片

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第7张图片

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第8张图片

%目标函数
c=[3100;3800;3500;2850];     %由目标函数可知有12个未知数,且有一些规律,大家可以自行找一下
c=c*ones(1,3);               %使c变成一个4行3列的函数,并且,刚刚对应于目标函数未知量前面的系数
c=c(:);                    %将c以列排序
%接下来就看约束条件1,可看出未知数前面系数是1,且需要构造一个下面的数组
a1=zeros(3,12);
for i=1:3
    a1(i,4*i-3:4*i)=1;          %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
end
b1=[10 16 8]';
%看约束条件2
a2=zeros(4,12);
for i=1:4                             
    a2(i,i:4:12)=1;                    %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
end
b2=[18 15 23 12]';
%看约束条件3
bb=[480;650;580;390];
a3=zeros(3,12);
for i=1:3
    a3(i,4*i-3:4*i)=bb;           %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
end
b3=[6800 8700 5300]';
a=[a1;a2;a3];
b=[b1;b2;b3];
%看平衡条件
aeq=zeros(2,12);             %如果大家看不懂的话,可以去MATLAB上试一下这段代码最后数组的结果
aeq(1,1:4)=1/10;
aeq(1,5:8)=-1/16;
aeq(2,5:8)=1/16;
aeq(2,9:12)=-1/8;
beq=[0;0];
lb=zeros(12,1);
[x,y]=linprog(-c,a,b,aeq,beq,lb,[])
x=reshape(x,[4,3])         %解出的x值以列排序,将它重组为3*4的数组
x=sum(x')                  %表示舱口1,2,3分别放入货物的总重量
y=-y;                  %目标函数最终的值

10.机理分析

1. 机理方法概述

(1)自身存在的发展规律和理由–分析事物的内在因素,研究其内在关系,得到内在规律—机理模型。
(2)如何从事物的内在因素和条件中研究其内在关系与规律??------机理分析建模方法。
(3)利用机理分析方法所建立的模型有:代数方程、函数方程、微分方程、积分方程和一般的动力学模型等。
一般不能直接应用某种现成的方法得到模型,或直接套用现成的模型得到结论。

2. 机理建模的基本方法
类比分析法:根据一些物理定律,经济规律,数学原理等建立不同事物之间的类比关系,建立问题的数学模型。
量纲分析法:通过分析问题相关物理量的量纲,根据量纲一致性原则建立各物理量之间的关系。
几何分析法:针对实际问题,利用平面几何、立体几何、解析几何的原理等建立模型。
逻辑分析法:一句问题的客观条件和实际情况,利用逻辑推理和逻辑运算建立模型
比较分析法:对照各个事物,确定事务间的共同点和差异点,通过文字描述、图表等方式对事物特征进行分析,建立模型。
推理分析法:在掌握一定的已知事实,数据信息或者因素相关性的基础上,通过因果关系或其他相关关系顺次,逐步地推论得出新结论,建立模型。

3. 机理分析建模流程
针对实际问题-----了解问题背景----分析问题-----明确相关因素和参数-----分析其内在关系—用适当数学方法—建立关联模型–选用实际数据–确定未知数据—求解模型—用结果解释实际问题—用实际数据或模拟检验模型—进一步扩展模型。

例:人才吸引力评价(2018深圳杯A题)—中国大学生在线可看此论文
将定性分析转换成定量分析
发展前景
经济收入
社会环境
问题的关键:首先搞清楚:什么是人才吸引力?水平如何?优势与不足?如何提升?
(1)柯布–道格拉斯函数
人才吸引力:发展前景、经济收入、社会环境
发展前景:历史数据、当前数据
经济收入:人均收入、物价水平
社会环境:空气环境指数、

(2)万有引力定律

(3)类欧姆定律

例:出租车模型
(1)建立合理性模型,并分析不同时空出租车资源的供求匹配程度。
(2)分析相关公司的出租车补贴方案是否对缓解打车难问题有帮助?
(3)试创建一个打车软件服务平台,计一个补贴方案,并论证其合理性
深圳杯的题目----深圳一天的数据 都可以查到
关系的问题===核心问题
基例—情景—数据
1.目前出租车资源的配置是否合理?
2.如何实现出租车供求关系的良好匹配?
3.打车软件是否能有效解决打车难问题?

解决问题:分析与出租车供求相关的因素和关系机理,建立问题的机理模型。
需要收集某区域或城市出租车的相关数据,通过对数据的分析研究,统计挖掘出相关规律,来支持所建立的数学哦行和模型的结论。
出租车运行轨迹数据----------------不需要
优秀论文:-----------中国大学生在线可看到
(1)匹配指标如何建立?出租车里程利用率和供求比率的经验公式
(2)某城市的滴滴数据补贴的前后数据分析,客观形成好单和坏单
要分阶段进行讨论考虑,而不是单单说有利还是无利

通过机理分析建立分区动态实时补贴模型,给出符合实际的补贴方案:针对司机和乘客不同的设计。
在各区各时段的补贴保持平衡的前提下,建立平衡补贴的方程组模型。
 

11.排队方法

% /M/PH/1(k);

% p=stationary_prob(4,beta,S,order,lambda);

function [p,p_minus,p_add,mean,time]=stationary_prob(k,beta,S,lambda) order=length(beta);

e=ones(order,1);

R=lambda*inv(lambda*eye(size(S))-lambda*e*beta-S);

R_k=eye(size(S));

for i=1:k

R_k = R_k+R^i;

end

p0=inv(beta*(R_k-lambda*R^k*inv(S))*e);

p_t=p0;

for i=1:k

p_t=[p_t,p0*beta*R^i];

end

p_t=[p_t,p0*beta*(R^k)*(-lambda*inv(S))];

% the queue length distribution in any time

% add every phase in the same level

p=p0;

for i=1:k+1

sum=0;

for j=1:order

sum =sum+p_t(1+(i-1)*order+j);

end

p=[p,sum];

end

p_minus = p;

% the queue length distribution at departure

% p_add = p_minus(i)/(1-p_minus(k+1))

p_add=[0];

for i=0:k

p_add=[p(k-i+1)/(1-p(k+2)),p_add];

end

% the mean queue length

mean=0;

for i=1:k

mean =mean+i*p(i+1);

end

12.决策方法

CalcEntropy

function shannonEnt=CalcEntropy(typeslist)
% 根据types列表,计算数据集的熵
% typeslist: 数据集的属性列表
% shannonEnt: 熵值计算
shannonEnt = 0;
Length = length(typeslist);
itemList = unique(typeslist); % 去重
pNum = length(itemList);
for i = 1:pNum
    itemLength = length(find(typeslist==itemList(i)));
    pItem = itemLength/Length;
    shannonEnt = shannonEnt-pItem*log2(pItem);
end

splitDataset

function retData=SplitDataset(data,axis,value)
% 按照给定的特征划分数据集
% data: 待划分数据集
% axis: 列数
% value: 特征的返回值
% retData: 划分后数据集
retData = [];
[m,n] = size(data);
for i = 1:m
    if data(i,axis) == value
        retData = [retData;data(i,:)];
    end
end
retData(:,axis) = [];

chooseBestFeatureToSplit

function bestFeature=chooseBestFeatureToSplit(dataset)
% 找到最好的划分指标
% dataset: 数据集
% bestFeature: 最优指标 num数值
[m,n] = size(dataset);
numFeatures = n-1;
originEntropy = CalcEntropy(dataset(:,n));   % 初始熵
bestInfoGain = 0.0;  % 熵变化最大值
bestFeature = -1;    % 最佳特征
for i = 1:numFeatures
    uniqueVals = unique(dataset(:,i));
    tmpEntropy = 0.0;
    for j = 1:length(uniqueVals)
        subDataset = SplitDataset(dataset,i,uniqueVals(j));
        prob = length(subDataset(:,1))/m;
        tmpEntropy = tmpEntropy+prob*CalcEntropy(subDataset);
    end
    infoGain = originEntropy-tmpEntropy;
    if infoGain > bestInfoGain
        bestInfoGain = infoGain;
        bestFeature = i;
    end
end

createTree

function tree=createTree(fatherNode, level, Edge, dataset, labels)
% 递归创建决策树
% fatherNode: 父节点
% level: 所属层次
% Edge: 边的属性
% dataset: 数据集
% labels: 特征属性
global tree;
branch = struct('level',level+1,'fatherNode',fatherNode,'Edge',Edge,'Node',[]);
[m,n] = size(dataset);
typesList = dataset(:,n);
% 第一种情况 数据集只剩一种type
if length(unique(typesList)) == 1
    branch.Node = typesList(1);
    tree = [tree branch];
    return;
end
% 第二种情况 遍历完所有特征
if length(dataset(1,:)) == 1
    branch.Node = mode(typeslist); % 取众数
    tree = [tree branch];
    return;
end
% 第三种情况
bestFeat = chooseBestFeatureToSplit(dataset);
bestFeatLabel = labels(bestFeat);
branch.Node = bestFeatLabel;
tree = [tree branch];
labels(strcmp(labels,bestFeatLabel)) = [];
featVals = unique(dataset(:,bestFeat));
for i = 1:length(featVals)
    createTree(branch.Node, branch.level, featVals(i), SplitDataset(dataset,bestFeat,featVals(i)), labels);
end

 decisionTree

function decisionTreeModel=decisionTree(dataset,labels)
% 决策树模型训练主函数
% dataset: 数据集
% labels: 特征属性
% decisionTreeModel: 保存模型数据的struct数组
global tree;
tree=struct('level',-1,'fatherNode',[],'Edge',[],'Node',[]);
createTree('root',-1,-1,dataset,labels);
tree(1) = [];
tree(1) = [];
model.Node = tree;
decisionTreeModel = model;

13.层次分析法

基本步骤:
1.建立层次分析结构模型。常见的有目标层-准则层-方案层模型。

2.构造成对比较矩阵。常用的有1-9尺度。尺度大小取决于下层的元素个数。

3.计算权向量并作一致性检验。引入一致性指标CI,CI越大,不一致越严重。引入随机一致性指标RI。定义一致性比率CR=CI/RI。CR<0.1时,通过一致性检验。

4.计算组合权向量作组合一致性检验,组合权向量可作为决策的定量依据。方案层对目标层的组合权向量为ww*w。选择组合权向量大的元素作为输出结果。

代码:
 

function Example9_12
clc
a=[1,1,1,4,1,1/2
   1,1,2,4,1,1/2
   1,1/2,1,5,3,1/2
   1/4,1/4,1/5,1,1/3,1/3
   1,1,1/3,3,1,1
   2,2,2,3,3,1];%一致矩阵
[x,y]=eig(a);eigenvalue=diag(y);lamda=max(eigenvalue);
ci1=(lamda-6)/5;cr1=ci1/1.24
w1=x(:,1)/sum(x(:,1))
b1=[1,1/4,1/2;4,1,3;2,1/3,1];
[x,y]=eig(b1);eigenvalue=diag(y);lamda=eigenvalue(1);
ci21=(lamda-3)/2;cr21=ci21/0.58
w21=x(:,1)/sum(x(:,1))
b2=[1  1/4   1/5;4   1   1/2;5   2    1];
[x,y]=eig(b2);eigenvalue=diag(y);lamda=eigenvalue(1);
ci22=(lamda-3)/2;cr22=ci22/0.58
w22=x(:,1)/sum(x(:,1))
b3=[1    3  1/3;1/3   1    1/7;3   7    1];
[x,y]=eig(b3);eigenvalue=diag(y);lamda=eigenvalue(1);
ci23=(lamda-3)/2;cr23=ci23/0.58
w23=x(:,1)/sum(x(:,1))
b4=[1   1/3   5;3   1    7;1/5  1/7   1];
[x,y]=eig(b4);eigenvalue=diag(y);lamda=eigenvalue(1);
ci24=(lamda-3)/2;cr24=ci24/0.58
w24=x(:,1)/sum(x(:,1))
b5=[1   1    7;1   1    7;1/7  1/7   1];
[x,y]=eig(b5);eigenvalue=diag(y);lamda=eigenvalue(1);
ci25=(lamda-3)/2;cr25=ci25/0.58
w25=x(:,1)/sum(x(:,1))
b6=[1   7   9;1/7  1   1 ;1/9   1   1];
[x,y]=eig(b6);eigenvalue=diag(y);lamda=eigenvalue(1);
ci26=(lamda-3)/2;cr26=ci26/0.58
w26=x(:,1)/sum(x(:,1))
w_sum=[w21,w22,w23,w24,w25,w26]*w1
ci=[ci21,ci22,ci23,ci24,ci25,ci26];
cr=ci*w1/sum(0.58*w1)

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第9张图片

14.主成分分析法

主成分分析法是利用降维的思想,把多指标转化为少数几个综合指标(即主成分),其中每个主成分都能够反映原始变量的大部分信息,且所含信息互不重复。这种方法在引进多方面变量的同时将复杂因素归结为几个主成分,使问题简单化,同时得到的结果更加科学有效的数据信息。例如,做一件上衣需要测量很多尺寸,如身高,袖长,腰围,胸围,肩宽等十几项指标,但是厂家不可能把尺寸型号分这么多,而是从这十几种指标中综合成几个少数的综合指标作为分类型号,例如综合成反映身高,反映胖瘦和反应特体的三项指标,这就是主成分的思想。主要的方法有特征值分解,SVD(奇异值分解)和NMF(非负矩阵分解);

第一步采用的是中心化标准化,即元素值减去均值除以标准差,得到的结果服从标准正态分布;

3:matlab代码实现:

x=[1.2,3,-1.1,17;  
    1.5,5,-3,22;  
    1.3,4.0,-2,19;  
    0.7,3,-2.3,11  
    1,4,-1.2,20.8];  
stdr=std(x);                %求各变量的标准差;  
[n,m]=size(x);               %矩阵的行与列  
sddata=x./stdr(ones(n,1),:);         %标准化变换  
[p,princ,egenvalue]=princomp(sddata);  %调用主成分  
p=p(:,1:3);                          %输出前3主成分系数;  
sc=princ(:,1:3);                       %前3主成分量;  
egenvalue;                              %相关系数矩阵的特征值,即各主成分所占比例;  
per=100*egenvalue/sum(egenvalue);       %各个主成分所占百分比;  

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第10张图片

15.因子分析法

我国上市公司赢利能力与资本结构的实证分析

这些公司的资本结构有 ​ 销售净利润,资产净利润,净资产收益率,销售毛利率,以及资产负利率 

clc,clear;
​
load ssgs.txt
x = ssgs(:,[1:4]);
y = ssgs(:,5);
​
n = size(ssgs,1);
​
% 数据标准化 求相关系数矩阵
x = zscore(x);
r = corrcoef(x);
​
% 进行主成分分析的相关计算,求旋转后的载荷矩阵
[vec1,val,con1] = pcacov(r);
f1 = repmat(sign(sum(vec1)),size(vec1,1),1);
vec2 = vec1.*f1;
f2 = repmat(sqrt(val)',size(vec2,1),1);
a = vec2.*f2;

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第11张图片

% 提出num个主因子的载荷矩阵
num = 2;
am = a(:,[1:num]);
​
% am 旋转变换,bm 为旋转后的载荷矩阵
[bm,t] = rotatefactors(am,'method','varimax');

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第12张图片

% am 旋转变换,bm 为旋转后的载荷矩阵
[bm,t] = rotatefactors(am,'method','varimax');
​
% bt 前部分是旋转后的载荷矩阵  后部分为没有旋转的载荷矩阵
bt = [bm,a(:,[num+1:end])];
​
% 计算贡献因子
con2 = sum(bt.^2);
​
% 可以查看一下旋转后的贡献率
check = [con1,con2'/sum(con2)*100];
​
% 旋转后的因子贡献率
rate = con2(1:num)/sum(con2);

 计算得分函数的系数

% 计算得分函数的系数
coef = inv(r)*bm
​
coef =
    0.5060   -0.0450
    0.1615    0.5151
   -0.1831    0.5810
    0.5015   -0.0199
% 计算各个因子得分
score = x*coef;

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第13张图片

% 计算得分的权重
weight = rate/sum(rate);
weight =
    0.5163    0.4837

 数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第14张图片

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第15张图片

% 计算因子 F 与 资产负债 y 的相关系数
[ccoef,p] = corrcoef([Tscore,y]);
​
[d,dt,e,et,stats] = regress(Tscore,[ones(n,1),y]);
d,stats
​
d =
​
    0.8290
   -0.0268
​
​
stats =
​
    0.4882   13.3524    0.0026    0.2745

 数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第16张图片

16.聚类分析法

 基于9*9的矩阵A ,代码如下:
(A 对角线均为1,对称矩阵)

d=1-abs(a);
y=linkage(d,'average');
j=dendrogram(y);
L=cluster(y,'maxclust',3)
for i=1:3
	b=find(L==i);
	b=reshape(b,1,length(b));
	fprintf('第%d 类的有%s\n',i,int2str(b));
End

  >> ep_334
  第1类的有8  9
  第2类的有6  7
  第3类的有1  2  3  4  5
数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第17张图片

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第18张图片

17.TOPSIS法

%第一部分:求熵值
function [s,w]=shang(x)
 x=[ ];%这里输入自己的评价矩阵
 % 函数shang.m, 实现用熵值法求各指标(列)的权重及各数据行的得分
% x为原始数据矩阵
% s返回各行得分, w返回各列权重
[n,m]=size(x); % n=23个国家, m=5个指标
%% 数据的归一化处理
% Matlab2010b,2011a,b版本都有bug,需如下处理. 其它版本直接用[X,ps]=mapminmax(x',0,1);即可
[X,ps]=mapminmax(x',0,1);
 ps.ymin=0.002; % 归一化后的最小值
ps.ymax=0.996; % 归一化后的最大值
ps.yrange=ps.ymax-ps.ymin; % 归一化后的极差,若不调整该值, 则逆运算会出错
X=mapminmax(x',ps);
 % mapminmax('reverse',xx,ps); % 反归一化, 回到原数据
X=X';  % X为归一化后的数据
 %% 计算第j个指标下,第i个记录占该指标的比重p(i,j)
 for i=1:n
     for j=1:m
         p(i,j)=X(i,j)/sum(X(:,j));
     end
 end
 %计算第j个指标的熵值e(j)
 k=1/log(n);
 for j=1:m
     e(j)=-k*sum(p(:,j).*log(p(:,j)));
 end
 d=ones(1,m)-e;  % 计算信息熵冗余度
w=d./sum(d);    % 求权值w
%第二部分:TOPSIS综合评价
function [ output_args ] = TOPSIS(A,W)
A=[];%这里输入自己的评价矩阵
W=[]%这里输入上面求得的权重
%A为决策矩阵,W为权值矩阵,M为正指标所在的列,N为负指标所在的列
 [ma,na]=size(A);          %ma为A矩阵的行数,na为A矩阵的列数
 for i=1:na
     B(:,i)=A(:,i)*W(i);     %按列循环得到[加权标准化矩阵]
end
V1=zeros(1,na);            %初始化正理想解和负理想解
V2=zeros(1,na);
BMAX=max(B);               %取加权标准化矩阵每列的最大值和最小值
BMIN=min(B);               %
for i=1:na
     %if i<=size(M,2)        %循环得到理想解和负理想解,注意判断,不然会超个数
     V1(i)=BMAX(i);
     V2(i)=BMIN(i);
     %end
     %if i<=size(N,2)
     %V1(N(i))=BMIN(N(i));
     %V2(N(i))=BMAX(N(i));
     %end
end
for i=1:ma                 %按行循环求各方案的贴近度
     C1=B(i,:)-V1;
     S1(i)=norm(C1);        %S1,S2分别为离正理想点和负理想点的距离,用二阶范数
     C2=B(i,:)-V2;
     S2(i)=norm(C2);
     T(i)=S2(i)/(S1(i)+S2(i));     %T为贴近度
end
output_args=T

18.模糊评判方法

%% 模糊评判矩阵
R1 = [0.8 0.2 0; 0.7 0.3 0] % 学习成绩的模糊综合评判矩阵
R2 = [0 0 1; 0.5 0.5 0; 0 0.6 0.4] % 竞赛成绩
%R3 = [] R4=[] 这里就不举例计算了 
%% 各因素的权重
A = [0.4 0.3 0.2 0.1];% 一级指标
A1 = [0.6 0.4]; %二级指标:学习成绩
A2 = [0.5 0.3 0.2];%竞赛成绩
A3 = [0.5 0.3 0.2];%个人荣誉
A4 = [1];%志愿服务
%% 二级指标的隶属度计算
B1 = A1*R1
B2 = A2*R2
%直接假设B3 B4 的值,就不用A3*R3 A4*R4计算了
B3 = [0.4 0.2 0.4]
B4 = [0.1 0.8 0.1]
 
%% 一级指标的模糊综合评判矩阵
R = [B1;B2;B3;B4]
%% 一级指标的隶属度计算
B = A*R

19.时间序列方法

%% 时间序列预测
%输入原始数据
A = [970279
1259308
1127571
1163959
1169540
1076938
991350
953275
951508
904434
889381
864015
836236
]';
%判断是否平稳,使用ADF检验
h = adftest(A)
%B = dtrend(A)
B = diff(A)
H = adftest(B)
figure(1)
autocorr(B)
figure(2)
parcorr(B)
x = A;
w = B;
n = 2;
s = 1;
m1 = length(A); %原始的数据的个数
for i = s+1:m1
    y(i-s) = x(i) - x(i-s);%进行周期差分变换
end
ToEstMd = arima('ARLags',1,'MALags',1:1,'Constant',0);%指定模型的结构
[EstMd,EstParamCov,LogL,info] = estimate(ToEstMd,w');%模型拟合 
w_Forecast = forecast(EstMd,n,'Y0',w');
yhat = y(end) + cumsum(w_Forecast); %一阶差分的还原值
for j = 1:n
    x(m1 + j) = yhat(j) + x(m1+j-s); %x的预测值
end
x(1:end)

20.灰色理论方法

第一步:确定分析数列。

确定反映系统行为特征的参考数列和影响系统行为的比较数列。反映系统行为特征的数据序列,称为参考数列。影响系统行为的因素组成的数据序列,称比较数列。

(1)参考数列(又称母序列)为Y = Y ( k ) ∣ k = 1 , 2... n Y={Y(k) | k = 1,2...n}Y=Y(k)∣k=1,2...n;

(2)比较数列(又称子序列)为X i = X i ( k ) ∣ k = 1 , 2... n , i = 1 , 2... m X_i={X_i(k) | k = 1,2...n},i = 1,2...mX 
i

 =X 
i

 (k)∣k=1,2...n,i=1,2...m。

第二步,变量的无量纲化

由于系统中各因素列中的数据可能因量纲不同,不便于比较或在比较时难以得到正确的结论。因此在进行灰色关联度分析时,一般都要进行数据的无量纲化处理。主要有一下两种方法
  
(1)初值化处理:x i ( k ) = x i ( k ) x i ( 1 ) , k = 1 , 2... n ; i = 0 , 1 , 2... m x_i(k)=\frac{x_i(k)}{x_i(1)},k=1,2...n;i=0,1,2...mx 
i

 (k)= 

i

 (1)

i

 (k)

 ,k=1,2...n;i=0,1,2...m

(2)均值化处理:x i ( k ) = x i ( k ) x i ˉ , k = 1 , 2... n ; i = 0 , 1 , 2... m x_i(k)=\frac{x_i(k)}{\bar{x_i}},k=1,2...n;i=0,1,2...mx 

 ,k=1,2...n;i=0,1,2...m

其中k kk 对应时间段,i ii 对应比较数列中的一行(即一个特征)

第三步,计算关联系数

记△ i ( k ) = ∣ y ( k ) − x i ( k ) ∣ \triangle_i(k)=|y(k)-x_i(k)|△ 
i

 (k)=∣y(k)−x 
i

 (k)∣,则
  

ρ ∈ ( 0 , ∞ ) \rho\in(0,\infty)ρ∈(0,∞),称为分辨系数。ρ越小,分辨力越大,一般ρ的取值区间为( 0 , 1 ) (0,1)(0,1),具体取值可视情况而定。当ρ ≤ 0.5463 \rho\le0.5463ρ≤0.5463时,分辨力最好,通常取ρ = 0.5 ρ = 0.5ρ=0.5。

第四步,计算关联度

因为关联系数是比较数列与参考数列在各个时刻(即曲线中的各点)的关联程度值,所以它的数不止一个,而信息过于分散不便于进行整体性比较。因此有必要将各个时刻(即曲线中的各点)的关联系数集中为一个值,即求其平均值,作为比较数列与参考数列间关联程度的数量表示,关联度r i riri公式如下:


 (k),k=1,2,Λ,n

第五步,关联度排序

关联度按大小排序,如果r 1 < r 2 r1 < r2r1

在算出X i ( k ) Xi(k)Xi(k)序列与Y ( k ) Y(k)Y(k)序列的关联系数后,计算各类关联系数的平均值,平均值r i riri就称为Y ( k ) Y(k)Y(k)与X i ( k ) Xi(k)Xi(k)的关联度。

灰色关联分析的实例
下表为某地区国内生产总值的统计数据(以百万元计),问该地区从2000年到2005年之间哪一种产业对GDP总量影响最大。

年份    国内生产总值    第一产业    第二产业    第三产业
2000    1988    386    839    763
2001    2061    408    846    808
2002    2335    422    960    953
2003    2750    482    1258    1010
2004    3356    511    1577    1268
2005    3806    561    1893    1352
步骤1:确立母序列

在此需要分别将三种产业与国内生产总值比较计算其关联程度,故母序列为国内生产总值。若是解决综合评价问题时则母序列可能需要自己生成,通常选定每个指标或时间段中所有子序列中的最佳值组成的新序列为母序列。

步骤2:无量纲化处理

在此采用均值化法,即将各个序列每年的统计值与整条序列的均值作比值,可以得到如下结果:

年份    国内生产总值    第一产业    第二产业    第三产业
2000    0.7320    0.8361    0.6828    0.7439
2001    0.7588    0.8838    0.6885    0.7878
2002    0.8597    0.9141    0.7812    0.9292
2003    1.0125    1.0440    1.0237    0.9847
2004    1.2356    1.1069    1.2833    1.2363
2005    1.4013    1.2152    1.5405    1.3182
步骤3:计算每个子序列中各项参数与母序列对应参数的关联系数

其中ξ i ( k ) ξ_i(k)ξ 
i

 (k)表示第i ii个子序列的第k kk个参数与母序列(即0序列)的第k kk个参数的关联系数,$\rho\ 为 分 辨 系 数 取 值 范 围 在 为分辨系数取值范围在为分辨系数取值范围在[0,1]$,其取值越小求得的关联系数之间的差异性越显著,在此取为0.5进行计算可得到如下结果:

年份    S01(t)    S02(t)    S03(t)
2000    0.4755    0.6591    0.8933
2001    0.4299    0.5739    0.7681
2002    0.6358    0.5465    0.5767
2003    0.7527    0.8993    0.7758
2004    0.4228    0.6661    1.0000
2005    0.3358    0.4037    0.5322
步骤4:计算关联度

用公式r i = 1 n ∑ k = 1 n ξ i ( k ) , k = 1 , 2 , Λ , n r_i=\frac{1}{n}\sum_{k=1}^n\xi_i(k),k=1,2,\Lambda,nr 

 (k),k=1,2,Λ,n, 可以得到r 1 = 0.5088 , r 2 = 0.6248 , r 3 = 0.7577 r1 = 0.5088,r2 = 0.6248,r3 = 0.7577r1=0.5088,r2=0.6248,r3=0.7577,通过比较三个子序列与母序列的关联度可以得出结论:该地区在2000年到2005年期间的国内生产总值受到第三产业的影响最大。
 

clc;
close;
clear all;
x=xlsread('data.xlsx');
x=x(:,2:end)';
column_num=size(x,2);
index_num=size(x,1);

% 1、数据均值化处理
x_mean=mean(x,2);
for i = 1:index_num
    x(i,:) = x(i,:)/x_mean(i,1);
end
% 2、提取参考队列和比较队列
ck=x(1,:)
cp=x(2:end,:)
cp_index_num=size(cp,1);

%比较队列与参考队列相减
for j = 1:cp_index_num
    t(j,:)=cp(j,:)-ck;
end
%求最大差和最小差
mmax=max(max(abs(t)))
mmin=min(min(abs(t)))
rho=0.5;
%3、求关联系数
ksi=((mmin+rho*mmax)./(abs(t)+rho*mmax))

%4、求关联度
ksi_column_num=size(ksi,2);
r=sum(ksi,2)/ksi_column_num;

%5、关联度排序,得到结果r3>r2>r1
[rs,rind]=sort(r,'descend');

21. 蒙特卡罗法

蒙特卡洛法(随机取样法)也称为计算机随机模拟方法,它源于世界著名的赌城——Monte Carlo。它是基于对大量事件的统计结果来实现一些确定性问题的计算。使用蒙特卡洛法必须使用计算机生成相关分布的随机数。

eg:
y = x^2 ,y = 12 - x与X轴在第一象限与X轴围成一个曲边三角形。设计一个随机试验,求该图形的近似值。
其图形如下图所示:
 

x=0:0.25:12
y1=x.^2;
y2=12-x;
plot(x,y1,x,y2)
xlabel('x');ylabel('y');
legend('y1=x^2','y2=12-x');
title('王晨绘制');
axis([0 15 0 15]);
text(3,9,'交点');
grid on

数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第19张图片

设计的随机试验的思想如下:在矩形区域[0,12]*[0.9]上产生服从均与分布的10^7个随机点,统计随机点落在曲边三角形内的个数,则曲边三角形的面积近似于上述矩形的面积乘以频率

x=unifrnd(0,12,[1,10000000]);
y=unifrnd(0,9,[1,10000000]);
frequency=sum(y=3)
area=12*9*frequency/10^7

 数学建模常用方法 | matlab代码 | 二十三种数学建模方法 |2022赛前突击 |模型代码 |比赛比用、简单高效| 分享_第20张图片

22. 现代优化算法(模拟退火算法、遗传算法、神经网络法)等

%%main.m
T=1000; %初始化温度值
T_min=1e-12; %设置温度下界
alpha=0.98; %温度的下降率
k=1000; %迭代次数(解空间的大小)
 
x=getX; %随机得到初始解
while(T>T_min)
    for I=1:100
        fx=Fx(x);
        x_new=getX;
        if(x_new>=-2 && x_new<=2)
            fx_new=Fx(x_new);
            delta=fx_new-fx;
            if (delta<0)
                x=x_new+(2*rand-1);
            else
                P=getP(delta,T);
                if(P>rand)
                    x=x_new;
                end
            end
        end
    end
    T=T*alpha;
end
disp('最优解为:')
disp(x)
 
%%getX.m
function x=getX
    x=4*rand-2;
end
 
%%Fx.m
function fx=Fx(x)
    fx=(x-2)^2+4;
end
 
%%getP.m
function p=getP(c,t)
    p=exp(-c/t);
end
 

 23.旅行商问题

clear all;close all;clc

n=20;                   %城市个数
temperature=100*n;      %初始温度
iter=100;               %内部蒙特卡洛循环迭代次数

%随机初始化城市坐标
city=struct([]);
for i=1:n
    city(i).x=floor(1+100*rand()); 
    city(i).y=floor(1+100*rand());
end

l=1;                            %统计迭代次数
len(l)=computer_tour(city,n);   %每次迭代后的路线长度  
netplot(city,n);                %初始旅行路线

while temperature>0.001     %停止迭代温度
    
    for i=1:iter     %多次迭代扰动,一种蒙特卡洛方法,温度降低之前多次实验
        len1=computer_tour(city,n);         %计算原路线总距离
        tmp_city=perturb_tour(city,n);      %产生随机扰动
        len2=computer_tour(tmp_city,n);     %计算新路线总距离
        
        delta_e=len2-len1;  %新老距离的差值,相当于能量
        if delta_e<0        %新路线好于旧路线,用新路线代替旧路线
            city=tmp_city;
        else                        %温度越低,越不太可能接受新解;新老距离差值越大,越不太可能接受新解
            if exp(-delta_e/temperature)>rand() %以概率选择是否接受新解
                city=tmp_city;      %可能得到较差的解
            end
        end        
    end
    l=l+1;
    len(l)=computer_tour(city,n);   %计算新路线距离
    temperature=temperature*0.99;   %温度不断下降
  
end  
figure;
netplot(city,n);    %最终旅行路线

figure;
plot(len)  

你可能感兴趣的:(算法)