利用Matlab实现AHP模型


前言

闲来无事,写一下文章为生活加点料。本文简述了本人对于传统、简单的评价类模型之一的层次分析法(AHP)模型的理解和看法。利用高考生综合各个因素选择高校的例子,结合Matlab实现AHP模型,当然,利用Python也是同样的可行。(文章中出现的高校信息是本人学习过程中模拟的数据,毫无实际意义,仅为学习所用。)


以下是本篇文章正文内容,下面案例可供参考

一、用途

可用来评价、分析以及选择有多个影响因素的多个决策、目标或者方案等。从而选出“最优解”。如下:

图片出自《层次分析法在太阳镜产品质量评价中的应用》。

二、基本思路

流程图

下面将按着流程图的各个步骤对AHP进行剖析。

三、具体步骤

1.得到关系矩阵(判断矩阵)

即先确定各个指标(影响因素自身)的判断矩阵和各个影响因素与各个目标(方案、决策等)的判断矩阵。

  1. 各个指标(影响因素自身)的判断矩阵
    在这里插入图片描述
  2. 各个影响因素与各个目标(方案、决策等)的判断矩阵。
    在这里插入图片描述

2.求得指标自身的权重

求得权重的方法主要有3种:算术平均法、几何平均法以及特征值法。(出处不同叫法可能会有所差异)

  1. 算术平均法
    在这里插入图片描述
    即具体公式如下所示:
    在这里插入图片描述

  2. 几何平均法
    在这里插入图片描述
    即具体公式如下所示:
    在这里插入图片描述

  3. 特征值法

对所求的最大特征值所对应的特征向量即是未归一化的权重向量,对该特征向量进行归一化处理,即可得各个指标的权重。

相对于三种方法,我本人较为喜欢用第三种方法,因为Matlab已经提供了现有的函数来求得矩阵的特征向量与特征值。(如:eig(A) function)
但出于结果的稳健性,可以利用三种方法分别求出权重,再加以求平均即可。

eg:
在这里插入图片描述

3.一次性检验

一次性检验,是为了说明你所使用的判断矩阵以及得到的权重是否合理、科学。为了保证结果的正确性,应该在每一个判断矩阵进行一次性检验。
具体方法如下:

  1. 计算一次性指标CI
    在这里插入图片描述
    其中式中的 λ 为判断矩阵的特征值。
  2. 查表得到一致性指标RI

在这里插入图片描述
3) 计算得到一致性比例CR
在这里插入图片描述

如果CR<0.10,则该判断矩阵的一致性是可以接受的。否则,这说明判断矩阵数据不合理,得需要修改。

eg:
在这里插入图片描述
在这里插入图片描述

最后

总结各组权重信息,计算出各个目标(决策、或者方案等)的最后得分,从而得出“最优解”:
在这里插入图片描述

四、个人体会

虽然说AHP是一种经典的、相对科学的决策、评判算法,但是不免还存在这许多的不足:

例如:
填写判断矩阵时过于主观(一般判断矩阵的填写都是向专家咨询),从而导致所得结果很大程度会受决策者的主观影响。
此次就是会发现层次分析法并没有引用过多的数据,我认为这也是它的一大弊病,缺乏数据的支持。

但是不免也是一种经典的算法,学习一下也无妨。多学无害。
那…那那怎么才能解决AHP的这些不足呢?笔者在这里想到了结合AHP或者熵权法的TOPSIS算法,我们下次再聊叭!!!=3=

五、附页(AHPMatlab代码)

A=input('A=');
[n,m] = size(A);

Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;

disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2)./n)

Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n);
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
 
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )

CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 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];  %注意哦,这里的RI最多支持 n = 15
% 这里n=2时,一定是一致矩阵,所以CI = 0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
CR=CI/RI(n);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
    disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');
else
    disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
end
  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就是莫世冰。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值