【数学建模】层次分析法(AHP)+Matlab实现

学习内容:

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提供大量函数让我们快速便捷地处理数据求得权重。喜欢的朋友可以点个赞点个关注哦~

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WSKH0929

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值