最近在做一个集群的项目,涉及到负载均衡问题,其中节点的综合负载评价部分采用经典的层次分析法,项目需要用C++复现。鉴于Python成熟、方便的矩阵操作,先用Python简单复现一下该算法。
关于AHP层次分析法的材料很多,可以自行查阅,推荐参考文献《高可用集群系统关键技术的研究与实现》第4.2和4.3节关于层次分析法的理论介绍和实例说明。
概括来说,AHP层次分析法主要分为三大步骤:
基于上述三个步骤,我使用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_