TOPSIS算法模型

一、概念

TOPSIS模型是一种多属性决策分析方法,也称优劣解距离算法,用于评估和选择最佳的方案或决策。它基于以距离测量为基础的理念,通过比较候选方案与理想解和负理想解之间的相似度来确定最优解。

TOPSIS模型的基本思想是将每个方案表示为一个多维数据集,其中每个维度代表一种性能指标或属性。在模型中,通过以下几个步骤来确定最优方案:

(1)构建决策矩阵:将各个方案的性能指标数据组织成一个决策矩阵,其中每行表示一个方案,每列表示一个性能指标。

(2)标准化决策矩阵:对决策矩阵进行标准化处理,将不同指标的数据尺度统一,以避免指标之间的差异对结果产生不合理的影响。

(3)确定理想解和负理想解:根据决策矩阵中每个指标的性质,确定理想解(最大值或最小值)和负理想解(最小值或最大值)。

(4)计算方案与理想解和负理想解之间的相似度:使用某种距离度量方法(如欧氏距离、曼哈顿距离等),计算每个方案与理想解和负理想解之间的相似度。

(5)计算综合评价指数:根据方案与理想解和负理想解的相似度,计算每个方案的综合评价指数,用于衡量其优劣程度。

(6)排序和选择最优解:根据综合评价指数,对各个方案进行排序,选取综合评价指数最高的方案作为最优解。

TOPSIS适用条件:比较对象远大于两个(可对比一下层次分析法),比较的指标不止一方面。

二、小案例

题目:评价一下20条河流的水质情况,根据一个名为"maht1.xlsx"文件的数据。

具体数据如下:

 python代码实现:

import pandas as pd
import numpy as np

#导入数据
df = pd.read_excel(r'.\math1.xlsx')

def Mintomax(datas):
    return np.max(datas) - datas

df['细菌总数(个/mL)'] = Mintomax(df['细菌总数(个/mL)'])  # 极小型指标 -> 极大型指标

# 中间型指标 -> 极大型指标
def Midtomax(datas, x_best):
    temp_datas = datas - x_best
    M = np.max(abs(temp_datas))
    answer_datas = 1 - abs(datas - x_best) / M
    return answer_datas

df['PH值'] = Midtomax(df['PH值'], 7)  # 中间型指标 -> 极大型指标 7为最佳值

# 区间型指标 -> 极大型指标
def Intertomax(datas, x_min, x_max):
    M = max(x_min - np.min(datas), np.max(datas) - x_max)
    answer_list = []
    for i in datas:
        if (i < x_min):
            answer_list.append(1 - (x_min - i) / M)
        elif (i > x_max):
            answer_list.append(1 - (i - x_max) / M)
        else:
            answer_list.append(1)
    return np.array(answer_list)
df['植物性营养物量(ppm)'] = Intertomax(df['植物性营养物量(ppm)'], 10, 20)  # 区间型指标 -> 极大型指标  10为下界,20为上界

# 正向化矩阵标准化(去除量纲影响)
def Standard(datas):
    k = np.power(np.sum(pow(datas, 2), axis=0), 0.5)
    for i in range(len(k)):
        datas[:, i] = datas[:, i] / k[i]
    return datas

label_need = df.keys()[1:]
data = df[label_need].values  # 刨除变量名后的数据值
sta_data = Standard(data)  # 正向化矩阵标准化(去除量纲影响)

# 计算得分并归一化
def Score(sta_data):
    z_max = np.amax(sta_data, axis=0)
    z_min = np.amin(sta_data, axis=0)
    # 计算每一个样本点与最大值的距离
    tmpmaxdist = np.power(np.sum(np.power((z_max - sta_data), 2), axis=1), 0.5)
    tmpmindist = np.power(np.sum(np.power((z_min - sta_data), 2), axis=1), 0.5)
    score = tmpmindist / (tmpmindist + tmpmaxdist)
    score = score / np.sum(score)  # 归一化处理
    return score
sco = Score(sta_data)  # 计算得分
df['综合得分'] = sco
print(df)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值