0
点赞
收藏
分享

微信扫一扫

python 优劣解距离法(TOPSIS)

天涯学馆 2022-03-31 阅读 70
python

问题:

假设现在有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名。

举报

相关推荐

0 条评论