数学建模——层次分析法 AHP(Python代码)

层次分析法

       层次分析法是由美国运筹学家、匹兹堡大学教授T.L.Saaty于20世纪70年代创立的一种系统分析与决策的综合评价方法,是在充分研究了人类思维过程的基础上提出来的,它较合理地解决了定性问题定量化的处理过程。

        AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作的重要度的比较上面。

步骤

第一步 构造系统的递阶层次结构

构造目标层、准则层、方案层。如果用到了层次分析法,需要把层析结构图放在建模论文中~

数学建模——层次分析法 AHP(Python代码)_第1张图片

第二步 构造判断矩阵

对于同一层次的各元素关于上一层次中某一准则的重要性进行两两比较,构造两两比较矩阵(判断矩阵)。

数学建模——层次分析法 AHP(Python代码)_第2张图片

根据重要程度构造判断矩阵:

数学建模——层次分析法 AHP(Python代码)_第3张图片

准则层-方案层的判断矩阵的数值要结合实际来填写,如果题目中有其他数据,可以考虑利用这些数据进行计算。

第三步 一致性检验

对判断矩阵进行一致性检验

(1)计算一致性指标CI

CI=\frac{\lambda max-n}{n-1}

(2)查找对应的平均随机一致性指标RI

n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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

(3)计算一致性比例CR

CR=\frac{CI}{RI}

         如果CR<0.1,则可认为判断矩阵的一致性可以接受;否则需要对判断矩阵进行修正。

         CR>0.1如何修正?往一致矩阵上调整,一致矩阵各行成倍数关系。

第四步 计算准则权重

由判断矩阵计算被比较元素对于该准则的相对权重,计算权重的方法有如下三种:

1、算术平均法

(1)将判断矩阵按照列归一化(每一个元素除以其所在列的和)

(2)将归一化的各列相加(按行求和)

(3)将相加后得到的向量中每个元素除以n即可得到权重向量

2、几何平均法

(1)将判断矩阵的元素按照行相乘得到一个新的列向量

(2)将新的向量的每个分量开n次方

(3)对该列向量进行归一化即可得到权重向量

3、特征值法

(1)求出矩阵A的最大特征值以及其对应的特征向量

(2)对求出的特征向量进行归一化即可得到我们的权重

第五步 计算得分

根据权重矩阵计算得分,并进行排序。

总结

层次分析法的一些局限性:

(1)评价的决策层不能太多,太多的话n会很大,判断矩阵和一致矩阵差异可能会很大。

(2)如果决策层中指标的数据是已知的,可能已经存在重要程度的关系,那么使用层次分析法进行评价可能不够准确。

Python代码实现

(替换判断矩阵即可)

import numpy as np

# 构造判断矩阵
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])

# 一致性检验
# 计算最大特征值
values, vectors = np.linalg.eig(A)
max_value = np.max(values)
# 获取CI、RI
n = A.shape[0]
CI = (max_value - n)/(n - 1)
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]
ri = RI[n-1]    # RI下标从0开始
# 计算CR
CR = CI/ri
print(CR)

# 判断CR是否小于0.1
if CR < 0.1:
    print('CR<0.1,构造的判断矩阵合理')
else:
    print('CR>=0.1,构造的判断矩阵不合理')

# 计算权重
# 算术平均法
# 判断矩阵归一化
Asum = np.sum(A, 0)
StandA = A/Asum
# 归一化后按行相加
StandAsum = np.sum(StandA, 1)
# 计算权重向量
n, m = A.shape
W1 = StandAsum/n
print(f'算术平均法权重{W1}')

# 几何平均法
# 按行相乘
Aprod = np.prod(A, 1)
# 开n次方
n, m = A.shape
Aprod_n = np.power(Aprod, 1/n)
# 归一化
Aprod_nsum = np.sum(Aprod_n, 0)
W2 = Aprod_n/Aprod_nsum
print(f'几何平均法权重{W2}')

# 特征值法
# 求出最大特征值及对应的特征向量
values, vectors = np.linalg.eig(A)
maxvalue_id = np.argmax(values)
max_vector = vectors[:, maxvalue_id]
W3 = max_vector/np.sum(max_vector, 0)
print(f'特征值法权重{W3}')

内容参考:清风数学建模

你可能感兴趣的:(数学建模,python)