层次分析法


花了一通宵,总算整明白了,网上的学习资源太复杂,太难了,我就写了篇容易理解的博客,有地方有问题的可以留言。(明天啊呸今天还有课呜呜呜)

层次分析法的概述

层次分析法(Analytic Hierarchy Process,简称 AHP)是美国运筹学家 T. L. Saaty 教授于上世纪 70 年代初期提出的一种简便、灵活而又实用的多准则决策方法,是一种系统分析方法。

AHP是一种定性和定量相结合的、系统化的、层次化的分析方法,是一种将决策者对复杂系统的决策思维过程模型化、数量化的过程。

层次分析法的基本原理

根据问题的性质和要达到的总目标,将问题分解为不同的组成因素。从而将问题转换为最低层相对于最高层(总目标)的相对重要尺度的确定或相对优劣次序的排定。

简单的说,就是设置一个尺度,最后计算,谁的最后的值更大就就更好,更优。

层次分析法的应用

  • 适用题型:
    • 面临多个方案选择一个最佳方案
    • 给多个对象进行评价,比较出一个最优对象

层次分析法的步骤和方法

第一步:建立层次结构模型

举例如下:

  • 最高层(目标层):决策的目的,要解决的问题
  • 中间层(准则层):考虑的因素,准则
  • 最低层(方案层):决策备选方案

第二步:构造判断矩阵

如果一次性将所有因素的尺度都写出来,这样比较就会比较困难。所以我们采用两两相互比较。

心理学家人为成对比较的因素不宜超过9个,即每层不要超过9个因素。如下表所示:

比如,如果我们想决定A的因素的影响比B的因素影响绝对地强,那么我们设置尺度为9,反之,如果B的因素的影响比A的因素影响绝对地强,那么我们就设置1/9。

于是,我们可以通过尺度来构造矩阵,举例如下:

第三步:层次单排序一致性检验

看上面的那个例子图片。C1与C2之间尺度为1/2,C1与C3之间尺度为4。那么我们可以很明显的推出来C2与C3之间的尺度为8。但是,出现了一个问题。矩阵中C2与C3的尺度为7。这样的矩阵称作不一致矩阵。反之,如果矩阵中所有的元素都满足关系式子,这样的矩阵称作一致矩阵

在层次分析法中,允许采用不一致矩阵来解决问题。但是如果差别很小的话,可以直接使用不一致矩阵来解决我们的问题。如果差别很大的话,那么该不一致矩阵就会不适用了。这个差别要大到哪种程度呢?这是一个我们要考虑的问题。

这里就用到一致性检验了。我们可以通过一致性检验来检测我们的矩阵是否可以使用。这个部分要用到什么特征向量,特征值,最大特征根之类的。没学过线性代数,反正我看不懂,相信你也看不懂。不过没关系,我发现Matlib有个函数可以直接通过矩阵来求这些东西。所以,这些东西我们先不考虑,然后先学后面的知识!

创始人Saaty 教授规定了一个公式来定义一致性指标:

n代表几阶矩阵,λ表示最大特征根(这个后面会直接用matlib的函数得出,所以请不要焦虑,继续往后面看),CI可以把它当作一个整体看待(是不是整体我也不清楚),它能反应不一致得严重性。

但是严重性要在多少以内到多少我们才能用呢?严重性要超过多少我们不能用这个矩阵呢?这时候引入了下一个公式:

这个CI不用说了,就是我们之前求的那个一致性指标,RI叫随机一致性指标,这个值需要查表获取,具体这个值怎么来的,我建议不要考虑,过程很复杂。只用知道我们用这两个值能够得出一致性比率CR。且规定,当CR小于0.1时,就能通过一致性检验。反之,则不能。

注意:在使用层次分析法中一定要进行一致性检验。

RI查询表如下:

阶数 RI
1 0
2 0
3 0.52
4 0.89
5 1.12
6 1.26
7 1.36
8 1.41
9 1.46

更高阶矩阵请查询:https://wenku.baidu.com/view/18b3870575232f60ddccda38376baf1ffd4fe37f.html

第四步:层次多排序一致性检验

这一步还要对层次分析法进行进一步的检验。不过检验的对象不是第二步所构建的矩阵了。这一步需要对每一个中间层列出最低层相关的矩阵。这样的矩阵记为B1,B2,... Bm。并且对每一个矩阵求出它的CI和RI,然后使用下列式子计算它的层次总排序一致性比率:

同样的,如果求出CR小于0.1,它就通过了一致性检验,反之就没有通过。其中a1,a2到am表示中间各层的权值。

使用层次分析法时,单排序和多排序都要检验。

应用层次分析法的数学建模案例

例子如下:

python代码

我发现这个特征值不是线性代数里面的特征值,不能使用用线性代数里面的求特征值的方法求。这是python代码的求法:

import numpy as np

RI = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12,6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49, 11: 1.51}
def ahp(data):
	data = np.array(data)
	m = len(data)
	# 计算特征向量
	weight = (data / data.sum(axis=0)).sum(axis=1) / m
	# 计算特征值
	Lambda = sum((weight * data).sum(axis=1) / (m * weight))
	# 判断一致性
	CI = (Lambda - m) / (m - 1)
	CR = CI / RI[m]
	if CR < 0.1:
		print(f'最大特征值:lambda = {Lambda}')
		print(f'特征向量:weight = {weight}')
		print(f'\nCI = {round(CI,2)}, RI = {RI[m]} \nCR = CI/RI = {round(CR,2)} < 0.1,通过一致性检验')
		return weight
	else:
		print(f'\nCI = {round(CI,2)}, RI = {RI[m]} \nCR = CI/RI = {round(CR,2)} >= 0.1,不满足一致性')
A =[[1,4,2,8,2],[1/4,1,1/2,2,1/2],[1/2,2,1,4,1],[1/8,1/2,1/4,1,1/4],[1/2,2,1,4,1]]
ahp(A)