层次分析分为两个方面:一个是有数据的情况下使用层次分析,一个是无数据的情况下是使用层次分析:
(1)无数据的情况下使用层次分析
参考姜启源《数学模型》第四版,因为没有数据,比如景色、舒适度,这些没有具体数据的,使用层次分析的时候,不仅需要做准则层对于目标层的成对比较矩阵,也要做方案层对于准则层的成对比较矩阵。并且只要有成对比较矩阵就一定要做一个一致性检验。
准则层对于目标层的成对比较矩阵:目的是为了确定各个评价指标的权重
方案层对于准则层的成对比较矩阵:目的是为了让没有数据的指标转化为有数据的。
(2)有数据的情况下使用层次分析
有数据一般不使用层次,往往需要结合其他算法,比如模糊综合评价,TOPSIS法、灰色关联等等。这个时候层次分析的作用就是确定指标的权重。
因为有了数据就不需要做方案层对于准则层的成对比较矩阵了,因为即使做了成对比较矩阵,由数据确定的成对比一致性检验一定会通过。并且一次性指标CI=0,即成对比矩阵一定是一致阵。也就是层次分析结合灰色关联,TOPSIS法什么类的只需要确定一下准则层的成对比较矩阵的一致性就行了
(3)两者相互结合怎么办?
我们直达无数据的时候,使用成对比较矩阵,最终得到“权向量”加起来恰好是1,对于有数据可以做一个转化,就是把有数据全部转化为加起来恰好是1的。
下面是例子
---------------------------------------------------------------------
如下例:选择旅游地的时候,加入只考虑景色、费用、居住三个,并且有3个旅游景点P1 P2 P3,其中3个景点费用是1200,980,1350.
第一步:层次结构
目标层:选择旅游地
准则层:景色、费用、居住
方案层:去P1,去P2或者去P3
第二步:构建成对比较矩阵
为了方便,我们用表格代替
1 |
3 |
3 |
0.33 |
1 |
1 |
0.33 |
1 |
1 |
第三步:一致性检验及计算权向量
经过一致性检验,一致性检验CI=0通过【关于一致性检验,可以不需要理解】
计算权向量: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对于准则层中“居住”的成对比较矩阵
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