数学建模笔记——TOPSIS[优劣解距离]法

ops/2024/9/20 8:59:18/ 标签: 数学建模, 笔记, python, matlab, 抽象代数, 课程设计, 算法

数学建模笔记——TOPSIS[优劣解距离法]

  • TOPSIS(优劣解距离)法
    • 1. 基本概念
    • 2. 模型原理
    • 3. 基本步骤
    • 4. 典型例题
      • 4.1 矩阵正向化
      • 4.2 正向矩阵标准化
      • 4.3 计算得分并归一化
      • 4.4 python代码实现

TOPSIS(优劣解距离)法

1. 基本概念

C. L.Hwang和 K.Yoon于1981年首次提出 TOPSIS(Technique for Order Preference by Similarity to an Ideal Solution),可翻译为逼近理想解排序法,国内常简称为优劣解距离法。

TOPSIS法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。

TOPSIS法引入了两个基本概念:

  • 理想解:设想的最优的解(方案),它的各个属性值都达到各备选方案中的最好的值;
  • 负理想解:设想的最劣的解(方案),它的各个属性值都达到各备选方案中的最坏的值。方案排序的规则是把各备选方案与理想解和负理想解做比较,若其中有一个方案最接近理想解,而同时又远离负理想解,则该方案是备选方案中最好的方案。TOPSIS通过最接近理想解且最远离负理想解来确定最优选择。
image-20240827194343296

2. 模型原理

TOPSIS法是一种理想目标相似性的顺序选优技术,在多目标决策分析中是一种非常有效的方法。它通过归一化后(去量纲化)的数据规范化矩阵,找出多个目标中最优目标和最劣目标(分别用理归想一解化和反理想解表示),分别计算各评价目标与理想解和反理想解的距离,获得各目标与理想解的贴近度,按理想解贴近度的大小排序,以此作为评价目标优劣的依据。贴近度取值在0~1之间,该值愈接近1,表示相应的评价目标越接近最优水平;反之,该值愈接近0,表示评价目标越接近最劣水平。

3. 基本步骤

  1. 将原始矩阵正向化

    将原始矩阵正向化,就是要将所有的指标类型统一转化为极大型指标

  2. 将正向化矩阵标准化

    标准化的方法有很多种,其主要目的就是去除量纲的影响,保证不同评价指标在同一数量级,且数据大小排序不

  3. 计算得分并归一化

    S i = D i − D i + + D i − S_{i}=\frac{D_{i}^{-}}{D_{i}^{+}+D_{i}^{-}} Si=Di++DiDi,其中 S i S_{i} Si为得分, D i + {D_{i}^{+}} Di+为评价对象与最大值的距离, D i − D_{i}^{-} Di

为评价对象与最小值的距离。

4. 典型例题

明星Kun想找一个对象,但喜欢他的人太多,不知道怎么选,经过层层考察,留下三个候选人。他认为身高165是最好的,体重在90-100斤是最好的。

候选人颜值牌气(争吵次数)身高体重
A910175120
B8716480
C6315790

4.1 矩阵正向化

常见的指标类型:

指标名称指标特点例子
极大型 (效益型) 指标越大(多)越好成绩、 GDP增速、 企业利润
极小型 (成本型) 指标越小(少)越好费用、 坏品率、污染程度
中间型指标越接近某个值越好水质量评估时的PH值
区间型指标落在某个区间最好体温、 水中植物性营养物量

在 TOPSIS 方法中,就是要将所有指标进行统一正向化,即统一转化为极大型指标。 那么就需要极小型、中间型以及区间型的指标进行转化为极大型指标。

