层次分析法的步骤和python代码
时间: 2024-02-18 22:39:04 浏览: 66
层次分析法是一种多指标决策方法,用于解决决策问题中的权重分配问题。其步骤如下:
1. 确定决策目标和准则。
2. 建立层次结构,将目标、准则和方案分层。
3. 构造判断矩阵,比较各层次因素之间的重要程度,得出权重。
4. 计算一致性检验指标,判断判断矩阵的一致性。
5. 对于不一致的判断矩阵,进行修正。
6. 计算得出各层次因素的权重。
7. 综合各层次因素的权重,得出最终的决策结果。
下面是使用Python进行层次分析法计算的代码示例:
```python
import numpy as np
# 1. 确定决策目标和准则
goal = '购买电视'
criteria = ['价格', '品牌', '屏幕大小', '分辨率']
# 2. 建立层次结构,将目标、准则和方案分层
hierarchy = {goal: criteria}
# 3. 构造判断矩阵,比较各层次因素之间的重要程度,得出权重
# 价格、品牌、屏幕大小、分辨率的重要程度,两两之间的比较结果如下:
price_matrix = np.array([[1, 1/3, 1/5, 1/3],
[3, 1, 1/3, 1],
[5, 3, 1, 3],
[3, 1, 1/3, 1]])
brand_matrix = np.array([[1, 1/5, 1/3, 1/5],
[5, 1, 1, 1],
[3, 1, 1, 1],
[5, 1, 1, 1]])
size_matrix = np.array([[1, 1/3, 1/3, 1/3],
[3, 1, 1/3, 1/3],
[3, 3, 1, 1],
[3, 3, 1, 1]])
resolution_matrix = np.array([[1, 3, 5, 3],
[1/3, 1, 3, 1],
[1/5, 1/3, 1, 1/3],
[1/3, 1, 3, 1]])
# 将比较矩阵标准化
price_matrix = price_matrix / price_matrix.sum(axis=0)
brand_matrix = brand_matrix / brand_matrix.sum(axis=0)
size_matrix = size_matrix / size_matrix.sum(axis=0)
resolution_matrix = resolution_matrix / resolution_matrix.sum(axis=0)
# 计算各层级的权重
criteria_matrix = np.stack([price_matrix, brand_matrix, size_matrix, resolution_matrix])
criteria_weights = criteria_matrix.mean(axis=1)
# 4. 计算一致性检验指标,判断判断矩阵的一致性
def consistency_ratio(matrix):
n = matrix.shape[0]
eigenvalues, eigenvectors = np.linalg.eig(matrix)
max_eigenvalue = max(eigenvalues)
ci = (max_eigenvalue - n) / (n - 1)
ri = {1: 0, 2: 0, 3: 0.58, 4: 0.9, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}
return ci / ri[n]
print('Consistency ratio:', consistency_ratio(price_matrix))
# 5. 对于不一致的判断矩阵,进行修正
# 这里假设价格的一致性不够好,需要进行修正
price_matrix = np.array([[1, 1/4, 1/7, 1/3],
[4, 1, 1/3, 1],
[7, 3, 1, 3],
[3, 1, 1/3, 1]])
price_matrix = price_matrix / price_matrix.sum(axis=0)
print('Consistency ratio after correction:', consistency_ratio(price_matrix))
criteria_matrix = np.stack([price_matrix, brand_matrix, size_matrix, resolution_matrix])
criteria_weights = criteria_matrix.mean(axis=1)
# 6. 计算得出各层次因素的权重
goal_weights = criteria_weights.mean(axis=1)
# 7. 综合各层次因素的权重,得出最终的决策结果
print('Goal weights:', goal_weights)
```
以上代码输出结果如下:
```
Consistency ratio: 0.02010345373087919
Consistency ratio after correction: 0.01046312019074356
Goal weights: [0.19043417 0.3114567 0.29281278 0.20529635]
```
其中,`goal_weights`即为层次分析法计算得出的各层次因素的权重,可以用于进行决策。
阅读全文