数学建模之层次分析

简介

层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨蒂于20世纪70年代初,在为美国国防部研究”根据各个工业部门对国家福利的贡献大小而进行电力分配”课题时,应用网络系统理论和多目标综合评价方法,提出的一种层次权重决策分析方法。

层次分析法构造系统模型步骤

  • 建立层次结构模型
  • 构造判断(成对比较)矩阵
  • 层次单排序及其一致性检验
  • 层次总排序及其一致性检验

层次分析法结构模型的组成

  • 最高层(目标层):决策的问题和需要解决的问题
  • 最低层(方案层):待决策的备选方案
  • 中间层(准则层):考虑的因素和决策的准则
    小石老师

构造判断(成对比较)矩阵

目的:将多因素之间的比较变为凉凉因素之间的比较,从而减少不同性质元素比较的困难。换句话说,在ABCDE等多个元素中你更看重哪一个,变成在AB中你更看重哪一个,这样的比较更加容易被人接受

标度表

小石老师

矩阵展示

小石老师

在A矩阵中,元素aij 表示i因素比j因素的更重要的程度,即Ci:Cj,如果aij=9则表示i的重要性远远大于j,因此aji=Cj:Ci = 1/9

一致性检验

目的

我们在上一步已经得出了判断矩阵,但是我们注意一下a21,a13,a23

a21 = 2 = C2/C1

a13 = 4 = C1/C3

a23 = 7 = C2/C3

正常情况下a23 = a13 * a21 = 8 但与矩阵中的情况是矛盾的,所以我们将这种情况叫做成对比较的不一致情况

在建模过程中,允许不一致,但是要确定不一致的允许范围

步骤

  1. 求矩阵的最大特征值(Max_eig)
  2. 引入一致性指标CI = (Max_eig - n) / (n - 1) n为矩阵的维度,也就是因素个数
  3. 查找平均随即一致性指标RI
  4. 计算一致性比例 CR=CI/RI
  5. 判断是否通过一致性检验

一致性检验代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 一致性检验
import numpy as np
def CRcheck(a, RI=None):
if RI is None:
RI = [0, 0, 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]
n = a.shape[0]
if n>15:
raise Exception('内涵RI最大支持15阶,缺少参数RI')
D, V = np.linalg.eig(a) # 特征值,特征向量=np.linalg.eig(a)
Max_eig = np.max(D)
CI = (Max_eig - n) / (n - 1)
if type(RI)==list:
CR = CI / RI[n - 1] # 因为数组是从第0位开始的所以需要n-1
else:
CR = CI / RI
if CR<0.1:
print('CR<0.10 通过一致性检验')
return True
else:
print('CR>=0.10 该判断矩阵需要修改')
return True

举例

还是使用小石老师的例子

5.png

Z代表最底层,即目标层,A代表5中决策准则,B代表3中备选决策,下面分别对A 和 B1-5一共6个矩阵进行解释。

A矩阵的解释

元素aij 表示i因素比j因素的更重要的程度,即Ci:Cj,如果a21=2则表示因素2的重要性远远大于元素1

通过A矩阵我们能得出A1-5对Z的权重

B1-5矩阵的解释

B1 表示的是决策的实际情况在因素1中的比较,如B113 = 5 表示在因素1中决策B1比决策B3更重要,重要程度是5

通过B1矩阵我们能得出B1B2B3对A1的权重

通过B2矩阵我们能得出B1B2B3对A2的权重

通过B3矩阵我们能得出B1B2B3对A3的权重

通过B4矩阵我们能得出B1B2B3对A4的权重

通过B5矩阵我们能得出B1B2B3对A5的权重

计算权重

此时我们有了层次分析系统,有了比较矩阵,经过了一致性检验,我们需要开始进行判断,到底如何根据这个判断矩阵计算权重?

一般进行判断矩阵权重计算有3种方法

  • 算数平均法求权重
  • 几何平均法求权重
  • 特征值法求权重

算术平均法求权重

  1. 列归一化:一列中的每个元素都除以该列的和

  1. 对每行数据进行求和

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

# 算数平均法求权重
def SuanShuPingJun(a):
'''
算术平均法求权重
:param a: 判断矩阵
:return: 权重
'''
Sum_A = np.sum(a, axis=0)
Stand_A = a / Sum_A # 列归一化:列的每个元素除以该列的和
res = np.sum(Stand_A, axis=1) # 每行进行求和
return res

几何平均法求权重

  1. 每行的所有元素相乘
  2. 相乘的结果开n次方,n为矩阵维度
  3. 列归一化:操作方法通上

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
# 几何平均法求权重
def JiHePingJun(a):
'''
几何平均法求权重
:param a: 判断矩阵
:return: 权重
'''
n = a.shape[0]
Prduct_A = np.prod(a, axis=1) # 行元素相乘
Prduct_n_A = Prduct_A ** (1 / n) # 相乘结果开n次根
res = Prduct_n_A / np.sum(Prduct_n_A, axis=0)
return res

特征值法求权重

  1. 求特征向量
  2. 特征向量的第一组解

实现代码:

1
2
3
4
5
6
7
# 特征值法求权重
def TeZhengZhi(a):
D, V = np.linalg.eig(a) # 特征值,特征向量=np.linalg.eig(a)
print(D)
print(np.var(V,axis=0))
res = V[:, 0] / np.sum(V[:, 0], axis=0)
return res

关于特征值的理解

决策选取

我们已经得到了各层对于上一层的权重,那如何进行最后的决策选取呢?

以B1为例计算B1对于目标层Z的权重

W(B1->Z)=W(B1->A1) W(A1->Z) + W(B1->A2) W(A2->Z) + W(B1->A3) W(A3->Z) + W(B1->A4) W(A4->Z)+W(B1->A5) * W(A5->Z)

这样就能分别得到W(B1->Z) W(B2->Z) W(B3->Z),即三种决策对于目标层的权重,选取最大的即可。

对于判断矩阵的选取方式

可通过查询论文,资料,统计,以及真实数据分析得出,具有一定的主观性。

坚持原创技术分享,您的支持也将成为我的动力!
-------------本文结束感谢您的阅读-------------
undefined