指标名称公式
极大型(效益型)指标/
极小型(成本型)指标 x ~ = m a x − x \tilde{x} = max-x x~=maxx, x ~ \tilde{x} x~为指标值, m a x max max为指标最大值, x x x为指标值
中间型指标 { x i } \{x_i\} {xi} 是一组中间型序列,最优值是 x b e s t x_{best} xbest,$M = max{
区间型指标 x i {x_i} xi是一组区间型序列,最佳区间为 [ a , b ] [a,b] [a,b],正向化公式如下 M = m a x { a − m i n { x i } , m a x { x i } − b } , x ~ i = { 1 − a − x i M , x i < a 1 , a ≤ x i ≤ b 1 − x i − b M , x i > b M=max\{a-min\{x_i\}, max\{x_i\}-b\}, \widetilde{x}_i=\begin{cases}1-\frac{a-x_i}{M}, x_i<a\\1, a\leq x_i\leq b\\1-\frac{x_i-b}{M}, x_i>b\end{cases} M=max{amin{xi},max{xi}b},x i= 1Maxi,xi<a1,axib1Mxib,xi>b
  1. 颜值为极大型指标

  2. 脾气为极小型指标

    候选人颜值 m a x max max m a x − x max-x maxx
    A10100
    B7103
    C3107
  3. 身高为中间型指标

    候选人身高 x b e s t x_{best} xbest| x i − x b e s t x_i-x_{best} xixbest| x ^ i \hat{x}_i x^i
    A175165101
    B16416511/10
    C15716588/10
  4. 体重为区间型指标

    候选人体重 M M M x ^ i \hat{x}_i x^i
    A120200
    B80201/2
    C90201

正向化后的矩阵为

候选人颜值牌气(争吵次数)身高体重
A9000
B830.90.5
C670.21

4.2 正向矩阵标准化

标准化的目的是消除不同指标量纲的影响

假设有n个要评价的对象,m个评价指标(已经正向化了)构成的正向化矩阵如下:
X = [ x 11 x 12 ⋯ x 1 m x 21 x 22 ⋯ x 2 m ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x n m ] X=\begin{bmatrix}x_{11}&x_{12}&\cdots&x_{1m}\\x_{21}&x_{22}&\cdots&x_{2m}\\\vdots&\vdots&\ddots&\vdots\\x_{n1}&x_{n2}&\cdots&x_{nm}\end{bmatrix} X= x11x21xn1x12x22xn2x1mx2mxnm
那么对其标准化后的矩阵记为Z,Z的每一个元素:
z i j = x i j ∑ i = 1 n x i j 2 z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^nx_{ij}^2}} zij=i=1nxij2 xij
即(每一个元素/根号下所在列元素的平方和)得到标准化矩阵Z:
Z = [ z 11 z 12 ⋯ z 1 m z 21 z 22 ⋯ z 2 m ⋮ ⋮ ⋱ ⋮ z n 1 z n 2 ⋯ z n m ] Z=\begin{bmatrix}z_{11}&z_{12}&\cdots&z_{1m}\\z_{21}&z_{22}&\cdots&z_{2m}\\\vdots&\vdots&\ddots&\vdots\\z_{n1}&z_{n2}&\cdots&z_{nm}\end{bmatrix} Z= z11z21zn1z12z22zn2z1mz2mznm
标准化后,还需要给不同指标加上权重,采用的权重确定方法有层次分析法、熵权法、Delphi法、对数最小二乘法。这里认为各个指标权重相同。

对上述矩阵进行标准化,得

候选人颜值牌气(争吵次数)身高体重
A0.669000
B0.5950.3940.9760.447
C0.4460.9190.2170.894

4.3 计算得分并归一化

定义最大值:

Z + = ( m a x { z 11 , z 21 , ⋯ , z n 1 } , m a x { z 12 , z 22 , ⋯ , z n 2 } , ⋯ , m a x { z 1 m , z 2 m , ⋯ , z n m } ) Z^+=(max\{z_{11},z_{21},\cdots,z_{n1}\},max\{z_{12},z_{22},\cdots,z_{n2}\},\cdots,max\{z_{1m},z_{2m},\cdots,z_{nm}\}) Z+=(max{z11,z21,,zn1},max{z12,z22,,zn2},,max{z1m,z2m,,znm})
定义最小值:
Z − = ( m i n { z 11 , z 21 , ⋯ , z n 1 } , m i n { z 12 , z 22 , ⋯ , z n 2 } , ⋯ , m i n { z 1 m , z 2 m , ⋯ , z n m } ) Z^-=(min\{z_{11},z_{21},\cdots,z_{n1}\},min\{z_{12},z_{22},\cdots,z_{n2}\},\cdots,min\{z_{1m},z_{2m},\cdots,z_{nm}\}) Z=(min{z11,z21,,zn1},min{z12,z22,,zn2},,min{z1m,z2m,,znm})
定义第i (i=1,2,…,n) 个评价对象与最大值的距离:
D i + = ∑ j = 1 m ( Z j + − z i j ) 2 D_i^+=\sqrt{\sum_{j=1}^m(Z_j^+-z_{ij})^2} Di+=j=1m(Zj+zij)2
定义第i (i=1,2,…,n) 个评价对象与最小值的距离:
D i − = ∑ j = 1 m ( Z j − − z i j ) 2 D_i^-=\sqrt{\sum_{j=1}^m(Z_j^--z_{ij})^2} Di=j=1m(Zjzij)2
那么,我们可以计算得出第 i( i=1,2,…,n) 个评价对象未归一化的得分:
S i = D i − D i + + D i − S_i=\frac{D_i^-}{D_i^++D_i^-} Si=Di++DiDi

