项目实战系列——使用python实现AHP层次分析法

0 前言

最近在做一个集群的项目,涉及到负载均衡问题,其中节点的综合负载评价部分采用经典的层次分析法,项目需要用C++复现。鉴于Python成熟、方便的矩阵操作,先用Python简单复现一下该算法。

1 理论基础

关于AHP层次分析法的材料很多,可以自行查阅,推荐参考文献《高可用集群系统关键技术的研究与实现》第4.2和4.3节关于层次分析法的理论介绍和实例说明。
概括来说,AHP层次分析法主要分为三大步骤:

  1. 求判断矩阵的特征值和特征向量;
  2. 证明判断矩阵的一致性;
  3. 将判断矩阵的特征向量归一化,得到各指标权重。

2 代码实现

基于上述三个步骤,我使用python做了简单实现。

def AHP(A):
    n = len(A)# 矩阵的行数--待标记的指标个数
    ### 1 求特征值和特征向量
    λs, ws = np.linalg.eig(A)
    # 最大特征值
    λ_max = round(max(λs),4)
    # 记录λ_max对应的index,然后根据index找到λ_max对应的特征向量w
    λ_max_idx = np.argmax(λs)
    # 最大特征值对应的特征向量
    w_max = ws[λ_max_idx]

    ### 2 一致性判断
    # n与RI的对应表
    RI_dict = {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}

    # 计算一致性指标CI
    CI = (λ_max - n) / (n - 1)
    # 计算随机平均一致性指标RI
    RI = RI_dict[n]
    # 计算一致性比率CR
    CR = CI / RI

    # 得出一致性判断结论
    tag = False
    if CR < 0.10:
        tag = True
        print("判断矩阵A为一致性矩阵")

    ### 3 特征向量归一化
    # 归一化的特征向量
    w_max_ = w_max / w_max.sum()

    return w_max_

3 参考材料

  1. https://www.cnblogs.com/yhll/p/9967726.html
  2. https://blog.csdn.net/ipip2005/article/details/39546425#

你可能感兴趣的:(python,层次分析法,AHP)