层次分析法
层次分析法(The analytic hierarchy process)简称AHP,在20世纪70年代中期由美国运筹学家托马斯·塞蒂(T.L.saaty)正式提出。它是一种定性和定量相结合的、系统化、层次化的分析方法。
层次分析法的基本思路与人对一个复杂的决策问题的思维、判断过程大体上是一样的。不妨用假期旅游为例:假如有3个旅游胜地A、B、C供你选择,你会根据诸如景色、费用和居住、饮食、旅途条件等一些准则去反复比较这3个候选地点.首先,你会确定这些准则在你的心目中各占多大比重,如果你经济宽绰、醉心旅游,自然分别看重景色条件,而平素俭朴或手头拮据的人则会优先考虑费用,中老年旅游者还会对居住、饮食等条件寄以较大关注。其次,你会就每一个准则将3个地点进行对比,譬如A景色最好,B次之;B费用最低,C次之;C居住等条件较好等等。最后,你要将这两个层次的比较判断进行综合,在A、B、C中确定哪个作为最佳地点。
以上摘自https://wiki.mbalib.com/wiki/层次分析法
层次分析法的基本步骤
1、建立层次结构模型。在深入分析实际问题的基础上,将有关的各个因素按照不同属性自上而下地分解成若干层次,同一层的诸因素从属于上一层的因素或对上层因素有影响,同时又支配下一层的因素或受到下层因素的作用。最上层为目标层,通常只有1个因素,最下层通常为方案或对象层,中间可以有一个或几个层次,通常为准则或指标层。当准则过多时(譬如多于9个)应进一步分解出子准则层。
2、构造成对比较阵。从层次结构模型的第2层开始,对于从属于(或影响)上一层每个因素的同一层诸因素,用成对比较法和1—9比较尺度构造成对比较阵,直到最下层。
3、计算权向量并做一致性检验。对于每一个成对比较阵计算最大特征根及对应特征向量,利用一致性指标、随机一致性指标和一致性比率做一致性检验。若检验通过,特征向量(归一化后)即为权向量:若不通过,需重新构造成对比较阵。
4、计算组合权向量并做组合一致性检验。计算最下层对目标的组合权向量,并根据公式做组合一致性检验,若检验通过,则可按照组合权向量表示的结果进行决策,否则需要重新考虑模型或重新构造那些一致性比率较大的成对比较阵。
以上摘自https://wiki.mbalib.com/wiki/层次分析法
以此题为例:选择旅游地的时候,需要考虑景色,费用,居住,饮食,旅途等因素。
建立层次结构模型
构造成对比较矩阵
比较第 i 个元素与第 j 个元素相对上一层某个因素的重要性时,使用数量化的相对权重aij来描述。设共有 n 个元素参与比较,则A称为成对比较矩阵。
成对比较矩阵中aij的取值可按下述标度进行赋值。aij在 1-9 及其倒数中间取值。
例如:选拔干部考虑5个条件:品德,才能,资历,年龄,群众关系。某决策人用成对比较法,得到成对比较阵如下:
a14 = 5 表示品德与年龄重要性之比为 5,即决策人认为品德比年龄重要。
以例题:选择旅游地的时候,加入只考虑景色、费用、居住三个,并且有3个旅游景点P1 P2 P3,其中3个景点费用是1200,980,1350。
构建比较矩阵如下图:
a12,a13,a23分别就代表三个考虑因素之间的重要性选择。
一致性检验
暂时不需要理解
计算组合权向量并做组合一致性检验
P1 P2 P3对于准则层中“景色”的成对比较矩阵
1 3 3
0.33 1 1
0.33 1 1
计算出各项得分:0.143、0.4285、0.4285
P1 P2 P3对于准则层中“居住”的成对比较矩阵
1 3 3
0.33 1 1
0.33 1 1
计算出各项得分:0.143、0.4285、0.4285
P1 P2 P3对于准则层中“费用”的成对比较矩阵不需要建立。
各项得分是:1200/(1200+980+1350)=0.34
980/(1200+980+1350=0.28
1350/(1200+980+1350=0.38
最后帖上两段示例代码:
代码一-------------------------------------
clc
clear all;
A=[1 1/2 1 1/2 1/3;
2 1 2 1 1;
1 1/2 1 1 1/2;
2 1 1 1 1/2;
3 1 2 2 1]; %评价矩阵
[n,n]=size(A);
[v,d]=eig(A);
r=d(1,1);
CI=(r-n)/(n-1);
RI=[0 0 0.58 0.9 1.12 1.24 1.32 1.41 1.45 1.49 1.52 1.54 1.56 1.58 1.59];
CR=CI/RI(n);
if CR<0.1 CR_Result='yes';
else CR_Result='no';
end
w=v(:,1)/sum(v(:,1));
w=w';
disp('the result is')
disp(['coincidence indicator:',num2str(CI)])%一致性指标
disp(['consistency ratio:',num2str(CR)])%一致性比例
disp(['Consistency test results:',CR_Result])%一致性检验
disp(['eigenvalue:',num2str(r)])%特征值
disp(['weight vector:',num2str(w)])%权向量
代码二--------------------------------------------
clc;
clear;
A=[1 1.2 1.5 1.5;
0.833 1 1.2 1.2;
0.667 0.833 1 1.2;
0.667 0.833 0.833 1];
%因素对比矩阵A,只需要改变矩阵A
[m,n]=size(A); %获取指标个数
RI=[0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];
R=rank(A); %求判断矩阵的秩
[V,D]=eig(A); %求判断矩阵的特征值和特征向量,V特征值,D特征向量;
tz=max(D);
B=max(tz); %最大特征值
[row, col]=find(D==B); %最大特征值所在位置
C=V(:,col); %对应特征向量
CI=(B-n)/(n-1); %计算一致性检验指标CI
CR=CI/RI(1,n);
if CR<0.10
disp('CI=');disp(CI);
disp('CR=');disp(CR);
disp('对比矩阵A通过一致性检验,各向量权重向量Q为:');
Q=zeros(n,1);
for i=1:n
Q(i,1)=C(i,1)/sum(C(:,1)); %特征向量标准化
end
Q %输出权重向量
else
disp('对比矩阵A未通过一致性检验,需对对比矩阵A重新构造');
end