层次分析法
参考来源:层次分析法
其实就是从以上链接中抽取了些核心步骤,然后简单实现下了例子,供代码能力较弱的同学参考
基本步骤
1.建立层次结构模型
该结构图包括目标层,准则层,方案层。
2.构造判断矩阵
从第二层开始用判断矩阵和1~9尺度。
3.计算单排序权向量并做一致性检验
对每个判断矩阵计算最大特征值及其对应的特征向量,利用一致性指标、随机一致性指标和一致性比率做一致性检验。若检验通过,特征向量(归一化后)即为权向量;若不通过,需要重新构造成对比较矩阵。
4.计算总排序权向量并做一致性检验
计算最下层对最上层总排序的权向量。利用总排序一致性比率:
C R = a 1 C I 1 + a 2 C I 2 + ⋯ + a m C I m a 1 R I 1 + a 2 R I 2 + ⋯ + a m R I m C R=\frac{a_1 C I_1+a_2 C I_2+\cdots+a_m C I_m}{a_1 R I_1+a_2 R I_2+\cdots+a_m R I_m} CR=a1RI1+a2RI2+⋯+amRIma1CI1+a2CI2+⋯+amCIm
利用CR<0.1进行检验。若通过,则可按照总排序权向量表示的结果进行决策,否则需要重新考虑模型或重新构造那些一致性比率CR较大的判断矩阵。
优缺点
优点
系统性:将对象视作系统,按照分解、比较、判断、综合的思维方式进行决策。成为继机理分析、统计分析之后发展起来的系统分析的重要工具;
实用性:一定性与定量相结合,能处理许多用传统的最优化技术无法着手的实际问题,应用范围很广,同时,这种方法使得决策者与决策分析者能够相互沟通,决策者甚至可以直接应用它,这就增加了决策的有效性;
简洁性:计算简便,结果明确,具有中等文化程度的人即可以了解层次分析法的基本原理并掌握该法的基本步骤,容易被决策者了解和掌握。便于决策者直接了解和掌握。
缺点
囿旧:只能从原有的方案中优选一个出来,没有办法得出更好的新方案;
粗略:该法中的比较、判断以及结果的计算过程都是粗糙的,不适用于精度较高的问题;
主观:从建立层次结构模型到给出判断矩阵,人主观因素对整个过程的影响很大,这就使得结果难以让所有的决策者接受。当然采取专家群体判断的办法是克服这个缺点的一种途径。每一层因素的权重是主观给出,在某些场合会影响泛化性。
以下代码主要提供给求解层次分析法例题的同学学习了解
import numpy as np
## 成对比较阵的求解
# 定义矩阵
matrixA = np.array([[1, 1/2, 4,3,3],
[2, 1,7, 5,5],
[1/4,1/7,1,1/2,1/3],
[1/3,1/5,2,1,1],
[1/3,1/5,3,1,1]])
# 计算特征根
eigenvalues, eigenvectors = np.linalg.eig(matrixA)
# 输出特征根
print("A特征根:", eigenvalues)
print("A特征向量:", eigenvectors)
matrixB = np.array([[1, 2, 5],
[1/2, 1,2],
[1/5,1/2,1]])
# 计算特征根
eigenvalues, eigenvector = np.linalg.eig(matrixB)
# 输出特征根
print("B1特征根:", eigenvalues)
print("B1特征向量:", eigenvector)
# 计算权重向量的长度
length = np.sum(eigenvector[:,0])
# 将权重向量归一化
normalized_eigenvector = eigenvector / length
# 输出归一化后的权重向量
print("归一化特征向量:", normalized_eigenvector)