很明显 0≤Si≤1,且 Si 越大 Di+ 越小,即越接近最大值。

我们可以将得分归一化并换成百分制:
S i ~ = S i ∑ i = 1 n S i × 100 \widetilde{S_{\mathrm{i}}}=\frac{S_{\mathrm{i}}}{\sum_{i=1}^{n}S_{\mathrm{i}}}\times100 Si =i=1nSiSi×100

python_264">4.4 python代码实现

python">import numpy as np# 从用户输入参评数目和指标数目
print("请输入参评数目:")
n = int(input())
print("请输入指标数目:")
m = int(input())# 接受用户输入的类型矩阵
print("请输入类型矩阵:1. 极大型 2. 极小型 3. 中间型 4.区间型")
kind = input().split(" ")# 接受用户输入的矩阵并转化为向量
print("请输入矩阵:")
A = np.zeros(shape=(n, m))
for i in range(n):A[i] = input().split(" ")A[i] = list(map(float, A[i]))
print("输入矩阵为:\n{}".format(A))# 极小型指标转化为极大型指标的函数def minTomax(maxx, x):x = list(x)ans = [[(maxx-e) for e in x]]return np.array(ans)# 中间型指标转化为极大型指标的函数def midTomax(bestx, x):x = list(x)h = [abs(e-bestx) for e in x]M = max(h)if M == 0:M = 1  # 防止最大差值为0的情况ans = [[1-(e/M) for e in h]]return np.array(ans)# 区间型指标转化为极大型指标的函数def regTomax(lowx, highx, x):x = list(x)M = max(lowx-min(x), max(x)-highx)if M == 0:M = 1  # 防止最大差值为0的情况ans = []for i in range(len(x)):if x[i] < lowx:ans.append(1-(lowx-x[i])/M)elif x[i] > highx:ans.append(1-(x[i]-highx)/M)else:ans.append(1)return np.array([ans])# 同一指标类型,将所有指标转化为极大型指标
X = np.zeros(shape=(n, 1))
for i in range(m):if kind[i] == "1":v = np.array(A[:, i])elif kind[i] == "2":maxA = max(A[:, i])v = minTomax(maxA, A[:, i])elif kind[i] == "3":print("类型三,请输入最优值:")bestA = eval(input())v = midTomax(bestA, A[:, i])elif kind[i] == "4":print("类型四,请输入区间[a,b]值a:")lowA = eval(input())print("类型四,请输入区间[a,b]值b:")highA = eval(input())v = regTomax(lowA, highA, A[:, i])if i == 0:X = v.reshape(-1, 1)  # 如果是第一个指标,直接赋值else:X = np.hstack((X, v.reshape(-1, 1)))  # 如果不是第一个指标,横向拼接
print("统一指标后矩阵为:\n{}".format(X))# 对统一指标后的矩阵进行标准化处理
X = X.astype(float)  # 将X转化为浮点型
for i in range(m):X[:, i] = X[:, i]/np.sqrt(sum(X[:, i]**2))  # 对每一列进行归一化处理,即除以该列的欧几里得范数
print("标准化后矩阵为:\n{}".format(X))# 最大值和最小值距离的计算
x_max = np.max(X, axis=0)  # 计算每一列的最大值
x_min = np.min(X, axis=0)  # 计算每一列的最小值
# 计算每一个参评对象与最优情况的距离d+
d_z = np.sqrt(np.sum(np.square(X-np.tile(x_max, (n, 1))), axis=1))
# 计算每一个参评对象与最差情况的距离d-
d_f = np.sqrt(np.sum(np.square(X-np.tile(x_min, (n, 1))), axis=1))
print("每个指标的最大值为:{}".format(x_max))
print("每个指标的最小值为:{}".format(x_min))# 计算每一个参评对象的综合得分
s = d_f/(d_f+d_z)  # 根据d+和d-计算每一个参评对象的得分,其中s接近1表示越好,接近0表示越差
Score = 100*s/sum(s)  # 将得分转换为百分制
for i in range(n):print(f"第{i+1}个参评对象的得分为:{Score[i]}")

