- 步骤一:构造打分矩阵
a
i
j
表示
x
i
对
x
j
的重要程度,相应的有
a
i
i
=
1
,
a
i
j
a
j
i
=
1
,
a
i
j
>
0
a_{ij} 表示 x_i 对x_j的重要程度,相应的有 a_{ii}=1,a_{ij}a_{ji}=1,a_{ij}>0
aij表示xi对xj的重要程度,相应的有aii=1,aijaji=1,aij>0
-
步骤二 一致性检验
因为打分矩阵是半客观半主管构造的,理论上i对j的重要程度=(i对k)* (k对j)的,即
a i j = a i k a k j a_{ij} = a_{ik}a_{kj} aij=aikakj
由于主观性 上面等式可能不成立 ,比如苹果比西瓜好吃,西瓜比香蕉好吃,但又觉得香蕉比苹果好吃,所以做一致性检验看看在多大程度上能满足上式
计算公式如下
C I = λ m a x − n n − 1 CI = \frac{ \lambda_{max} - n }{ n - 1} CI=n−1λmax−n
C R = C I R I CR = \frac{CI}{RI} CR=RICI
当 C R < 0.1 时可以认为一致性检验通过 当CR<0.1 时可以认为一致性检验通过 当CR<0.1时可以认为一致性检验通过 -
注意事项
进行一致性检验的时候 RI 一般只提供到15 所以注意对于特别大的数据 我们不能使用层次分析法,采用topsis方法。 -
代码
function [Q]=AHP(B)
%Q为权值,B为对比矩阵
%导入判别矩阵B
[n,m]=size(B);
%判别矩阵具有完全一致性
for i=1:n
for j=1:n
if B(i,j)*B(j,i)~=1
fprintf('i=%d,j=%d,B(i,j)=%d,B(j,i)=%d\n',i,j,B(i,j),B(j,i))
end
end
end
%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(B);
tz=max(D);
tzz=max(tz);
c1=find(D(1,:)==max(tz));
tzx=V(:,c1);%特征向量
%权
quan=zeros(n,1);
for i=1:n
quan(i,1)=tzx(i,1)/sum(tzx);
end
Q=quan;
%一致性检验
CI=(tzz-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(1,n);
if CR>=0.1
fprintf('没有通过一致性检验\n');
else
fprintf('通过一致性检验\n');
end
end