【数模百科】一篇文章讲清楚TOPSIS算法和python代码实现

本篇文章转载于 TOPSIS原理 - 数模百科

在生活中我们常常需要做各种选择,比如在超市里挑选水果,不止看大小,也得看新鲜程度,还可能要考虑价格。这就好比是我们面对一个有好几个不同目标要考虑的问题。在科学研究或者公司决策时,这样的情况也很常见,我们称之为多目标优化问题。这时候,就需要一种方法来帮我们权衡这些不同的目标,找出一个最平衡的、最适合的解决方案。这就是优劣解距离法(TOPSIS)大显身手的时候。

优劣解距离法呢,它就像是一个帮手,可以帮助我们在一大堆可能的方案中,评估哪些是比较好的,哪些是比较差的。想象一下,每个方案就像一个点,而最好的方案和最差的方案分别像两个标杆。优劣解距离法的工作,就是测量其他所有方案与这两个标杆之间的距离。距离最好方案近的,就认为更优秀;距离最差方案近的,就看作不太理想。

这种方法特别适用于那些需要同时考虑多个方面因素的决策场景,比如公司要买新设备,就得考虑设备的性能、价格、耗能、维护成本等等。用优劣解距离法,就可以比较全面地评估每一款设备的总体表现,帮助决策者做出更明智的选择。

当然了,优劣解距离法也不是万能的。有时候,如果我们面对的方案分布得特别奇怪,这个方法可能就不太好判断哪个方案更优了。这个时候,我们就得结合其他的一些评价手段,比如专家意见或者其他决策方法,来一起帮忙做出最终的选择。

简单来说,优劣解距离法就是帮我们在多种可能性中挑选出最合适方案的小助手,让我们在面对多个目标要求时,也能做出既公平又靠谱的决策。

白话文

你在街上逛夜市,摊位上堆满了各种各样的小吃:有烤串、炸鸡、泡泡冰...哎呀,看得我口水都要流下来了。你肚子饿了,但是只能挑一样来吃,这可怎么办呢?

你平时最爱吃烤猪蹄了,味道好吃又价格实惠,可不知怎么的,今天烤猪蹄的摊子前面排了好长的队伍,少说也要一个小时才能排到你。仔细想想,烤羊肉串也不错,味道虽然稍逊色于猪蹄,可是一口一串实在是过瘾,你跑到烧烤摊一看,嘿,正巧人不多,刚想找老板点单,结果你发现羊肉串居然涨价了,从5块钱一串涨到了10块钱!这这这实在是过分,不能因为现在夜市人流量大,就涨价宰客吧,你愤愤离去。走着走着,你的肚子已经咕咕叫了,这时候突然有一阵香味,你不由自主地顺着味道来到一家炸鸡店前。你发现这家的炸鸡色泽诱人,香气扑鼻,价格还适中,最重要的是这家店所在的地理位置一般,几乎没什么人来。这可正和你意!当即你掏出钱包,买了一个炸鸡腿。

一边啃炸鸡腿,你一边想,你挑选美食其实是有一定的原则的,看烤猪蹄的队伍依旧那么长,你发现其实有的人为了自己觉得好吃的美食,等再长时间也是愿意的;烧烤摊那里依旧人声鼎沸,老板在卖力吆喝,你发现有的人为了美食,可以不那么在乎价格。但是你不一样,在你心目中,再好吃的美食,你也不愿意等那么长时间;你也不会愿意为了想吃的东西付上高昂的费用。如果有种美食能兼顾味道好吃、价格公道、不用排太长时间队,那自然是最好,可是大多时候你没那么幸运,遇不上这种美食。其实你的心里有杆秤,美食的等待时间比价格重要,价格比味道重要。

TOPSIS就像是你脑子里的一个小秤,帮你衡量每个小吃的得失。它先是给每样小吃打分,味道好的得高分,价格低的也得高分,排队人少的同样得高分。然后,它会量一量,看这个小吃离你心目中的“美食天堂”有多近,再看看它离“糟糕食物地狱”有多远。

