目录
- 1 模型概述
- 2 模型流程
- 2.1 建立递阶层次结构
- 2.2 构造判断矩阵
- 2.3 一致性检验
- 2.4 计算权重
- 2.4.1 算术平均法
- 2.4.2 几何平均法
- 2.4.3 特征值法
- 2.5 计算各方案的得分
- 3 编写代码
- 4 模型局限性
1 模型概述
层次分析法(The analytic hierarchy process, 简称AHP),是建模比赛中最基础的模型之一。
引用场景:主要用于解决 评价类 {\color{Red}评价类 } 评价类 问题(例如:选择哪种方案最好、哪位运动员或者员工表现的更优秀)。
思路:评价类问题可以用打分解决
- 定指标,每个指标有一个权重,权重和为1
- 针对每一个指标打分
- 计算总分数
使用打分法解决问题,实际上只需要完成下面这张表格(权重表)即可:
解决评价类问题,首先考虑以下三个问题:
- 我们评价的目标是什么?
- 我们为了达到这个目标有哪几种可选的方案?
- 评价的准则或者说指标是什么?(比赛题目一般不会给出,需要我们查阅相关资料)
❗️ 注意:
- 一般而言,前两个问题的答案是显而易见的,第三个问题的答案需要我们根据题目中的背景材料、常识 以及 网上搜集到的参考资料 (优先选择知网或者万方、百度学术、谷歌学术等平台搜索相关的文献)进行结合,从中筛选出最合适的指标。(优先在别人发表的论文中寻找指标会显得很专业)
- 要是没有搜索到相关文献,可以通过小组成员讨论,在网上搜索别人或专家的看法,并提供一个很厉害的网站 虫部落
2 模型流程
例如:小明同学想出去旅游,在查阅了网上的攻略后,他初步选择了苏杭、北戴河和桂林三地之一作为目标景点。
请你确定评价指标、形成评价体系来为小明同学选择最佳的方案。
2.1 建立递阶层次结构
假如我们查询了资料后选择了以下五个指标:
- 景点景色
- 旅游花费
- 居住环境
- 饮食情况
- 交通便利程度
分析系统中各因素之间的关系,建立系统的递阶层次结构,如下图所示:
❗️注意:
- 如果用到了层次分析法,那么这个层次结构图要放在建模论文中。
draw.io
2.2 构造判断矩阵
接下来,我们的关键就是填好这张权重表格
❗️注意:
- 在确定影响某因素的诸因子在该因素中所占的比重时,遇到的主要困难是这些比重常常不易定量化。此外,当影响某因素的因子较多时,直接考虑各因子对该因素有多大程度的影响时,常常会因考虑不周全、顾此失彼而使决策者提出与他实际认为的重要性程度不相一致的数据,甚至有可能提出一组隐含矛盾的数据。
——选自司守奎[kuí]老师的《数学建模算法与应用》
问题:所以,一次性考虑这五个指标之间的关系,往往考虑不周。
解决方法:两个两个指标进行比较,最终根据两两比较的结果来推算出权重
如果用1‐9表示重要程度(见下表),请你两两比较上述这五个指标对于选择最终的旅游景点的重要性。
所以在填这张权重表格之前,我们需要对于同一层次的各元素关于上一层次中某一准则的重要性进行两两比较,构造判断矩阵
任何评价类模型都具有主观性:
- 理想:采用专家群体判断
- 现实:几乎都是自己填的(论文中也不说是怎么来的,就直接写就行),但是也要结合实际
1️⃣ 判断矩阵 O-C
上面这个表是一个 5 × 5 5×5 5×5 的方阵,我们记为 A A A,对应的元素为 a i , j a_{i,j} ai,j
这个方阵有如下特点:
- a i , j a_{i,j} ai,j 表示的意义是,与指标 j j j相比, i i i 的重要程度。
- 当 i = j i=j i=j 时,两个指标相同,因此同等重要记为 1 1 1,这就解释了主对角线元素为 1 1 1
- a i , j > 0 a_{i,j}>0 ai,j>0且满足 a i , j × a j , i = 1 a_{i,j}×a_{j,i}=1 ai,j×aj,i=1 (我们称满足这一条件的矩阵为 正互反矩阵 {\color{Red}正互反矩阵 } 正互反矩阵)
❗️ 注意:
- 在层次分析法中,我们构造的判断矩阵都是正互反矩阵
实际上,上面这个矩阵就是层次分析法中的 判断矩阵 {\color{Red}判断矩阵 } 判断矩阵
2️⃣ 判断矩阵C-P
❗️注意:
- 判断矩阵中的元素只能是1至9和它们的倒数,有些文章中填入了其他的数(例如3/2、5/4),这是不可以的。
2.3 一致性检验
在填写判断矩阵的时候,可能会出现一个问题,如下:
若正互反矩阵满足 a i , j × a j , k = a i , k a_{i,j}×a_{j,k}=a_{i,k} ai,j×aj,k=ai,k,我们称其为 一致矩阵 {\color{Red}一致矩阵 } 一致矩阵
另外,如果一个正互反矩阵的各行(列)之间呈倍数关系,那么它一定是一致矩阵
❗️注意:
- 在使用判断矩阵求权重之前,必须对其进行一致性检验
- 只有非一致矩阵才需要进行一致性检验,如果我们的判断矩阵本身就是一个一致矩阵(明显的各行各列成倍数关系),那么没必要进行一致性检验
对判断矩阵进行 一致性检验 {\color{Red}一致性检验 } 一致性检验,其主要思想是,检验我们构造的判断矩阵和一致矩阵是否有太大的差别。
判断矩阵越不一致时,最大特征值与 n 相差就越大
一致性检验的步骤:
- 计算一致性指标
CI
, C I = λ m a x − n n − 1 CI=\frac{\lambda_{max}-n }{n-1} CI=n−1λmax−n - 查找对应的平均随机一致性指标
RI
(RI
我们只需要会查表即可,不用管怎么来的)
- 计算一致性比例
CR
, C R = C I R I CR=\frac{CI}{RI} CR=RICI- 如果
CR < 0.1
, 则可认为判断矩阵的一致性可以接受,继续计算被比较元素对于该准则的相对权重; - 否则,需要对判断矩阵进行修正(往一致矩阵上调整,一致矩阵的各行或列成倍数关系)
- 如果
2.4 计算权重
上述,我们已经得到了判断矩阵,那么我们如何根据判断矩阵计算权重呢?
三种方法计算权重,强烈建议在比赛时三种方法都使用,在论文中加入:
以往的论文利用层次分析法解决实际问题时,都是采用其中某一种方法求权重,而不同的计算方法可能会导致结果有所偏差。为了保证结果的 稳健性 {\color{Red} 稳健性} 稳健性 ,本文采用了三种方法分别求出了权重后计算平均值,再根据得到的权重矩阵计算各方案的得分,并进行排序和综合分析,这样避免了采用单一方法所产生的偏差,得出的结论将更全面、更有效。
2.4.1 算术平均法
使用数学符号表示如下(可以放到论文中):
2.4.2 几何平均法
2.4.3 特征值法
权重计算完成后,我们就可以将计算结果填入权重表中:
汇总结果得到权重矩阵:
我们可以得到使用特征值法求得的权重矩阵,根据此矩阵,我们可以计算出每个旅游景点的得分。
2.5 计算各方案的得分
类似的,我们可以得到北戴河得分为 0.245 0.245 0.245,桂林得分为 0.455 0.455 0.455,因此最佳的旅游景点是桂林。
❗️注意:这里用EXCEL计算可大大减轻工作量,提示
F4
锁定单元格
3 编写代码
本例中的判断矩阵:
[1, 1/2, 4, 3, 3;
2, 1, 7, 5, 5;
1/4, 1/7, 1, 1/2, 1/3;
1/3, 1/5, 2, 1, 1;
1/3, 1/5, 3, 1, 1]
也可以写成一行(最后一行后面的分号可要可不要):
[1, 1/2, 4, 3, 3;2, 1, 7, 5, 5;1/4, 1/7, 1, 1/2, 1/3;1/3, 1/5, 2, 1, 1;1/3, 1/5, 3, 1, 1;]
[1,2,5;
1/2,1,2;
1/5,1/2,1;]
[1,1/3,1/8;
3,1,1/3;
8,3,1;]
[1,1,3;
1,1,3;
1/3,1/3,1;]
[1,3,4;
1/3,1,1;
1/4,1,1;]
[1,1,1/4;
1,1,1/4;
4,4,1;]
代码:
%% 注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。
%% 在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。
%% 因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。
%% 而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。
%% 如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。
disp('请输入判断矩阵A')
A=input('A=');
[n,n] = size(A);
% % % % % % % % % % % % %方法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)) )
% % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
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
🌟 代码优化:
- 如果我们输入的是一个二阶的判断矩阵,请观察结果有什么问题?怎么改进代码来修正这个问题。(提示:二阶判断矩阵一定是一致矩阵)
- 会造成
CR
为NAN
,n=2
时,一定是一致矩阵,所以CI = 0
,我们为了避免分母为0
,将RI
第二个元素改为了很接近0的正数
4 模型局限性
- 评价的决策层不能太多,太多的话 n n n 会很大,判断矩阵和一致矩阵差异可能会很大
- 如果决策层中 指标的数据是已知 的,由于层次分析法有主观性(指标数据是自己填的,不能用层次分析法解决此类问题)那么我们如何利用这些数据来使得评价的更加准确呢?