简单介绍
根据百度百科介绍,层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。
说简单点就是,你在做选择时给各种方案进行打分,然后做出决策这么一个过程。
所以说,层次分析法适合一些需要主观来决策的问题建模,对于已经有相应评分的问题,可以使用TOPSIS来解决。
基本步骤
层次分析法的基本步骤如下面的流程图所示。大体上分为五大部分,
- 建立层次结构
- .填写判断矩阵
- 一致性检验
- 根据判断矩阵计算权重
- 计算最后的得分
下面来举一个计算综测的例子,作为一个成熟的大学生,你要学会自己计算综测了
假设在一所不需要考试不需要考试不需要考试的A大学,有三名同学分别叫小明,小美,小王。班主任小小何需要结合这三名同学的平时表现(德育),聪明程度(智育)以及体育成绩(体育)来给这三名同学打分,从而选出本年度的三好学生。
在上面这个例子中,有个关键词叫“打分”,这很明显就是一个主观问题,而选三好学生则是一个决策问题。
这里假设小小何十分擅长使用层次分析法解决问题,下面请欣赏小小何的建模过程。
首先,小小何画出了这么一张层次结构图
其次,小小何需要构造判断矩阵
这里有几个问题需要说明:
其一,什么是判断矩阵,判断矩阵,顾名思义就是将横纵坐标的因素两两比较,得到一个填满数字的表/矩阵
其二,根据什么构造判断矩阵,我们需要借助一个评判标准来填写判断矩阵,而下面这张表就是我们的评判标准。
其三,要构造多少个判断矩阵,你猜,在本例中,我们首先要对准则层的三个因素(德育,智育,体育)构造一个判断矩阵
在该矩阵中,①值为2,说明德育相较于智育,其重要性介于同等重要和稍微重要之间,②值为4,说明德育相较于体育,其重要性介于稍微重要和明显重要之间,③值为2,说明智育相较于体育,其重要性介于同等重要和稍微重要之间。
注意:判断矩阵都是关于对角线两侧的数都是互为倒数的,所以只要填写右上方/左下方的数字即可。填写的数字介于1到9之间且数字要为整数。
然后我们需要根据准则层的三个因素,依次构造三个判断矩阵
下面这三个判断矩阵是三名同学分别在德育,智育,体育方面的比较。作为一个成熟的大学生,你要学会自己构造判断矩阵了
所以,我们需要构造的判断矩阵的个数应该是准则层因素的个数再加一。怎么构造就不用我多说了吧,自己主观打分就行。
接下来,小小何需要结合判断矩阵,进行一致性检验
注意:不是所有的判断矩阵都需要进行一致性检验
说到一致性检验,就需要了解一个概念:一致矩阵
还记得我们第一次构造的判断矩阵吗,观察下图可以发现,矩阵的每行都成一个比例关系,这里第一行乘以1/2得到第二行,第二行乘以1/2得到第三行,这就是成比例关系,而这个判断矩阵就是一致矩阵。
而一致性检验是留给那些不是一致矩阵的判断矩阵的,所以,如果你构造的判断矩阵恰好是一致矩阵,那就不必进行如下操作了。
对于不是一致矩阵的判断矩阵,一致性检验的步骤也很简单,见下图(图源:清风数学建模课件)
若判断矩阵未通过一致性检验,则需要重新修正(按照每行成比例修正即可),步骤虽然简单,但是怎么计算呢?待会代码部分会有说明,先接着往下看。
下面,小小何根据通过一致性检验的四个判断矩阵,计算权重
其实,有三种方法可以计算权重,分别是算术平均法,几何平均法和特征值法,这里我以算术平均法为例,计算过程如下图所示
接下来只需要按照此方法对另外三个判断矩阵进行权重计算,然后填入下方表格即可。
终于到最后一步了,小小何根据得到的权重表计算最后的得分
当你填完整个权重表后,就可以按照下图所示的方法来计算最后的得分(图源:清风数学建模课件)
恭喜你已经看完整个层次分析法的建模流程,相信聪明的你应该能计算出最后的得分结果。
完整代码
下面的代码,是根据清风老师编写的代码略作改动得到的。
%% 需要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。
%% 如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。
disp('请输入判断矩阵A')
A=input('A=');
[n,n] = size(A);
% % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
[V,D] = eig(A);
Max_eig = max(max(D));
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
% % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;
disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2)./n)
% % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n);
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
% % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )
% % 注意:代码文件仅供参考,一定不要直接用于自己的数模论文中
好了,以上就是层次分析法的主要内容了,还有其他扩展模型我们下次再讨论。
最后最后,推荐一下清风数学建模的视频课程,清风老师yyds~