输入:

请输入参评数目:
3
请输入指标数目:
4
请输入类型矩阵:1. 极大型 2. 极小型 3. 中间型 4.区间型
1 2 3 4
请输入矩阵:
9 10 175 120
8 7 164 80
6 3 157 90
输入矩阵为:
[[  9.  10. 175. 120.][  8.   7. 164.  80.][  6.   3. 157.  90.]]
类型三,请输入最优值:
165
类型四,请输入区间[a,b]值a:
90
类型四,请输入区间[a,b]值b:
100

输出:

统一指标后矩阵为:
[[9.  0.  0.  0. ][8.  3.  0.9 0.5][6.  7.  0.2 1. ]]
标准化后矩阵为:
[[0.66896473 0.         0.         0.        ][0.59463532 0.3939193  0.97618706 0.4472136 ][0.44597649 0.91914503 0.21693046 0.89442719]]
每个指标的最大值为:[0.66896473 0.91914503 0.97618706 0.89442719]
每个指标的最小值为:[0.44597649 0.         0.         0.        ]
第1个参评对象的得分为:8.886366735657832
第2个参评对象的得分为:45.653341055701134
第3个参评对象的得分为:45.46029220864103

http://www.ppmy.cn/ops/108147.html

相关文章

基于C++实现(MFC界面)家谱管理系统

一、题目&#xff1a;家谱管理系统 二、内容&#xff1a; 2.1 概述 2.1.1 选题原因 做此题的原因是因为可以比较方便的记录家族历代成员的情况与关系&#xff0c;能很好的保存家族每一代的信息&#xff0c;而不用人工纸质的方式来存取家谱&#xff0c;更便于人们保存和使用…

如何看待IBM中国研发部裁员?

背景&#xff1a; 近日&#xff0c;IBM中国宣布撤出在华两大研发中心&#xff0c;引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展&#xff0c;也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对这一突如其来的变化&…

突发!如何应对微信小程序与公众号下发统一消息接口调整

前言 国庆节前夕&#xff0c;被同事突然Q到&#xff1a;“咱们的公众号消息推送是不是要修改&#xff1f;”&#xff0c;我一脸茫然&#xff0c;紧接着&#xff0c;他直接甩给我一个链接&#xff0c;我打开后一看。一瞬间愉快的心情完全被打乱了。 但是&#xff0c;不要慌&…

2024 年高教社杯全国大学生数学建模竞赛题目-C 题 农作物的种植策略

根据乡村的实际情况&#xff0c;充分利用有限的耕地资源&#xff0c;因地制宜&#xff0c;发展有机种植产业&#xff0c;对乡村经济 的可持续发展具有重要的现实意义。选择适宜的农作物&#xff0c;优化种植策略&#xff0c;有利于方便田间管理&#xff0c;提 高生产效益&#…

FastGPT自定义插件的icon

最近研究FastGPT的自定义插件&#xff0c;经过好几天的折磨&#xff0c;终于实现了一个简单的发送邮件功能&#xff0c;但是呢在使用的时候发现插件的icon是默认的fastgpt的logo&#xff0c;那肯定得自定义一个啊。直接说方法&#xff1a; 1、自定义插件下面的template.json文件…

MATLAB绘图基础6:MATLAB绘图基础

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 6.MATLAB绘图基础 6.1 MATLAB绘图基本流程 % 1.创建图形窗口; % 1.1 创建一个空白图形窗口; figure;% 1.2 创建一个带有指定标题的图形窗口; figure(Name, 图形窗口);% 1.3 创建一个具有指定…

Docker Container 常用命令

文章目录 目录 文章目录 1 . 什么是容器&#xff1f; 2 . 容器命令清单 docker create docker run docker ps docker logs docker exec docker kill docker container inspect docker cp docker rm docker export 总结 1 . 什么是容器&#xff1f; 通俗地讲&a…

阅读笔记--Guiding Attention in End-to-End Driving Models(二)

