一、 层次分析法概述
层次分析法(Analytic Hierarchy Process,AHP)这是一种定性和定量相结合的、系统的、层次化的分析方法。这种方法的特点就是在对复杂决策问题的本质、影响因素及其内在关系等进行深入研究的基础上,利用较少的定量信息使决策的思维过程数学化,从而为多目标、多准则或无结构特性的复杂决策问题提供简便的决策方法。是对难以完全定量的复杂系统做出决策的模型和方法。
二、 层次分析法的基本原理
层次分析法的原理,层次分析法根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同的层次聚集组合,形成一个多层次的分析结构模型,从而最终使问题归结为最低层(供决策的方案、措施等)相对于最高层(总目标)的相对重要权值的确定或相对优劣次序的排定。
三、 层次分析法的步骤和方法
层次分析法的步骤,运用层次分析法构造系统模型时,大体可以分为以下四个步骤:
- 1.建立层次结构模型;
- 2.构造判断(成对比较)矩阵;
- 3.层次单排序及其一致性检验;
- 4.层次总排序及其一致性检验;
1.建立层次结构模型
-
将决策的目标、考虑的因素(决策准则)和决策对象按他们之间的相互关系分成最高层、中间层和最低层,绘制层次结构图。
-
最高层(目标层):决策的目的、要解决的问题;
-
中间层(准则层或指标层):考虑的因素、决策的准则;
-
最低层(方案层):决策时的备选方案;
-
对于相邻的两层,称高层为目标层,低层为因素层。
下面以选择旅游地为例进行分析:
层次分析法所要解决的问题是关于最低层对最高层的相对权重问题,按此相对权重可以对最低层中的各种方案、措施进行排序,从而在不同的方案中作出选择或形成选择方案的原则
2. 构造判断(成对比较)矩阵
在确定各层次各因素之间的权重时,如果只是定性的结果(就是我认为景色占80%,费用10%等等),则常常不容易被别人接受,因此Santy等人提出:一致矩阵法,即:
- 1.不把所有因素放在一起比较,而是两两比较;
- 2.对此时采用相对尺度,以尽可能减少性质不同的诸因素相互比较的困难,以提高准去性;
成对比较矩阵是表示本层所有因素针对上一层某一个因素(准侧或目标)的相对重要性的比较。成对比较矩阵的元素 a i j a_{ij} aij表示的是第 i i i个因素相对于第 j j j 个因素的比较结果,这个值使用的是Santy的1-9标度方法给出。
比如上面举的旅游的例子,在旅游问题中第二层A的各个因素对目标层Z的影响两两比较的结果如下图:
3.层次单排序及一致性检验
层次单排序:W的元素为同一层次因素对于上一层次因素某因素相对重要性的排序权值,这一过程称为层次单排序,那能否确认层次单排序,需要进行一致性检验,所谓一致性检验是指对成对比较矩阵确定不一致的允许范围。
这里 a 23 = 7 a_{23}=7 a23=7 但是根据 a 21 , a 13 a_{21},a_{13} a21,a13 的值计算出来的 a 23 = 8 a_{23}=8 a23=8 。在构造成对矩阵的时候,很容易出现这种状况。如果 a 23 = a 21 ⋅ a 13 a_{23}=a_{21} \cdot a_{13} a23=a21⋅a13 则称成对矩阵为一致阵,一致阵的性质:
- 1. a i j = 1 a j i , a i i = 1 ( i , j = 1 , 2 , . . . , n ) a_{ij}=\frac{1}{a_{ji}},a_{ii} = 1\quad(i,j=1,2,...,n) aij=aji1,aii=1(i,j=1,2,...,n) ;
- 2. A T A^T AT也是一致阵;
- 3. A A A 的各行成比例,则 A A A矩阵秩为1;
- 4.
A
A
A 的最大特征根(值)为
λ
=
n
\lambda=n
λ=n ,其余的
n
−
1
n-1
n−1特征根均等于0;
事实上,
A = [ a a ⋮ a ] ⋅ [ 1 , 1 , ⋯ , 1 ] = α ⋅ β T A=\left[ \begin{matrix} a \\ a \\ \vdots\\ a\\ \end{matrix} \right] \cdot \left[1, 1, \cdots,1\right]=\alpha \cdot \beta^T A=⎣⎢⎢⎢⎡aa⋮a⎦⎥⎥⎥⎤⋅[1,1,⋯,1]=α⋅βT
A 2 = α ⋅ β T ⋅ α ⋅ β T A^2= \alpha \cdot \beta ^T \cdot \alpha \cdot \beta ^T A2=α⋅βT⋅α⋅βT
由于 β T ⋅ α = n a \beta^T \cdot \alpha = na βT⋅α=na
所以 A 2 = n a α ⋅ β T A^2=na\alpha \cdot \beta ^T A2=naα⋅βT
λ 2 = n a λ \lambda^2 = na\lambda λ2=naλ
λ = n a 或 λ = 0 \lambda = na 或\lambda = 0 λ=na或λ=0 - 5. A A A的任一列(行)都是对应于特征根 n n n 的特征向量, A W = n W AW=nW AW=nW;
这里的成对比较矩阵有两种可能,一致阵或者不是一致阵。
- 1.如果成对比较矩阵是一致阵,则我们自然回取对应于最大特征根 n n n 的归一化特征向量 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1,w2,...,wn} ,且 ∑ i = 1 n w i = 1 \sum^n_{i=1}w_i=1 ∑i=1nwi=1 , w i w_i wi 表示下层第 i i i 个因素对上层某个因素影响程度的权值。
- 2.若成对比较矩阵不是一致阵,Saaty等人建议用其最大特征根对应的归一化特征向量作为权向量 W W W,则 A W = λ W W = { w 1 , w 2 , . . . , w n } AW=\lambda W \quad W=\{w_1, w_2,...,w_n\} AW=λWW={w1,w2,...,wn} ,这样确定权向量的方法称为特征根法;
定理:
1.
n
n
n阶一致阵的唯一非零特征根为
n
n
n ;
2.
n
n
n 阶互反阵
A
A
A (
a
i
j
>
0
,
a
i
j
=
1
a
j
i
,
a
i
i
=
1
a_{ij}>0,a_{ij}=\frac{1}{a_{ji}},a_{ii}=1
aij>0,aij=aji1,aii=1 )最大特征根
λ
≥
n
\lambda \geq n
λ≥n ,当且仅当
λ
=
n
\lambda=n
λ=n 时,
A
A
A 为一致矩阵。
由于 λ \lambda λ 连续的依赖于 a i j a_{ij} aij ,则 λ \lambda λ 比 n n n 大的越多, A A A的不一致性越严重。用最大特征值对应的特征向量作为被比较因素对上层某因素影响程度的权向量,其不一致程度越大,引起的判断误差越大。因而可以用 λ − n \lambda-n λ−n数值大小来衡量 A A A 的不一致程度。
一致性指标:
C
I
=
λ
−
n
n
−
1
CI=\frac{\lambda-n}{n-1}
CI=n−1λ−n
1.
C
I
=
0
CI=0
CI=0,有完全的一致性;
2.
C
I
CI
CI接近于0,有满意的一致性;
3.
C
I
CI
CI越大,不一致性月严重;
为了衡量 C I CI CI的大小,引入随机一致性指标 R I RI RI 。方法为随机构造500个成对比较矩阵 A 1 , A 2 , . . . , A 500 A_1,A_2,...,A_{500} A1,A2,...,A500 ,则可得一致性指标 C I 1 , C I 2 , . . . , C I 500 CI_1,CI_2,...,CI_{500} CI1,CI2,...,CI500
R I = C I 1 + C I 2 + . . . C I 500 500 = λ 1 + λ 2 + . . . + λ 500 500 − n n − 1 RI=\frac{CI_1+CI_2+...CI_{500}}{500}=\frac{\frac{\lambda_1+\lambda_2+...+\lambda_{500}}{500}-n}{n-1} RI=500CI1+CI2+...CI500=n−1500λ1+λ2+...+λ500−n
定义一致性比率: C R = C I R I CR=\frac{CI}{RI} CR=RICI
一般,当一致性比率CR=\frac{CI}{RI}<0.1时,认为 A A A 的不一致程度在容许的范围之内,有满意的一致性,通过一致性检验,可用其归一化特征向量作为权向量,否则要重新构造成对比较矩阵 A A A ,对 a i j a_{ij} aij 加以调整。
**一致性检验:**利用一致性指标和一致性比率<0.1及随机一致性指标的数值表,对
λ
\lambda
λ进行检验的过程。
如果成对比较矩阵属于可接受的一致性或者是一致性矩阵,那么就可以使用这种方式来近似的计算层次单排序权重,也就是同一层次的每个因素对于上一层次因素某因素相对重要性的排序权值。
比如对于"一致性检验以及求得权重"这个图,权向量中有5个元素,那每一个元素代表的是每一个因素对上一层的因素的权重,比如说第一个值为0.263,那这代表的含义就是景色对于选择旅游地的重要性为0.263。
4. 层次总排序及其一致性检验
计算某一层次所有因素对于最高层(总目标)相对重要性的权值,称为层次总排序。
这一过程是从最高层到最低层次依次进行的。
4.层次分析法的基本步骤归纳
5.应用实例:
四、代码:
"""
AHP demo: 第一层:A, 第二层:B1 B2 B3, 第三层:C1 C2 C3, 完全相关性结构。
"""
import numpy as np
"""
1. 成对比较矩阵
"""
def comparision(W0): # W为每个信息值的权重
n = len(W0)
F = np.zeros([n, n])
for i in range(n):
for j in range(n):
if i == j:
F[i, j] = 1
else:
F[i, j] = W0[i] / W0[j]
return F
"""
2. 单层排序,相对重要度
"""
def ReImpo(F):
n = np.shape(F)[0]
W = np.zeros([1, n])
for i in range(n):
t = 1
for j in range(n):
t = F[i, j] * t
W[0, i] = t ** (1 / n)
W = W / sum(W[0, :]) # 归一化 W=[0.874,2.467,0.464]
return W.T
"""
3. 一致性检验
"""
def isConsist(F):
n = np.shape(F)[0]
a, b = np.linalg.eig(F)
maxlam = a[0].real
CI = (maxlam - n) / (n - 1)
if CI < 0.1:
return bool(1)
else:
return bool(0)
"""
4. 计算综合重要性
"""
def ComImpo(W12, W231, W232, W233): # 综合重要性
# F12=comparision(W12) # 实际应用中可以根据特征的权重求解成对比较矩阵。
# F231=comparision(W231)
# F232=comparision(W232)
# F233=comparision(W233)
F12 = np.array([[1, 1 / 3, 2], [3, 1, 5], [1 / 2, 1 / 5, 1]]) # 此处直接假设出成对比较矩阵
F231 = np.array([[1, 1 / 3, 1 / 5], [3, 1, 1 / 3], [5, 3, 1]])
F232 = np.array([[1, 2, 7], [1 / 2, 1, 5], [1 / 7, 1 / 5, 1]])
F233 = np.array([[1, 1 / 3, 1 / 7], [3, 1, 1 / 5], [7, 5, 1]])
if isConsist(F12) and isConsist(F231) and isConsist(F232) and isConsist(F233):
W12 = ReImpo(F12)
W231 = ReImpo(F231)
W232 = ReImpo(F232)
W233 = ReImpo(F233)
W23 = np.hstack([W231, W232, W233])
else:
print("成对比较矩阵不一致,请调整权重后重试!")
return 0
n = len(W12)
C = np.zeros([1, n])
for i in range(n):
t = W23[i, :]
C[0, i] = sum((W12.T * t)[0])
return C
def main():
print("这里是AHP的演示程序:")
w = np.ones([3]) # W 为成对比较矩阵
C = ComImpo(w, w, w, w)
print('最佳方案为第', np.argmax(C) + 1, '个方案.', '综合推荐指数为', max(C[0, :]))
if __name__ == '__main__':
main()
# print(__name__)