层次分析法步骤:
1.列出目标层,准则层,措施层
2.完成相邻两层间判断矩阵
3.对每个判断矩阵使用AHP进行一致性检验
(记录AHP结果Q为权值,同时在对上中两层时记录CI)
4.全部通过AHP对结果使用AHP1进行检验
5.列出表格给出权值排序表
AHP代码如下:
%本程序使用了特征值法,其余方法还有几何平均法、算数平均法
%最后可输出权值矩阵,多决策对一准则
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); %特征值组成对角阵 D,V 是特征向量(列)
max_eig_hang=max(D); %max_eig_hang 代表最大特征值所在行向量
max_eig_value=max(max_eig_hang); %max_eig_value 代表最大特征值
c1=find(D(1,:)==max(max_eig_hang));%c1 代表最大特征值对应的列向量编号
tzx=V(:,c1); %特征向量
%权
quan=zeros(n,1);
for i=1:n
quan(i,1)=tzx(i,1)/sum(tzx);
end
Q=quan;
%一致性检验
CI=(max_eig_value-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];%RI 的值是固定的有表可查
size(RI);
%判断是否通过一致性检验
CR=CI/RI(1,n);
if CR>=0.1
fprintf('没有通过一致性检验\n');
else
fprintf('通过一致性检验\n');
end
end
AHP1代码如下:
%A 代表 A 层(目标-决策)形成的权重,是对A层每次运行AHP后得到的结果,单次作为列向量
%B 的列向量是 B 层(决策-方案)各个权重,同A
% CI是之前通过AHP在中上两层记录的CI,是一个行向量
% n是方案层的个数
function AHP1(A,B,CI,n)
%ending即为方案层相较于目标层的权重
ending = ones(n,1);
a_size = size(A);
a_row = a_size(1);
% A的列数等于目标层个数,此处默认为1
for i=1:n
for j=1:a_row
ending(i)=B(i,j)*A(j,1);
end
end
fprintf("结果权重为:");
ending
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];
CR1 = 0;
CR2 = 0;
size(A)
for i=1:size(A)
CR1 = CR1 + CI(i)* A(i);
CR2 = CR2 + RI(1,n)* A(i);
end
CR = CR1/CR2;
if CR>=0.1
fprintf('未通过一致性检验\n');
else
fprintf('通过一致性检验\n');
end