端到端驾驶的注意力学习&#xff08;Attention Learning for End-to-End Driving&#xff09;关键内容学习 3.1 问题设置&#xff08;Problem Setup&#xff09; 模仿学习&#xff08;Imitation Learning, IL&#xff09;&#xff1a;介绍了模仿学习的概念&#xff0c;即通过…

【Nacos】负载均衡

生产环境相对是比较恶劣的,我们需要对服务的流量进行更加精细的控制.Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等. 1. 服务下线 当某一个节点上接口的性能较差时,我们可以第一时间对该节点进行下线. 操作步骤: 服务详情 ->下线 当点击下线后&#xff0c;…

Python 将字典转换为 JSON

在 Python 中&#xff0c;可以使用 json 模块将字典转换为 JSON 格式的字符串。该模块提供了 json.dumps() 方法&#xff0c;用于将 Python 对象&#xff08;如字典、列表&#xff09;序列化为 JSON 字符串。 1、问题背景 用户想要将一个 Python 字典转换为 JSON 格式&#xf…

力扣209:长度最小的数组

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xff1a;…

Android13_SystemUI下拉框新增音量控制条

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Android13_SystemUI下拉框新增音量控制条 一、必备知识二、源码分析对比1.brightness模块分析对比2.statusbar/phone 对应模块对比对比初始化类声明对比构造方法 三、源码修改…

使用Redis实现记录访问次数(三种方案)

目录 0. 前言1. 使用Filter实现2. 使用AOP实现 1. 导入依赖 2. 写一个切面类&#xff0c;实现统计访问次数。 3. 开启AOP 4. 测试 5. plus版本 (1) 新建一个bean类 (2) 新增一个controller方法 (3) 新增一个循环增强方法 (4) 测试…

亚马逊测评自养号卖家如何以低成本提高店铺产品曝光率和销量?

在跨境电商领域&#xff0c;随着市场日趋饱和和竞争加剧&#xff0c;卖家普遍面临流量低、转化率低的共同挑战。为了在这种严重的“内卷化”环境中脱颖而出&#xff0c;不少卖家投入了大量的资金和资源&#xff0c;尝试了各种站内和站外的推广方式&#xff0c;但往往因为缺乏成…

原装N9000B信号分析仪keysight/N9000B,N9000A详情参数

是德Keysight N9000B CXA 信号分析仪&#xff0c;多点触控&#xff0c; 特征&#xff1a; 9 kHz 至 26.5 GHz 的宽频率范围以及高达 25 MHz 的分析带宽让您了解更多 为手动和自动化制造测试系统添加可靠的信号分析 执行基本测量&#xff0c;例如杂散搜索和失真分析 使用可选…

牛客周赛 Round 59(下)

逆序数 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll n,k;cin>>n>>k;ll sum(n*(n-1))/2;cout<<sum-k<<endl;return 0; } 代码思路 组合数的计…

设计模式之状态模式 (C++ 实现)

设计模式是软件开发中的一项重要技能&#xff0c;它提供了一种通用的解决方案以应对不同的设计问题。状态模式是一种行为型设计模式&#xff0c;适用于对象在不同状态下表现出不同的行为。通过实现状态模式&#xff0c;可以让代码更清晰、更易扩展与维护。本文将通过C实现状态模…

Spring6梳理7——依赖注入之特殊类型属性

目录 ①字面量赋值 ②null值 ③xml实体 ④CDATA节 ①字面量赋值 什么是字面量&#xff1f; int a10; 字面量是在源代码中用来表示固定值的表示法。几乎所有的计算机编程语言都支持基本值的字面量表示&#xff0c;例如整数、浮点数和字符串。许多语言还支持布尔类…

在亚马逊云科技上利用Agent和生成式AI写小说(下篇)

今天小李哥将继续介绍亚马逊推出的国际前沿人工智能AI大模型平台Amazon Bedrock上的Agent的功能。我们将利用Agent结合应用代码工作流服务Step Functions创建链式提示词&#xff08;Prompt Chaining&#xff09;&#xff0c;通过提示词执行一系列调用Amazon Bedrock上AI大模型的…

Scikit-learn与TensorFlow哪个好

Scikit-learn 和 TensorFlow 是两款非常流行的机器学习库&#xff0c;但它们适合的使用场景不同&#xff0c;取决于任务的复杂性和需求。让我们比较一下它们的特点&#xff0c;帮助你选择合适的工具。 1. Scikit-learn Scikit-learn 是一个经典的机器学习库&#xff0c;主要用…