学习内容:
1、 了解和掌握层次分析法的有关内容
2、 通过层次分析法的例题,掌握AHP解决评价类问题的方法
3、 matlab代码实现
学习时间:
2020.12.06
学习产出:
图片来源于b站:https://www.bilibili.com/video/BV1DW411s7wi?p=3
代码为原创。
1、 了解和掌握层次分析法的有关内容
2、 通过层次分析法的例题,掌握AHP解决评价类问题的方法
3.matlab代码实现计算权重
%**********************************************************************************************************
clear;clc;
disp("算数平均法=========================================================================================")
%输入判断矩阵
disp("判断矩阵A为:");
A = [1,2,5;1/2,1,2;1/5,1/2,1];
disp(A)
judge = AHP_Tool1(A); %判断矩阵A是不是正互反矩阵
if judge == true %如果是
disp("A是正互反矩阵!!!");
%获取A的行数
n = size(A,1);
%计算判断矩阵每一列之和
sumA = sum(A,1);
%将sumA复制为n行的矩阵
sumA2 = repmat(sumA,n,1);
%用判断矩阵A中的每一项除以sumA2对应的一项
standardA = A./sumA2;
%把上一步得到的结果,每一行求和并除以列数,即求得每一行的平均值
sumStandardA = sum(standardA,2)./size(A,2); % sum(standardA,2)表示每一行求和 ; size(A,2)表示A的列数
disp("算术平均法求得的权重向量为:");
disp(sumStandardA);
else
disp("A不是正互反矩阵!!!请重新运行!!!");
end
%*********************************************************************************************************
clear;clc;
disp("几何平均法=======================================================================================")
%输入判断矩阵
disp("判断矩阵A为:");
A = [1,2,5;1/2,1,2;1/5,1/2,1];
disp(A)
judge = AHP_Tool1(A); %判断矩阵A是不是正互反矩阵
if judge == true
disp("A是正互反矩阵!!!");
%将A的元素按照行相乘得到一个新的列向量
prodA = prod(A,2);
%获得A的行数(列数)
n = size(A,1);
%将新的向量的每个分量开n次方
prodA_n = prodA.^(1/n);
%对该列向量进行归一化,得到权重向量
prodA_n_e = prodA_n./sum(prodA_n,1);
disp("几何平均法求得的权重向量为:");
disp(prodA_n_e);
else
disp("A不是正互反矩阵!!!请重新运行!!!");
end
%*********************************************************************************************************
clear;clc;
disp("特征值法==========================================================================================")
%输入判断矩阵
disp("判断矩阵A为:");
A = [1,2,5;1/2,1,2;1/5,1/2,1];
disp(A)
judge = AHP_Tool1(A); %判断矩阵A是不是正互反矩阵
if judge == true
disp("A是正互反矩阵!!!");
%求出判断矩阵的最大特征值,eig(A)表示A所有特征值组成的列向量
maxValue = max(eig(A));
%D是A的特征向量组成的对角阵;V是A的特征向量组成的矩阵
[V,D] = eig(A);
%利用矩阵的判断,将D中除了最大特征值之外的元素全部变为0
D = (D == maxValue);
%利用find寻找非零元素的位置,r--->该元素所在行数,c--->该元素所在列数
[r,c] = find(D);
%用r或者c在V中找出最大特征值对应的特征向量
ans = V(:,c);
%把ans中每一个元素除以ans那一列的总和,得到归一化后的权重向量
result = ans./sum(ans,1);
disp("特征值法求得的权重向量为:");
disp(result);
else
disp("A不是正互反矩阵!!!请重新运行!!!");
end
%**********************************************************************************************************
%求出判断矩阵的一致性比例
clear;clc;
disp("判断矩阵A为:");
A = [1,2,5;1/2,1,2;1/5,1/2,1];
disp(A)
disp("判断一致性结果为:")
%算出A的最大特征值
maxValue = max(eig(A));
%算出A的行数或者列数(因为A为方阵,所以行数列数都可以)
n = size(A,1);
%CI=(最大特征值-n)/(n-1)
CI = (maxValue-n)/(n-1);
%RI表格☆☆☆注意哦,这里的RI最多支持 n = 15!!!
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
CR=CI/RI(n);
%进行判断:CR小于0.1则可接受;否则不可接受!
if CR<0.1
disp("CR="+CR+"<0.1,所以,该判断矩阵A的一致性可以接受!!!");
else
disp("CR="+CR+">=0.1,所以,该判断矩阵A的一致性不能接受!!!");
end
所用函数:
AHP_Tool1.m
%判断矩阵A是不是正互反矩阵
function [judge] = AHP_Tool1(A)
n = size(A,1);
for i=1:n
for j=1:n
a = A(i,j);
b = A(j,i);
if a*b==1
continue;
else
judge = false;
return;
end
end
end
judge = true;
end
AHP_Tool2.m
function [] = AHP_Tool2(A) %判断矩阵的一致性比例
disp("判断矩阵A为:");
A = [1,2,5;1/2,1,2;1/5,1/2,1];
disp(A)
disp("判断一致性结果为:")
%算出A的最大特征值
maxValue = max(eig(A));
%算出A的行数或者列数(因为A为方阵,所以行数列数都可以)
n = size(A,1);
%CI=(最大特征值-n)/(n-1)
CI = (maxValue-n)/(n-1);
%RI表格☆☆☆注意哦,这里的RI最多支持 n = 15!!!
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
CR=CI/RI(n);
%进行判断:CR小于0.1则可接受;否则不可接受!
if CR<0.1
disp("CR="+CR+"<0.1,所以,该判断矩阵A的一致性可以接受!!!");
else
disp("CR="+CR+">=0.1,所以,该判断矩阵A的一致性不能接受!!!");
end
end
代码运行截图:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了AHP的意义以及使用,还介绍了matlab代码部分,matlab提供大量函数让我们快速便捷地处理数据求得权重。喜欢的朋友可以点个赞点个关注哦~