数学建模(1)--层次分析法
概括
层次分析法(The analytic hierarchy process, 简称AHP),是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。他是建模比赛中最基础的模型之一,主要应用于解决评价类问题(例如:多种方案的评价分析、绩效考核)。
内容介绍
解决评价类问题,首先要想到以下三个问题:
- 我们评价的目标是什么?
- 我们为了达到这个目标有哪几种可选的方案?
- 评价的准则或者说指标是什么?(我们根据什么东西来评价好坏)
对于一般的层次分析恶言,前2个问题是显而易见的,第三个问题的答案需要从问题的背景材料、一般常识及参考资料中去获取,得到适合分析的指标。
实例
小明同学想出去旅游。在查阅了网上的攻略后,他初步选择了苏杭、北戴河和桂林三地之一作为目标景点。
请你确定评价指标、形成评价体系来为小明同学选择最佳的方案。
主要选择了以下五个指标:
- 景点景色
- 旅游花费
- 居住环境
- 饮食情况
- 交通便利程度
对于解决评价类问题,在上文中列举了三个问题,分别是目标、方案、指标,故我们需要对这三个问题进行分析,如下:
1.我们评价的目标是什么?
- 为小明同学选择最佳的旅游景点。
2.我们为了达到这个目标有哪几种可选的方案?
- 三种,分别是去苏杭、去北戴河和去桂林。
3.评价的准则或者说指标是什么?(我们根据什么东西来评价好坏)。
- 景色、花费、居住、饮食、交通。
分析系统中各因素之间的关系,建立系统的递阶层次结构。
权重表格
指标权重 | 苏杭 | 北戴河 | 桂林 | |
---|---|---|---|---|
景色 | ||||
花费 | ||||
居住 | ||||
饮食 | ||||
交通 |
对于这种表格的填写,在确定影响某因素的诸因子在该因素中所占的比重时,遇到的主要困难是这些比重常常不易定量化。此外,当影响某因素的因子较多时,直接考虑各因子对该因素有多大程度的影响时,常常会因考虑不周全、顾此失彼而使决策者提出与他实际认为的重要性程度不相一致的数据,甚至有可能提出一组隐含矛盾的数据。
由于需要确定权重,一次性考虑这五个指标之间的关系,往往考虑不周。所以使用两个两个指标进行比较,最终根据两两比较的结果来推算出权重,例如指标权重下的景色和花费、花费和居住等以此类推。
任何评价类模型都具有主观性:
理想:采用专家群体判断
现实:几乎都是自己填的
判断(成对比较)矩阵
在确定各层次各因素之间的权重时,如果只是定性的结果,则常常不容易被别人接受,因而Saaty等人提出一致矩阵法,即不把所有因素放在一起比较,而是两两相互比较,对此时采用相对尺度,以尽可能减少性质不同的诸因素相互比较的困难,以提高准确度。如对某一准则,对其下的各方案进行两两对比,并按其重要性程度评定等级。aij为要素i与要素j重要性比较结果,下表列出Saaty给出的9个重要性等级及其赋值。按两两比较结果构成的矩阵称作判断矩阵。判断矩阵具有如下性质:
aij=1/aji
因素i比因素j | 量化值 |
---|---|
同等重要 | 1 |
稍微重要 | 3 |
较强重要 | 5 |
强烈重要 | 7 |
极端重要 | 9 |
两相邻判断的中间值 | 2,4,6,8 |
根据上图的判断矩阵表,可利用专家评定法,做出如下所示两两对应的判断矩阵。
景色 | 花费 | 居住 | 饮食 | 交通 | |
---|---|---|---|---|---|
景色 | 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 |
若需要计算上述的苏杭、北戴河与桂林景色等方面的得分,也可以利用专家评定法,做出如下所示两两对应的判断矩阵,评定如下。
Q1:你觉得苏杭的风景和北戴河相比如何?
A1:稍微好一点点吧(介于1‐3之间)
Q2:你觉得苏杭的风景和桂林相比如何?
A2:要明显的好哦(5)
Q3:你觉得北戴河的风景和桂林相比如何?
A3:稍微好一点点吧(介于1‐3之间
做出如下苏杭、北戴河与桂林景色方面得分。
景色 | 苏杭 | 北戴河 | 桂林 |
---|---|---|---|
苏杭 | 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 |
当得到了上述的判断矩阵时候,可能会出现bug,需要将其进行修改,例如下表。
景色 | 苏杭 | 北戴河 | 桂林 |
---|---|---|---|
苏杭 | 1 | 2 | 1 |
北戴河 | 1/2 | 1 | 2 |
桂林 | 1 | 1/2 | 1 |
设 苏杭 = A 北戴河 = B 桂林 = C
苏杭比北戴河景色好一点 A > B
苏杭和桂林景色一样好 A = C
北戴河比桂林景色好一点 B > C
出现了矛盾之处(不一致的现象)
(要是把左表中的2换成更大的数,那么不一致会更加严重)
一致矩阵
所以可以修改成如下所示。
景色 | 苏杭 | 北戴河 | 桂林 |
---|---|---|---|
苏杭 | 1 | 2 | 4 |
北戴河 | 1/2 | 1 | 2 |
桂林 | 1/4 | 1/2 | 1 |
观察上面这两个矩阵的特点,可以得到各行(各列)之间成倍数关系。
所以可以这样认为,如果各行(各列)之间成倍数关系,且是个正负反矩阵,觉可以认为是一致矩阵。
在使用判断矩阵求权重之前,必须对其进行一致性检验, 检验我们构造的判断矩阵和一致矩阵是否有太大的差别。
计算权重
景色 | 苏杭 | 北戴河 | 桂林 |
---|---|---|---|
苏杭 | 1 | 2 | 4 |
北戴河 | 1/2 | 1 | 2 |
桂林 | 1/4 | 1/2 | 1 |
上图的矩阵已经是一致矩阵,对于景色这点而言:(注:这里的重要性有时候解释为满意度更方便理解)苏杭的重要性如果是1,那么北戴河的重要性就是1/2,桂林的重要性就是1/4。
注意,权重一定要进行归一化处理:
苏杭 = 1 /(1+1/2+1/4)
北戴河 =1/2/(1+1/2+1/4)
桂林 = 1/4/(1+1/2+1/4)
因为一致矩阵各行各列成比例,故使用下表判断矩阵进行计算。
算术平均法求权重
第一步:将判断矩阵按照列归一化(每一个元素除以其所在列的和)
第二步:将归一化的各列相加(按行求和)
第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
景色 | 苏杭 | 北戴河 | 桂林 |
---|---|---|---|
苏杭 | 1 | 2 | 5 |
北戴河 | 1/2 | 1 | 2 |
桂林 | 1/5 | 1/2 | 1 |
仅使用第一列的数据,计算出来的权重:
苏杭 = 1 /(1+0.5+0.2)= 0.5882
北戴河 = 0.5 /(1+0.5+0.2)= 0.2941
桂林 = 0.2 /(1+0.5+0.2)= 0.1177
使用第二列的数据,计算出来的权重:
苏杭 = 2 /(2+1+0.5)= 0.5714
北戴河 = 1 /(2+1+0.5)= 0.2857
桂林 = 0.5 /(2+1+0.5)= 0.1429
使用第三列的数据,计算出来的权重:
苏杭 = 5 /(5+2+1)= 0.625
北戴河 = 2 /(5+2+1)= 0.25
桂林 = 1 /(5+2+1)= 0.125
综合上述三列,我们求平均权重:
苏杭 = (0.5882+0.5714+0.625)/3=0.5949
北戴河 = (0.2941+0.2857+0.25)/3=0.2766
桂林 = (0.1177+0.1429+0.125)/3=0.1285
- 第一步:将判断矩阵按照列归一化(每一个元素除以其所在列的和)
景色 | 苏杭 | 北戴河 | 桂林 |
---|---|---|---|
苏杭 | 0.5882 | 0.5714 | 0.625 |
北戴河 | 0.2941 | 0.2857 | 0.25 |
桂林 | 0.1177 | 0.1429 | 0.125 |
- 第二步:将归一化的各列相加(按行求和)
未归一化的权重 | |
---|---|
苏杭 | 0.5882+0.5714+0.625=1.7846 |
北戴河 | 0.2941+0.2857+0.25=0.8298 |
桂林 | 0.1177+0.1429+0.125=0.3856 |
- 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
未归一化的权重 | |
---|---|
苏杭 | 1.7846 / 3 = 0.5949 |
北戴河 | 0.8298 / 3 = 0.2766 |
桂林 | 0.3856 / 3 = 0.1285 |
几何平均法求权重
第一步:将A的元素按照行相乘得到一个新的列向量
第二步:将新的向量的每个分量开n次方
第三步:对该列向量进行归一化即可得到权重向量
算术平均法权重 | 几何平均法权重 | |
---|---|---|
苏杭 | 0.5949 | 0.5954 |
北戴河 | 0.2766 | 0.2764 |
桂林 | 0.1285 | 0.1283 |
权重和应为1,这里由于四舍五入所以会有可以忽略的差距。
特征值法求权重
假如我们的判断矩阵一致性可以接受,那么我们可以仿照一致矩阵权重的求法。
第一步:求出矩阵A的最大特征值以及其对应的特征向量
第二步:对求出的特征向量进行归一化即可得到我们的权重
最大特征值为3.0055 , 一致性比例 CR = 0.0053
对应的特征向量:[‐0.8902,‐0.4132,‐0.1918]
对其归一化:[0.5954,0.2764,0.1283]
算术平均法权重 | 几何平均法权重 | 特征值法 | |
---|---|---|---|
苏杭 | 0.5949 | 0.5954 | 0.5954 |
北戴河 | 0.2766 | 0.2764 | 0.2764 |
桂林 | 0.1285 | 0.1283 | 0.1283 |
计算权重
一般在国赛等比赛中用到最多的便是特征值法。
景色 | 花费 | 居住 | 饮食 | 交通 | |
---|---|---|---|---|---|
景色 | 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 |
通过matlab计算上表判断矩阵的权重,代码如下。
A=[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];
[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
运行结果
汇总结果得到权重矩阵
算术平均法 | 几何平均法 | 特征值法 | |
---|---|---|---|
景色 | 0.2623 | 0.2636 | 0.2636 |
花费 | 0.4744 | 0.4773 | 0.4758 |
居住 | 0.0545 | 0.0531 | 0.0538 |
饮食 | 0.0985 | 0.0988 | 0.0981 |
交通 | 0.1103 | 0.1072 | 0.1087 |
可以得到使用特征值法求得的权重矩阵,根据此矩阵,可以计算出每个旅游景点的得分。
指标权重 | 苏杭 | 北戴河 | 桂林 | |
---|---|---|---|---|
景色 | 0.2636 | 0.5954 | 0.2764 | 0.1283 |
花费 | 0.4758 | 0.0819 | 0.2363 | 0.6817 |
居住 | 0.0538 | 0.4286 | 0.4286 | 0.1429 |
饮食 | 0.0981 | 0.6337 | 0.1919 | 0.1744 |
交通 | 0.1087 | 0.1667 | 0.1667 | 0.6667 |
苏杭得分:0.5954x0.2636+0.0819x0.4758+0.4286x0.0538+0.6337x0.0981+0.1667x0.1087=0.299
类似的,我们可以得到北戴河得分为0.245,桂林得分为0.455。
因此最佳的旅游景点是桂林。
最后
关注微信公众号『记贴』,持续更新文章和学习资料,可加作者的微信交流学习!