本篇是学习清风的B站课程后完善的层次分析法的Matlab代码,记录下来,也方便自己以后看
提示:以下是本篇文章正文内容,下面案例可供参考
% 层次分析法
%% 输入判断矩阵
clear;clc;
judge_matric=input('请输入判断矩阵:');
disp('输入矩阵为');
disp(judge_matric)
%% 判断判断矩阵是否是正互反矩阵
[m,n]=size(judge_matric);
if m~=n
disp('Warning:判断矩阵存在问题')
judge_matric=input('请重新输入正确的判断矩阵:');
end
for i = 1:1:n
if judge_matric(i,i)~=1
disp('Warning:判断矩阵对角线元素不为1!')
judge_matric=input('请重新输入正确的判断矩阵:');
else
for j = i+1:1:m
if judge_matric(i,j)*judge_matric(j,i)~=1
disp('Warning:判断矩阵存在问题')
judge_matric=input('请重新输入正确的判断矩阵:');
end
end
end
end
disp('经验证,该判断矩阵为正互反矩阵')
%% 判断矩阵是否为一致性矩阵
r = rank(judge_matric);
if r == 1
disp('经验证,该判断矩阵是一致性矩阵')
weight=ccfx_1(judge_matric);
disp('权重为:')
disp(weight)
else
disp('经验证,该判断矩阵不是一致性矩阵,需要进行一致性检验')
disp('进行一致性检验...')
if check(judge_matric)==1
disp('通过一致性检验!')
disp('算数平均值法求得权重为');
weight_1=ccfx_2(judge_matric,1);
disp(weight_1);
disp('几何平均值法求得权重为');
weight_2=ccfx_2(judge_matric,2);
disp(weight_2);
disp('特征值法求得权重为');
weight_3=ccfx_2(judge_matric,3);
disp(weight_2);
else
disp('Waring:CR>0.1,未通过一致性检验,该判断矩阵需要进行修改')
end
end
function weight = ccfx_1(A)
%判断矩阵是一致矩阵时,使用该函数计算权重
% 此处提供详细说明
dim = size(A,1);
weight =zeros(dim,1);
for i = 1:1:dim
weight(i) = A(i,1)/sum(A(:,1));
end
weight=weight';
function flag = check(A)
%一致性检验函数
% 输入为判断矩阵,输出为1表示通过一致性检验,输出为0表示未通过一致性检验
n = size(A,1);
[V,D] = eig(A);
lambda=max(D(:)); %求解最大特征值
CI=(lambda-n)/(n-1);
RI=[0,0,0.52,0.89,1.12,1.26,1.36,1.41,1.46,1.49,1.52,1.54,1.56,1.58,1.59];
CR=CI/(RI(n)+10^(-5));
if CR<0.1
flag=1;
else
flag=0;
end
+当判断矩阵不是一致性矩阵但通过了一致性检验后,使用该函数计算权重,代码如下:
function weight = ccfx_2(A,code)
%当判断矩阵不是一致性矩阵但通过了一致性检验后使用该函数计算权重
%计算权重的方法有三种,算数平均值法(1)、几何平均值法(2)以及特征值法(3)
dim = size(A,1);
%%算数平均值法
if code==1 %算数平均值法
%step one按列归一化
sum_col=sum(A);
SUM_col=repmat(sum_col,dim,1);
A_std=A./SUM_col;
%step two按行求和平均
weight=mean(A_std,2);
end
if code==2 %几何平均值法
%按行相乘
pro_row=prod(A,2);
A_prod=pro_row.^(1/dim);
weight=A_prod./sum(A_prod);
end
if code==3 %特征值法
[V,D]=eig(A); %V的每一列特征向量,D的对角线元素为特征值
%确定最大特征值以及他所在的位置
[M,index]=max(sum(D));
weight=V(:,index)./sum(V(:,index));
end
end