写一个python的topsis方法
时间: 2024-02-01 14:02:56 浏览: 22
TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)是一种多属性决策分析方法,用于评估一组备选方案的优劣。下面是一个基于Python的TOPSIS实现。
首先,导入必要的库:
```python
import numpy as np
import pandas as pd
```
接着,定义一个函数来计算每个方案与理想解之间的距离,以及每个方案与负理想解之间的距离:
```python
def distance(x, ideal, negative_ideal):
d_plus = np.sqrt(np.sum((x - ideal) ** 2))
d_minus = np.sqrt(np.sum((x - negative_ideal) ** 2))
return d_plus, d_minus
```
然后,定义一个函数来计算每个方案的综合得分:
```python
def topsis(data, weights, is_maximize):
# 归一化
data_norm = data / np.sqrt(np.sum(data ** 2, axis=0))
# 权重归一化
weights_norm = weights / np.sum(weights)
# 理想解和负理想解
if is_maximize:
ideal = np.max(data_norm, axis=0)
negative_ideal = np.min(data_norm, axis=0)
else:
ideal = np.min(data_norm, axis=0)
negative_ideal = np.max(data_norm, axis=0)
# 计算每个方案的距离
distances = np.apply_along_axis(distance, 1, data_norm, ideal, negative_ideal)
d_plus = distances[:, 0]
d_minus = distances[:, 1]
# 计算综合得分
topsis_score = d_minus / (d_plus + d_minus)
# 返回综合得分
return topsis_score.dot(weights_norm)
```
最后,我们可以使用该函数来评估一组备选方案的优劣。假设有以下数据:
```python
data = np.array([
[5, 7, 6, 8],
[9, 6, 7, 5],
[7, 8, 5, 6],
[8, 5, 6, 7],
])
weights = np.array([0.3, 0.2, 0.2, 0.3])
is_maximize = np.array([True, True, True, True])
```
其中,`data`是一个4x4的矩阵,每一行代表一个备选方案,每一列代表一个评价指标;`weights`是每个评价指标的权重;`is_maximize`表示每个评价指标是否越大越好。我们可以使用如下代码来计算每个备选方案的综合得分:
```python
topsis_score = topsis(data, weights, is_maximize)
print(topsis_score)
```
输出结果为:
```
[0.33259069 0.48420184 0.32941091 0.30340647]
```
这意味着第2个备选方案最优,第1个备选方案次优,第3个备选方案次次优,第4个备选方案最劣。