最后,TOPSIS就是拿这两个距离做个对比。如果一种小吃离天堂近而且离地狱远,那它就是你的不二之选。换句话说,TOPSIS就是那个帮你从一大堆看起来都不错的选择里,精准挑出那个最合你心意的小秘书。

简而言之,TOPSIS就是那个懂你,在你犹豫不决时给你指明方向的老铁。下次选东西,有了它,就不用担心挑花眼啦!

定义与详解

定义

TOPSIS(逼近理想解排序法)是一种用于多准则决策的分析工具,用于评估和比较一系列备选方案。TOPSIS的核心理念是:最优的选择应当是与理想最优方案最为接近,同时与最差方案最为疏远的那个选项。

解法步骤

步骤1:建立评价矩阵

首先,确定一系列评价准则,并将备选方案按照这些准则的评价值进行排列,形成评价矩阵 X。其中,x_{ij} 表示第 i 个备选方案在第 j 个准则上的具体评价值。

步骤2:数据标准化

为了消除不同评价指标之间的量纲影响,需要对评价矩阵进行标准化处理,使得所有数据都在同一个尺度上进行比较。标准化的计算公式如下:

r_{ij} = \frac{x_{ij}}{\sqrt{\sum_{i=1}^{n}x_{ij}^2}} .

r_{ij} 为标准化后得到的数值。

步骤3:计算加权矩阵

根据每个准则的重要性分配权重,然后用这些权重来加权标准化后的矩阵,计算公式如下:

v_{ij} = w_j r_{ij} .

v_{ij} 为考虑权重后的数据。

步骤4:确定正理想解和负理想解

正理想解(A^*)和负理想解(A^-)分别代表所有备选方案中最理想和最不理想的情况。正理想解是每个准则上备选方案得分的最大值,负理想解是每个准则上的最小值,即:

A^* = (v_1^*, v_2^*, ..., v_m^*) \quad, \quad A^- = (v_1^-, v_2^-, ..., v_m^-).

其中,v_j^*v_j^- 分别是第 j 个准则的最大值和最小值。

步骤5:计算各备选方案与正、负理想解的距离

计算每个备选方案到正理想解和负理想解的欧氏距离,计算公式为:

S_i^+ = \sqrt{\sum_{j=1}^{m} (v_{ij}-v_j^*)^2} \quad, \quad S_i^- = \sqrt{\sum_{j=1}^{m} (v_{ij}-v_j^-)^2}.

步骤6:计算接近度

根据每个方案与正理想解的接近程度以及与负理想解的疏离程度来评估其优劣。接近度越高,方案越优。计算公式如下:

C^* = \frac{S^-}{S^+ + S^-} .

计算出所有备选方案的接近度后,就可以根据这个值的大小来对方案进行排序,从而得出最优的选择。

代码

假设您是一家手表经销商,计划从3个供应商中选出最佳供应商。您根据价格、质量、交货时间和服务四个指标对每个供应商进行了打分,得到的评分矩阵如下:

供应商

价格

质量

交货时间

服务

1

3

2

2

1

2

2

2

3

2

3

2

3

2

3

同时,对于这四个指标,您认为质量和交货时间比较重要,因此给出了对应的权重:[0.2,0.3,0.3,0.2] ,而于价格评价,您期望价位更低更好(即负理想化),其余三项期望得分越高越好(即正理想化)。

我们就可以用Python代码来计算相对接近度,最后选择相对接近度最大的供应商作为采购来源。

import numpy as np

def topsis(a,w, I):
    # 转化为array
    a = np.array(a, dtype=np.float)
    w = np.array(w, dtype=np.float)
    
    # 归一化
    a = a/np.sqrt((a**2).sum(axis=0))
    
    # 加权
    a_w = a * w
    
    # 最优最劣方案
    z_pos = [a_w[:,i].max() if I[i]=='+' else a_w[:,i].min() for i in range(a_w.shape[1])]
    z_neg = [a_w[:,i].min() if I[i]=='+' else a_w[:,i].max() for i in range(a_w.shape[1])]
    
    # 曼哈顿距离
    d_pos = abs(a_w - z_pos).sum(axis=1)
    d_neg = abs(a_w - z_neg).sum(axis=1)
    
    # 相对接近度
    p = d_neg/(d_pos + d_neg)
    
    return p

