层次分析法(AHP)+Matlab实现

607 阅读4分钟

学习内容:

1、 了解和掌握层次分析法的有关内容
2、 通过层次分析法的例题,掌握AHP解决评价类问题的方法
3、 matlab代码实现


学习时间:

2020.12.06


学习产出:

图片来源于b站:www.bilibili.com/video/BV1DW…
代码为原创。
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
%**********************************************************************************************************
所用函数:
%判断矩阵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
%********************************************************************
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提供大量函数让我们快速便捷地处理数据求得权重。喜欢的朋友可以点个赞点个关注哦~