注:本文采用matlab进行数据处理,其他编程软件也可以达到相同效果。本文参数纯在主观因素,所以具体以官方比较为准。由于本人非数学专业表诉可能存在稍许问题。
生活中时常面对许多问题需要做出一定的抉择,但是往往需要考虑各种往细小划分的问题,个人或专家对于各个因素的细小划分的重要性的判断就会影响问题的结果。此时就需要用到层次分析法。
层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨蒂于20世纪70年代初,在为美国国防部研究"根据各个工业部门对国家福利的贡献大小而进行电力分配"课题时,应用网络系统理论和多目标综合评价方法,提出的一种层次权重决策分析方法。
举个栗子,周同学想买一部苹果手机,但由于预算与排面等问题他只考虑了几款机型11pm、12pm、13pm。这几款机型在价格、性能、续航、屏幕材质、牌面等方面进行考虑。
此时可以得到一个图
11pm | 12pm | 13pm | ||
价格 | 性能 | 续航 | 屏幕材质 | 排面 |
最终的选择 |
不妨先将客观标准设立一个参数为k =a性质对b的重要性
k=1 a与b相比不重要
k=3 a与b相比有点重要
k=4 a与b相比重要
k=7 a与b相比很重要(极端)
然后得出相应的表格
b 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 |
再将其转化为矩阵
[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]
对数据进行几何平均法可以求得权重
设立一个总权重数为W=2.6270+7.0473+0.1812+0.5109+0.5848=10.9512
最后可以求得每一项权重比
价格 | 2.6270/M=0.2398 |
性能 | 7.0473/M=0.6435 |
续航 | 0.1812/M=0.0165 |
屏幕材质 | 0.5190/M=0.0474 |
排面 | 0.5854/M=0.0530 |
根据上表就可以看出周同学对于上面五个性质的重视程度。
后再对于每一部手机在一个性质方面的优势做出关于K值的表格。
11pm | 12pm | 13pm | |
11pm | 1 | 2 | 3 |
12pm | 1/2 | 1 | 2 |
13pm | 1/3 | 1/2 | 1 |
[1,2,3,;
1/2,1,2;
1/3,1/2,1]
上表就是关于价格的K值表。
再根据几何平均法算出三款手机关于价格的权重,
M=3.3674
11pm | 0.5396 |
12pm | 0.2970 |
13pm | 0.1634 |
后可以以相同的方法计算出三款手机关于续航,性能,屏幕材质,牌面的权重。
11pm | 0.4026 |
12pm | 0.2564 |
13pm | 0.3410 |
11pm | 0.2598 |
12pm | 0.3487 |
13pm | 0.3915 |
11pm | 0.4358 |
12pm | 0.0853 |
13pm | 0.4789 |
11pm | 0.0369 |
12pm | 0.4137 |
13pm | 0.5494 |
最终再对结果进行整合算出每台手机的最终权重,
举个例子:11pm的权重等于 价格对于手机*价格对于周同学+续航对于手机*续航对于周同学+......+排面对于手机*排面对于周同学
以此类推算出三部手机的对于周同学的选择权重为
11pm | 0.3258 |
12pm | 0.3256 |
13pm | 0.3486 |
最终结果为周同学应该买Iphone 13pro max
这种方法是根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同层次聚集组合,形成一个多层次的分析结构模型,从而最终使问题归结为最低层(供决策的方案、措施等)相对于最高层(总目标)的相对重要权值的确定或相对优劣次序的排定。
优缺点转自 百度百科
优点
1.系统性的分析方法
层次分析法把研究对象作为一个系统,按照分解、比较判断、综合的思维方式进行决策,成为继机理分析、统计分析之后发展起来的系统分析的重要工具。系统的思想在于不割断各个因素对结果的影响,而层次分析法中每一层的权重设置最后都会直接或间接影响到结果,而且在每个层次中的每个因素对结果的影响程度都是量化的,非常清晰明确。这种方法尤其可用于对无结构特性的系统评价以及多目标、多准则、多时期等的系统评价。
2. 简洁实用的决策方法
这种方法既不单纯追求高深数学,又不片面地注重行为、逻辑、推理,而是把定性方法与定量方法有机地结合起来,使复杂的系统分解,能将人们的思维过程数学化、系统化,便于人们接受,且能把多目标、多准则又难以全部量化处理的决策问题化为多层次单目标问题,通过两两比较确定同一层次元素相对上一层次元素的数量关系后,最后进行简单的数学运算。计算简便,并且所得结果简单明确,容易为决策者了解和掌握。
3. 所需定量数据信息较少
层次分析法主要是从评价者对评价问题的本质、要素的理解出发,比一般的定量方法更讲求定性的分析和判断。由于层次分析法是一种模拟人们决策过程的思维方式的一种方法,层次分析法把判断各要素的相对重要性的步骤留给了大脑,只保留人脑对要素的印象,化为简单的权重进行计算。这种思想能处理许多用传统的最优化技术无法着手的实际问题。 [2]
缺点
1. 不能为决策提供新方案
层次分析法的作用是从备选方案中选择较优者。在应用层次分析法的时候,可能就会有这样一个情况,就是我们自身的创造能力不够,造成了我们尽管在我们想出来的众多方案里选了一个最好的出来,但其效果仍然不够企业所做出来的效果好。而对于大部分决策者来说,如果一种分析工具能替我分析出在我已知的方案里的最优者,然后指出已知方案的不足,又或者甚至再提出改进方案的话,这种分析工具才是比较完美的。但显然,层次分析法还没能做到这点。
2. 定量数据较少,定性成分多,不易令人信服
在如今对科学的方法的评价中,一般都认为一门科学需要比较严格的数学论证和完善的定量方法。但现实世界的问题和人脑考虑问题的过程很多时候并不是能简单地用数字来说明一切的。层次分析法是一种带有模拟人脑的决策方式的方法,因此必然带有较多的定性色彩。
3. 指标过多时,数据统计量大,且权重难以确定
当我们希望能解决较普遍的问题时,指标的选取数量很可能也就随之增加。指标的增加就意味着我们要构造层次更深、数量更多、规模更庞大的判断矩阵。那么我们就需要对许多的指标进行两两比较的工作。由于一般情况下我们对层次分析法的两两比较是用1至9来说明其相对重要性,如果有越来越多的指标,我们对每两个指标之间的重要程度的判断可能就出现困难了,甚至会对层次单排序和总排序的一致性产生影响,使一致性检验不能通过。不能通过,就需要调整,在指标数量多的时候比较难调整过来。
4. 特征值和特征向量的精确求法比较复杂
在求判断矩阵的特征值和特征向量时,所用的方法和我们多元统计所用的方法是一样的。在二阶、三阶的时候,我们还比较容易处理,但随着指标的增加,阶数也随之增加,在计算上也变得越来越困难。不过幸运的是这个缺点比较好解决,我们有三种比较常用的近似计算方法。第一种就是和法,第二种是幂法,还有一种常用方法是根法。
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