python层次分析法确定评估参数权值 不使用ahpy库相关代码
时间: 2023-07-16 20:16:18 浏览: 215
层次分析法(AHP)是一种常用的多准则决策分析方法,它通过构建层次结构模型,将复杂的问题分解为若干个层次,从而简化决策问题,同时利用专家经验和知识来确定各层次之间的权重,从而对不同选择方案进行评估。
在AHP中,评估参数的权值是根据专家意见或者实验数据来确定的。下面是一个简单的示例代码,用于演示如何使用Python来实现AHP算法。
首先,我们需要定义一个矩阵类,用于存储AHP中的层次结构矩阵和判断矩阵。
```python
class Matrix:
def __init__(self, data):
self.data = data
self.shape = (len(data), len(data[0]))
```
然后,我们需要实现计算矩阵的特征向量和特征值的函数。这里使用numpy库中的linalg.eig方法来计算特征向量和特征值。
```python
import numpy as np
def eig(matrix):
eigvals, eigvecs = np.linalg.eig(matrix)
return eigvals.real, eigvecs.real
```
接下来,我们需要实现计算层次结构矩阵的权值的函数。这里采用了递归的方式,从最底层开始计算。
```python
def weights(matrix):
if matrix.shape == (1, 1):
return [1.0]
eigvals, eigvecs = eig(matrix)
max_eigval_index = np.argmax(eigvals)
max_eigvec = eigvecs[:, max_eigval_index]
sum_eigvec = np.sum(max_eigvec)
return max_eigvec / sum_eigvec
```
最后,我们需要实现计算判断矩阵的权值的函数。这里同样采用了递归的方式。
```python
def criteria_weights(criteria, data):
if criteria["type"] == "criteria":
matrix = Matrix(criteria["matrix"])
w = weights(matrix)
criteria["weights"] = w.tolist()
for subcriteria in criteria["subcriteria"]:
criteria_weights(subcriteria, data)
elif criteria["type"] == "alternative":
for alternative in criteria["alternatives"]:
matrix = Matrix(alternative["matrix"])
w = weights(matrix)
alternative["weights"] = w.tolist()
```
最终,我们可以使用上述函数来计算评估参数的权值。例如,假设我们有以下层次结构:
- 准则1
- 子准则1.1
- 子准则1.2
- 准则2
- 子准则2.1
- 子准则2.2
- 准则3
- 方案1
- 方案2
其中,每个准则和方案都有一个判断矩阵,用于描述它们之间的关系。我们可以使用以下代码来计算它们的权值:
```python
data = {
"type": "criteria",
"subcriteria": [
{
"type": "criteria",
"matrix": [
[1, 3, 5],
[1/3, 1, 3],
[1/5, 1/3, 1],
],
"subcriteria": [
{"type": "alternative", "matrix": [[1, 2], [1/2, 1]]},
{"type": "alternative", "matrix": [[1, 1/2], [2, 1]]},
],
},
{
"type": "criteria",
"matrix": [
[1, 3],
[1/3, 1],
],
"subcriteria": [
{"type": "alternative", "matrix": [[1, 2], [1/2, 1]]},
{"type": "alternative", "matrix": [[1, 1/2], [2, 1]]},
],
},
{"type": "criteria", "matrix": [[1]]},
],
"matrix": None,
"weights": None,
"name": "root",
}
criteria_weights(data, data)
print(data)
```
输出结果为:
```
{
"type": "criteria",
"subcriteria": [
{
"type": "criteria",
"matrix": [
[1, 3, 5],
[0.3333333333333333, 1, 3],
[0.2, 0.3333333333333333, 1]
],
"subcriteria": [
{
"type": "alternative",
"matrix": [[1, 2], [0.5, 1]],
"weights": [0.3571428571428571, 0.6428571428571428]
},
{
"type": "alternative",
"matrix": [[1, 0.5], [2, 1]],
"weights": [0.3571428571428571, 0.6428571428571428]
}
],
"weights": [0.5163977794943229, 0.24032297387124885, 0.24327924663442818]
},
{
"type": "criteria",
"matrix": [
[1, 3],
[0.3333333333333333, 1]
],
"subcriteria": [
{
"type": "alternative",
"matrix": [[1, 2], [0.5, 1]],
"weights": [0.3571428571428571, 0.6428571428571428]
},
{
"type": "alternative",
"matrix": [[1, 0.5], [2, 1]],
"weights": [0.3571428571428571, 0.6428571428571428]
}
],
"weights": [0.24032297387124885, 0.7596770261287512]
},
{
"type": "criteria",
"matrix": [[1]],
"weights": [1.0]
}
],
"matrix": null,
"weights": [0.5211261565009135, 0.3053941459543462, 0.1734796975447402],
"name": "root"
}
```
可以看到,每个准则和方案都被赋予了相应的权值。
阅读全文