问题:目前有三个旅游地可供选择:苏杭、北戴河、桂林。考虑的指标有景色、费用、居住、饮食、旅途,试用层次分析法给出选择方案。
注:自定义的三个函数(ConsistencyCheck、getVector、RI)在代码段末尾。
欢迎交流!
%一个准则层的AHP方法
%-----------------------------------------------------------------
%判断矩阵A
A = [
1 1/2 4 3 3;
2 1 7 5 5;
1/4 1/7 1 1/2 1/3;
1/3 1/5 2 1 1;
1/3 1/5 3 1 1
];
%方案层对准则层不同指标的评价
A1 = [1 2 5;1/2 1 2;1/5 1/2 1];
A2 = [1 1/3 1/8;3 1 1/3;8 3 1];
A3 = [1 1 3;1 1 3;1/3 1/3 1];
A4 = [1 3 4;1/3 1 1;1/4 1 1];
A5 = [1 1 1/4;1 1 1/4;4 4 1];
%-----------------------------------------------------------------
%层次单排序&一致性检验
Ra = ConsistencyCheck(A);
Ra1 = ConsistencyCheck(A1);
Ra2 = ConsistencyCheck(A2);
Ra3 = ConsistencyCheck(A3);
Ra4 = ConsistencyCheck(A4);
Ra5 = ConsistencyCheck(A5);
Single_List = [Ra,Ra1,Ra2,Ra3,Ra4,Ra5];%单排序检验列表
flag = 1;
for i = 1:6
if Single_List(i)>=0.1
disp(["未通过一致性检验,NO.",num2str(i)]);
flag = 0;
end
end
if flag
disp('全部通过单层次一致性检验');
end
%-----------------------------------------------------------------
%求权重向量
Wa = getVector(A);
WB = [getVector(A1) getVector(A2) getVector(A3) getVector(A4) getVector(A5)];
%-----------------------------------------------------------------
%层次总排序&一致性检验
Final_ListCI = [Ra1,Ra2,Ra3,Ra4,Ra5];
Final_ListRI = [RI(length(A1)),RI(length(A2)),RI(length(A3)),RI(length(A4)),RI(length(A5))];
CR = (Final_ListCI*Wa)/(Final_ListRI*Wa);
disp(['CR=',num2str(CR)]);
if CR<0.1
disp('通过总层次一致性检验');
else
disp('未通过总层次一致性检验');
end
Score = WB*Wa;
%-----------------------------------------------------------------
%给出结果
disp('打分如下:')
disp(Score);
index = find(Score==max(Score));
disp(['选择方案:',num2str(index)]);
clear
%-----------------------------------------------------------------
%functions
%计算一致性检验比率
function rate = ConsistencyCheck(A)
max_lamda = max(eig(A));%求最大特征值
n = length(A); %A的维数
CI = (max_lamda-n)/(n-1);%一致性指标
rate = CI/(RI(n)); %一致性比率
end
%计算权重向量
function Vector = getVector(A)
%使用算术平均法求权重
v = transpose(sum(transpose(A)));
Vector = v./sum(v);
end
%计算RI
function RI=RI(n)
N=1000;
scaler=[9 8 7 6 5 4 3 2 1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9];
A=eye(n);
%存放特征值
lamda=zeros(N,1);
% 产生times组随机正互反矩阵
for num=1:N
rank=ceil(17*rand(n));%指标矩阵
% 产生一组n阶正互反矩阵
for i=1:n-1
for j=i+1:n
A(i,j)=scaler(rank(i,j));
A(j,i)=1/A(i,j);
end
end
lamda(num)=max(eig(A)); %求最大特征值
end
RI=(sum(lamda)/N-n)/(n-1);%求RI的值
end