前言:MATLAB是数学建模比赛中较受欢迎的一种编程语言,为了满足一些参加数学建模比赛小伙伴的需求,我们创建了这个专题,并会在接下来的一段时间里定期地为大家推送一些算法文章。
今天我们学习的是数学建模中的层次分析法。
一、层次分析法的介绍
层次分析法(Analytic Hierarchy Process,简称 AHP),最早是由美国运筹学家 T. L. Saaty 教授于上世纪 70 年代初期提出的一种决策方法。它的出现为我们处理决策类问题提供了一种新的思路。
在解决评价类问题时,我们通常采用的做法是对问题进行定量分析来对不同的方案做出不同的评价或是赋予不同的权重。
但当我们面对一些受主观因素影响的问题,如选择旅游目的地时,旅游地的景色、旅途、居住、饮食等都会影响着最终方案的选择。这些都受个人因素影响,而且往往缺少定量数据很难进行定量分析,这时我们就可以采用一种介于定性和定量之间分析的方法——层次分析法。
二、运用层次分析法建模过程:
运用层次分析法建模,大体上可按下面四个步骤进行:
(a)建立递阶层次结构模型;
(b)构造出各层次中的所有判断矩阵;
(c)层次单排序及一致性检验;
(d)层次总排序及一致性检验。
下面通过具体实例介绍一下这种方法和实现代码。
问题:假期旅游有 3 个旅游胜地供你选择,试确定一个最佳地点。在此问题中,你需要根据景色、费用、居住、气候、饮食和旅途条件等一些准则去反复比较 3 个侯选地点,选择最适合的一种方案。
1、建立递阶层次结构模型
运用层次分析法解决问题首先将问题层次化,构造出一个有层次的模型。
一般分为三个层次:
目标层:只有一个元素,一般它是分析问题的预定目标或理想结果。
准则层:这一层次中包含了为实现目标所涉及的中间环节,它可以由若干个层次组成,包括所需考虑的准则、子准则。
措施层:这一层次包括了为实现目标可供选择的各种措施、决策方案等。
问题中构建的层次模型为:
2、构造出各层次中的所有判断矩阵
判断矩阵:因子进行两两比较建立的比较矩阵。构建方法为每次取两个因子和
,以
表示
和
对因素Z的影响大小之比,全部比较结果即为判断矩阵
。
注意:判断矩阵必须为互反矩阵,即必须满足:
为了更好的确定的值,层次分析法的创造者Saaty提出引用数字 1~9 及其倒数作为标度。
问题中所建立的判断矩阵为:
准则层中的判断矩阵:
方案层中的判断矩阵:
3、层次单排序及一致性检验
层次单排序:判断矩阵对应于最大特征值λ 的特征向量W ,经归一化后即为同一层次相应因素对于上一层次某因素相对重要性的排序权值,这一过程称为层次单排序。
一致性检验的步骤:
(i)计算一致性指标CI:
(ii)查找相应的平均随机一致性指标 RI
(ⅲ)计算一致性比例CR,当CR < 0.10 时,认为判断矩阵的一致性是可以接受的,否则应重新构造判断矩阵,直到满足条件为止
问题中的层次单排序及一致性检验:
准则层:
归一化处理后的特征向量
W=(0.1574 0.1871 0.1889 0.0492 0.1221 0.2953)
CR= 0.0567 一致性可以接受
措施层:
归一化处理后的特征向量
W1=(0.1365 0.6250 0.2385)
W2=(0.0974 0.3331 0.5695)
W3=(0.2426 0.0879 0.6694)
W4=(0.2790 0.6491 0.0719)
W5=(0.4667 0.4667 0.0667)
W6=(0.7986 0.1049 0.0965)
CR1=0.0158
CR2=0.0212
CR3=0.0061
CR4=0.0559
CR5=0.0000
CR6=0.0061 一致性可以接受
4、层次总排序及一致性检验
层次总排序:层次总排序是指自上而下地将层次单排序下的权重进行合成。
一致性检验:计算一致性比例CR,当CR < 0.10 时,认为判断矩阵的一致性是可以接受的
问题中的层次总排序结果:
问题中的层次总排序检验及一致性检验:
CR=0.0121 一致性可以接受
故最终旅游方案选择方案一。
层次分析法源代码
clc,clear
%准则层判断矩阵
z=[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/3;
2 2 2 3 3 1 ];
%方案层判断矩阵
%景色
f1=[1 1/4 1/2;
4 1 3;
2 1/3 1];
%居住
f2=[1 1/4 1/5;
4 1 1/2;
5 2 1 ];
%旅途
f3=[1 3 1/3;
1/3 1 1/7;
3 7 1];
%饮食
f4=[1 1/3 5;
3 1 7;
1/5 1/7 1];
%费用
f5=[1 1 7;
1 1 7;
1/7 1/7 1];
%气候
f6=[1 7 9;
1/7 1 1;
1/9 1 1];
r=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]; %一致性指标
n1=6;
n2=3;
f=[f1;f2;f3;f4;f5;f6];
[x,y]=eig(z);
lamda=max(diag(y));
num=find(diag(y)==lamda);
zw=x(:,num)/sum(x(:,num));
disp('层次单排序检验指标为:')
cr1=((lamda-6)/(n1-1))/r(n1)%层次单排序准则层一致性检验指标
if cr1>0.1
error("一致性检验不通过")
end
fw=zeros(3,6);
crr=zeros(1,6);
cr2=zeros(1,6);
k=1;
for i=3:3:18
a=f(i-2:i,:);
[x,y]=eig(a);
lamda=max(diag(y));
num=find(diag(y)==lamda);
fw(:,k)=x(:,num)/sum(x(:,num));
cr=((lamda-n2)/(n2-1))/r(n2);%层次单排序方案层一致性检验指标
if cr>0.1
error("一致性检验不通过")
end
crrr=(lamda-n2)/(n2-1);
cr2(1,k)=cr;
crr(1,k)=crrr;
k=k+1;
end
disp('层次总排序一致性检验指标:')
crr2=sum(crr*zw)/sum(r(n2)*zw)%层次总排序一致性检验指标检验
disp('准则层权值:')
zww = zw'
disp('方案层单排序权值:')
fw
w=fw*zw;%层次总排序
[m,n] = max(w);
disp((sprintf('最终选择的方案为方案%d',n)))
本期内容由小编编程手撰写,编程手有丰富的数学建模与matlab编程经验。鉴于此,matlab爱好者公众号计划推出【数学建模】系列,将逐一揭开数学建模的“神秘”面纱,与大家一起在数学建模的海洋里畅游。
若您有过数学建模的获奖经历,并有一定的matlab编程基础,欢迎将您的成功经验整理成文推送给我们与大家分享。
欢迎大家向matlab爱好者公众号投稿!
投稿请加群
参考资料:
[1]《数学建模算法与程序》司守奎
[2]《数学建模》姜启源,谢金星,叶俊
图片来源:由 Junah Rosales 在Pixabay上发布