问题:
假设现在有g个待评价对象,p个评价指标,需要对这g个待评价对象排名
步骤:
1.构造矩阵如下:
2.根据TOPSIS思想,首先确定最优序列Y+和最劣序列Y-:
2.计算每个待评价对象与最优序列的接近程度d+和最劣序列的接近程度d-:
3.计算相对接近度cj:
4.根据相对接近度大小对所有待评价单位进行排名。
代码:
这里取5个待评价和4个指标举例:
import pandas as pd
import numpy as np
class TOPSIS:
def __init__(self, array, weightList):
self.array = np.array(array)
self.weightList = weightList
def getSequence(self):
OptimalSequence = []
WorstSequence = []
for row in range(self.array.shape[0]):
OptimalSequence.append(max(self.array[row]))
WorstSequence.append(min(self.array[row]))
return OptimalSequence,WorstSequence
def relative_proximity(self):
OptimalSequence, WorstSequence = self.getSequence()
allOptimalProximity = []
allWorstApproximation = []
for column in range(self.array.shape[1]):
resultList_Optimal = []
resultList_Worst = []
for row in range(self.array.shape[0]):
resultList_Optimal.append(self.weightList[row]*((OptimalSequence[row] - self.array[row][column])**2))
resultList_Worst.append(self.weightList[row]*((WorstSequence[row] - self.array[row][column])**2))
allOptimalProximity.append(sum(resultList_Optimal)) # 与最优绩效的接近程度
allWorstApproximation.append(sum(resultList_Worst)) # 与最劣绩效的接近程度
relativeProximity = []
for i in range(len(allOptimalProximity)):
relativeProximity.append(allWorstApproximation[i] / (allWorstApproximation[i] + allOptimalProximity[i]))
return allOptimalProximity,allWorstApproximation,relativeProximity
def rank(self):
allOptimalProximity, allWorstApproximation, relativeProximity = self.relative_proximity()
return pd.Series(relativeProximity).rank(ascending = False)
if __name__ == '__main__':
matrix = [
[94,95,88,76,91],
[72,92,88,86,95],
[84,72,66,76,85],
[79,85,76,90,88]
]
weightList = [0.1, 0.3, 0.2, 0.4]
OptimalSequence, WorstSequence = TOPSIS(matrix, weightList).getSequence()
allOptimalProximity, allWorstApproximation,relativeProximity = TOPSIS(matrix,weightList).relative_proximity()
rank = TOPSIS(matrix,weightList).rank()
print(rank)
结果:
如下图,表示索引为0~4的5个待评价单位的名次依次为第5、2、4、3、1名。