层次分析法(The analytic hierarchy process,简称AHP)是建模比赛中最基础的模型之一,主要用于解决评价类问题(例如:选择哪种方案最好、哪个运动员或者员工表现更优秀)
目录
例题:小明同学想出去旅游,在查阅网上的攻略后,初步选择苏杭、北戴河和桂林三地之一作为目标景点
解决评价类问题,大家首先要想到以下三个问题:
① 我们评价的目标是什么?
答:为小明同学选择最佳的旅游景点。
② 我们为了达到这个目标有哪几种可选的方案?
答:三种,分别是去苏杭、去北戴河和去桂林。
③ 评价的准则或者说指标是什么?(我们根据什么东西来评价好坏)
答:题目没给相关数据支撑,需要我们确定
一、如何选择指标
一般而言,前两个问题的答案是显而易见的,第三个问题的答案 需要我们根据题目中的背景材料、常识以及网上搜集到的参考资料进 行结合,从中筛选出最合适的指标
1、
2、
假设我们查询资料后选择了以下五个指标:
(1)景点景色
(2)旅游花费
(3)居住环境
(4)饮食习惯
(5)交通便利程度
故可以得到这张图:
二、如何确定指标权重(填写判断矩阵)
1、确定各指标权重
若直接填写每个指标的权重值,则会出现今天的填写值会和明天不一样的现象,故若自己填写权重时采用分而治之的思想,即根据比较两两指标来填写权重值。
两两比较的值对应的标度如下:
如,此题中,进行权重的填写:
由此,可以得到表格
2、确定各方案在各指标中的得分
同理可得
三、各表格的一致性检验
1、问题
2、一致矩阵
一致矩阵特点:一致矩阵中各行(各列)成倍数关系
如以下矩阵为一致矩阵,其各行各列成倍数关系
3、一致性检验步骤
论文写作中,应先进行一致性检验,通过检验后再计算权重,若CR>=0.1,则需要对判断矩阵进行修正,往一致矩阵上调整,一致矩阵各行成倍数关系
四、计算权重
1、一致矩阵计算权重
2、非一致(判断)矩阵计算权重
若用计算一致矩阵的方法计算判断矩阵,则使用每一行的计算结果可能都不同
数学语言的表述方法:
五、计算各景点得分
以往的论文利用层次分析法解决实际问题时,都是采用其中某一种方法求权重,而不同的计算方法可能会导致结果有所偏差。为了保证结果的稳健性,故建议采用了三种方法分别求出了权重后计算平均值,再根据得到的权重矩阵计算各方案的得分,并进行排序和综合分析,这样避免了 采用单一方法所产生的偏差,得出的结论将更全面、更有效。
此处我们可以使用excel表格计算权重表格来大大减轻工作量:要点使用F4+Fn可以锁定单元格
(1)在第一个要计算的地方填写 “=....",其中指标对应的单元格要按Fn+F4锁定
(2)剩余的结果通过拖动进行自动填写
六、画图
1、论文中需要展示的图片
2、优秀论文中层次分析法图片展示
(1)
(2)
七、层次分析法的局限
八、层次分析法代码
1、一致性检验
clc
CI = (Max_eig - n) / (n-1);%Max_eig为最大特征值,n为矩阵的维数
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]; %注意哦,这里的RI最多支持 n = 15
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
2、算术平均法求权重
clc
disp('请输入判断矩阵A: ')
%A = input('判断矩阵A = ')
A =[1 1 4 1/3 3;
1 1 4 1/3 3;
1/4 1/4 1 1/3 1/2;
3 3 3 1 3;
1/3 1/3 2 1/3 1]
%第一步:将判断矩阵A按照列归一化(每一个元素除以其所在列的和)
Sum_A = sum(A) %默认按列求和,按行求和:Sum_A = sum(A,2)
[n,n] = size(A)%第一个n返回矩阵的行数,第二个返回列数
Sum_A
Stand_A = A./Sum_A
%第二步:将归一化后的各列相加(按列求和)
sum(Stand_A,2)
%第三步:将相加后得到的向量中每一个元素除以n即可得到权重向量
disp('算术平均法求权重的结果为:')
disp(sum(Stand_A,2)/n)
3、几何平均法求权重
%第一步:将A的元素按照行相乘得到一个新的列向量
Prduct_A = prod(A,2) %prod函数是用于乘,加dim = 2维度是行
Prduct_n_A = Prduct_A.^(1/n)
% 这里对每个元素进行乘方操作,因此要加.号哦。 ^符号表示乘方哦 这里是开n次方,所以我们等价求1/n次方
disp('几何平均法的结果是:')
disp(Prduct_n_A./sum(Prduct_n_A))
4、特征值法求权重
%第一步:求出矩阵的最大特征值以及其对应的特征向量
%计算矩阵A的特征值和特征向量的函数是eig(A)
[V,D] = eig(A) %V是特征向量,D是由特征值构成的对角矩阵(除了对角元素外,其他位置元素全为0)
Max_eig = max(max(D))
D == Max_eig
[r,c] = find(D == Max_eig,1)
%找到D中第一个与最大特征值相等的元素的位置,记录它的行和列
%第二步:对求出的特征向量进行归一化即可得到我们的权重
V(:,c)
disp('特征值法求权重的结果为:')
disp(V(:,c)./sum(V(:,c)))
注:该博客的图片和代码均来自b站清风建模,若侵权可联系删除