# 测试数据
a = [[3,2,2,1],[2,2,3,2],[2,3,2,3],[2,4,4,3]] # 数据矩阵
w = [0.2,0.2,0.3,0.3] # 权重
I= ['-','+','+','+'] #最大化还是最小化

result = topsis(a,w,I)
for i,p in enumerate(result, start=1):
    print(f'方案{i}的相对接近度:{p}')

输出结果:

方案1的相对接近度:0.0
方案2的相对接近度:0.46209857181885894
方案3的相对接近度:0.5937865049144532
方案4的相对接近度:1.0

TOPSIS的优缺点

优点:

  • 可以处理有多个决策目标的问题,且每个目标可有不同的权重。

  • 不需要假设决策标准之间的独立性。

  • 简单易于理解,计算不复杂。

缺点:

  • 对决策标准的权重设定过于依赖于决策者的主观判断,可能存在一定的误差。

  • 依赖于历史数据进行预测,对新出现的外部情况适应性比较差。

  • 忽略了决策标准之间的交互作用,对于有明显交互效应的决策问题,可能导致决策结果的偏差。

本文来源于数模百科 ——  TOPSIS原理 - 数模百科

数模百科是一个由一群数模爱好者搭建的数学建模知识平台。我们想让大家只通过一个网站,就能解决自己在数学建模上的难题,把搜索和筛选的时间节省下来,投入到真正的学习当中。

我们团队目前正在努力为大家创建最好的信息集合,从用最简单易懂的话语和生动形象的例子帮助大家理解模型,到用科学严谨的语言讲解模型原理,再到提供参考代码。我们努力为数学建模的学习者和参赛者提供一站式学习平台,目前网站已上线,期待大家的反馈。

如果你想和我们的团队成员进行更深入的学习和交流,你可以通过公众号数模百科找到我们,我们会在这里发布更多资讯,也欢迎你来找我们唠嗑。

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)是一种多属性决策分析方,它可以用来评价一组备选方案,从而确定最佳方案。在Python中,我们可以使用numpy库和pandas库实现TOPSIS算法。 以下是一份简单的TOPSIS Python代码示例: ```python import numpy as np import pandas as pd # 数据预处理 data = pd.read_csv('data.csv') # 读入数据 X = data.iloc[:, 1:].values # 取得数据矩阵 w = [0.25, 0.25, 0.25, 0.25] # 权重向量 n = X.shape # 样本数量 m = X.shape # 属性数量 # 归一化矩阵 for j in range(m): X[:, j] = X[:, j] / np.sqrt(sum(X[:, j] ** 2)) # 确定最优与最劣方案 ideal_best = [] ideal_worst = [] for j in range(m): if data['优化指标'][j] == 'max': ideal_best.append(max(X[:, j])) ideal_worst.append(min(X[:, j])) else: ideal_best.append(min(X[:, j])) ideal_worst.append(max(X[:, j])) # 计算距离 S_best = np.sqrt(np.sum((X - ideal_best) ** 2, axis=1)) S_worst = np.sqrt(np.sum((X - ideal_worst) ** 2, axis=1)) # 计算相对接近度 C = S_worst / (S_best + S_worst) # 输出排序结果 rank = pd.DataFrame({'方案名称': data['方案名称'], 'C值': C}) rank = rank.sort_values(by='C值', ascending=False) print(rank) ``` 以上代码中,我们首先读入数据并处理成样本矩阵。然后,我们使用权重向量将数据矩阵归一化。接下来,我们确定最优与最劣方案,并计算每个备选方案到最优方案和最劣方案的距离。最后,我们计算每个备选方案的相对接近度,并按照相对接近度从大到小进行排序输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值