数学建模评价类—Topsis法

目录

文章目录

前言

切记:以下内容仅用于参考理解,不可用于数模竞赛!!!

一、Topsis的基本原理

二、Topsis的建模过程

1.判断矩阵是否需要正向化

2.原始矩阵正向化

3.矩阵标准化

4.计算距离,给出得分

总结


前言

本文会讲解到用于评价类问题的第二种方法—Topsis(优劣解距离)法 

切记:以下内容仅用于参考理解,不可用于数模竞赛!!!

使用Topsis法的特征:运用于多目标决策分析中。此时一般具有不同的选择,以及不同的指标用于评价选择的好坏,并且给出了具体的数据,并且我们知道这些指标怎样算好,所以我们能对不同的选择做出评价得出最优的选择。


一、Topsis的基本原理

TOPSIS法引入了两个基本概念:
理想解:设想的最优的解(方案),它的各个属性值都达到各备选方案中的最好的值;
负理想解:设想的最劣的解(方案),它的各个属性值都达到各备选方案中的最坏的值。

方案排序的规则:是把各备选方案与理想解和负理想解做比较,若其中有一个方案最接近理想解,而同时又远离负理想解,则该方案是备选方案中最好的方案

模型原理:归一化后(去量纲化)的数据规范化矩阵,找出多个目标中最优目标和最劣目标(分别用理归想一解化和反理想解表示),分别计算各评价目标与理想解和反理想解的距离,获得各目标与理想解的贴近度,按理想解贴近度的大小排序,以此作为评价目标优劣的依据。

评判标准:贴近度取值在0~1之间,该值愈接近1,表示相应的评价目标越接近最优水平;反之,该值愈接近0,表示评价目标越接近最劣水平。

二、Topsis的建模过程

1.判断矩阵是否需要正向化

基本思路:输入所给矩阵,得出有几个评价对象和几个评价指标,根据主观判断是否需要对所给指标进行正向化处理

如:假如我们要选对象,有颜值,脾气,身高,体重这几个评价指标;易得颜值应为极大型,脾气为极小型,身高为中间型,体重为区间型(具体如何判断类型在第二部分!!!

D = input('指标矩阵A=');  %输入判断矩阵
[n,m] = size(D); %得出矩阵D具有几行几列
%这个地方为了实现打印的值能够随着n的变化而变化,所以运用了字符串拼接函数
%字符串拼接后是一个字符串数组,so要用[]
disp(['共有' num2str(n) '个评价对象',num2str(m) '个评价指标']);Judge = input([num2str(m) '个指标是否需要经过正向化处理,需要请输入1,不需要则输入0']);if 1==Judgeposition = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]:');disp('请输入需要处理的这些列的指标类型(1:极小型 ,2:中间型 ,3:区间型)');type = input('例如:第二列是区间型,第三列是中间型,第五列是极小型,则输入[3,2,1]');%用数组存储对应的值%特别注意position和type是两个同维度的行向量,千万不要漏填了for k = 1:size(position,2)%这里2代表维度,求的是position列的数量%有几列需要处理则循环多少次D(:,position(k)) = Positivization(D(:,position(k)),type(K),position(k));enddisp('正向化处理后的矩阵 D= ');disp(D);
end

2.原始矩阵正向化

目标:将所有的指标类型统一转化为极大型指标

指标类型及其转化为极大型的公式:

为了方便,我们将实现转化的公式都单独写成函数实现(Matlab代码)

此时我们写一个函数名为positivation实现所有指标的正向化,对于每种不同的指标我们有不同的处理方法,此时我们同样可以单独写函数来实现不同的功能,在positivation函数中调用其他函数

function [Posit_D] =Positivization(D,type,k)
%输入变量D,type,k
%D:需要正向化处理的指标对应的原始列向量
%type:指标的类型(1:极小型 ,2:中间型 ,3:区间型)
%k:正在处理的是原始矩阵中的哪一列
%输出变量Posit_D是正向化后的列向量if 1==typedisp(['第',num2str(k),'列是极小型,正在正向化'])Posit_D = Min2Max(D);%调用Min2Max函数来正向化disp(['第',num2str(k),'列极小项正向化处理完成'])disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')elseif 2==typedisp(['第',num2str(k),'列是中间型,正在正向化'])best = input('请输入最优值:');Posit_D = Mid2Max(D,best);%调用Mid2Max函数来正向化disp(['第',num2str(k),'列中间型正向化处理完成'])disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')elseif 3==typedisp(['第',num2str(k),'列是区间型,正在正向化'])a = input('请输入区间下界:');b = input('请输入区间上界:');Posit_D = Inter2Max(D,a,b);%调用Inter2Max函数来正向化disp(['第',num2str(k),'列区间型正向化处理完成'])disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')elsedisp('没有该种类型的指标请重新输入')endend

接下来我们实现不同指标的转化函数 

  • 极大型:越大越好。如:成绩,GDP增速
  • 极小型:越小越好。如:坏品率,污染程度

\widetilde{x}=max-x

~x为转化后指标,max为指标最大值,𝑥为指标值

function [Posit_D] = Min2Max(D)Posit_D =max(D)-D;%最大值-每一列的值end
  • 中间型:越趋近于某个值越好。如:身高,监测水质的PH

function [Posit_D]= Mid2Max(D,best)
M = max(abs(D-best));%同理将公式套用即可
Posit_D = 1-abs(D-best)/M ;
end
  • 区间型:在区间内的数据最好。如:体重,体温

function [Posit_D] = Inter2Max(D,a,b)row_D =size(D,1);M = max([a-min(D),max(D)-b]);%将Posit_D初始化为0,节省处理时间Posit_D = zeros(row_D,1); %创建一个row_D行,1列的全零矩阵for j=1:row_Dif D(j)<aPosit_D(j) = 1-(a-D(j))/M;elseif D(j)>aPosit_D(j) = 1-(D(j)-b)/M;elsePosit_D(j) = 1;endend
end

3.矩阵标准化

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

公式:记标准化的矩阵为Z,已经正向化后的矩阵为X,则Z中的每一个元素

%2.对正向化后的矩阵标准化
B = D./repmat(sum((D.*D).^0.5),n,1);%sum默认是矩阵的列相加
disp('标准化矩阵B =');
disp(B);

4.计算距离,给出得分

距离计算实际上就是计算两点间的距离,只不过这里是一个m维的坐标,点的坐标为(z1,z2,···zm)

再计算出得分

前面我们提到了贴近度(得分)越接近1,方案应该是越好的,此处我们易得0=< Si <=1,当Di+越小时,Si越趋近于1,此时方案越好 

最后对得分进行归一化并换算成百分制

 最后根据得分越高方案越优排序即可。

D_P = sum((B - repmat(max(B),n,1)) .^ 2 ,2) .^ 0.5; % D+ 与最大值的距离向量
D_N = sum((B - repmat(min(B),n,1)) .^ 2 ,2) .^ 0.5; % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N); % 未归一化的得分
disp('最后的得分为:')
stand_S = 100*S / sum(S);%对数据进行归一化处理并且使用百分制
[sorted_S,index] = sort(stand_S ,'descend');%sort函数默认升序排列,sort(A,1)——升序,sort(A,2)——降序
%此处将排序后的值以及,值所对应的索引输出

总结

切忌:以上代码仅做参考,不能用于数模竞赛中!!!
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391942.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA的工作本科可以做吗?

在FPGA行业中&#xff0c;这样的偏见一直存在。 很多人认为&#xff0c;只有985、211的硕士才有资格涉足这一领域&#xff0c;甚至有人表示&#xff0c;即使是9、2本硕也难以找到工作&#xff0c;本科生就不要想了。 难到真的只有985&#xff0c;211的研究生才能有机会入行FPG…

安卓常用控件ListView

文章目录 ListView的常用属性ListView的常用APIListView的简单使用 ListView是一个列表样式的 ViewGroup&#xff0c;将若干 item 按行排列。它是一个很基本的控件也是 Android 中最重要的控件之一。它可以实现多个 View 的垂直排列并支持滚动显示效果。 ListView的常用属性 常…

农场游戏中的时间管理实例

一、准备工作 在Unity中创建承载日期和时间的文本 二、设置游戏的时间戳 using System.Collections; using System.Collections.Generic; using UnityEngine; //标识这个类可以被序列化 [System.Serializable] public class GameTimestamp {// 游戏时间戳的成员变量public in…

鸿蒙next 评分组件来了 我不允许你不会

前言导读 各位同学大家,有段时间没有跟大家见面了,因为最近一直在更新鸿蒙的那个实战课程所以就没有去更新文章实在是不好意思, 所以今天就给大家更新一期实战案例 评分组件 希望帮助到各位同学工作和学习 效果图 接口 Rating(options?: { rating: number, indicator?:…

48天笔试训练错题——day40

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 发邮件 2. 最长上升子序列 选择题 1. DNS 劫持又称域名劫持&#xff0c;是指在劫持的网络范围内拦截域名解析的请求&#xff0c;分析请求的域名&#xff0c;把审查范围以外的请求放行&#xff0c;否则返回…

开关电源之电压的影响因素和指标

开关电源并不是一个简单的小盒子&#xff0c;它相当于有源器件的心脏&#xff0c;不断地为元件提供能量。电源质量的好坏直接影响到元器件的性能。开关电源的设计、制造和质量管理需要精密的电子仪器来模拟电源的实际工作特性&#xff08;即各种规格&#xff09;&#xff0c;经…

docker、k8s部署 mysql group replication 和 ProxySQL 读写分离

MySQL Group Replication&#xff08;简称MGR&#xff09;是MySQL官方推出的一个高可用与高扩展的解决方案。MySQL组复制它提供了高可用、高扩展、高可靠的MySQL集群服务&#xff0c;这里部署的 mysql 版本 5.7.33&#xff0c;架构是一读一写。特别要注意一个关键点: 必须保证各…

Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…

【数据结构算法经典题目刨析(c语言)】反转链表(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 一、题目描述 二、思路分析 三、代码实现 一、题目描述&#xff1a; 二、思路分析 &#xff1a; 通过三个指针n1,n2,n3来实现链表的反转 1.首先初始化 n1为…

指针函数和函数指针

文章目录 &#x1f34a;自我介绍&#x1f34a;指针函数&#x1f34a;指针函数回调函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要…

谷粒商城实战笔记-128-商城业务-商品上架-sku在es中存储模型分析-关键

文章目录 一&#xff0c;Elasticsearch在谷粒商城中的应用1&#xff0c;商城的商品检索2&#xff0c;日志检索 二&#xff0c;谷粒商城ES的商品索引mapping如何设计1&#xff0c;商品索引product的mapping冗余 SPU 信息的原因第一种方案的优缺点&#xff1a;优点&#xff1a;缺…

苍穹外面day13(day10)---订单状态定时处理、来单提醒和客户催单

Spring Task 同学们可以看我这篇文章 Spring Task初学-CSDN博客 订单状态定时处理 新建OrderTask /*** 定时任务类&#xff0c;定时处理订单状态*/ Component Slf4j public class OrderTask {Autowiredprivate OrderMapper orderMapper;/*** 处理超时订单的方法*/Scheduled(c…

SQL数据库备份

转载&#xff1a;数据库备份与还原 1. 以下过程为记录客户单位备份过程。 一般有E盘选择E盘备份&#xff0c;否则选择D盘备份。选中备份文件需要重命名&#xff0c;以防原文件被覆盖。切换选项&#xff0c;选中压缩备份。

网络安全入门教程(非常详细)从零基础入门到精通!

一、引言 在当今高度数字化的时代&#xff0c;网络如同一张无形的大网&#xff0c;将世界紧密连接在一起。然而&#xff0c;在这看似便捷与美好的背后&#xff0c;却隐藏着无数的风险与威胁。网络安全已成为捍卫个人隐私、企业机密乃至国家安全的关键防线。如果您怀揣着对网络世…

VSCode上安装C#环境教程

本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…

Java_微服务

首先介绍一下单体架构与微服务架构&#xff1a; 单体架构&#xff1a; 微服务&#xff1a; SpringCloud&#xff1a; 版本&#xff1a; 标黑部分为目前企业使用最多的版本&#xff0c;因为它支持jdk8、jdk11&#xff0c;下面使用SpringCloud也会使用这个版本。 服务拆分&…

【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾

系列篇章&#x1f4a5; No.文章1【GLM-4开发实战】Function Call进阶实战&#xff1a;外部函数调用回顾2【GLM-4开发实战】Function Call进阶实战&#xff1a;常见挑战之意图识别处理3【GLM-4开发实战】Function Call进阶实战&#xff1a;常见挑战之海量函数处理4【GLM-4开发实…

黑马头条vue2.0项目实战(五)——首页—频道编辑

目录 1. 使用页面弹出层 1.1 页面弹出层简单使用 1.2 创建频道编辑组件 1.3 页面布局 2. 展示我的频道 3. 展示推荐频道列表 3.1 获取所有频道 3.2 处理展示推荐频道 4. 添加频道 5. 编辑频道 5.1 处理编辑状态 5.2 切换频道 5.3 让激活频道高亮 5.4 删除频道 6.…

基于RK3588+AI支持能源在线监测系统应用的AIOT产品方案

支持能源在线监测系统应用的AIOT产品方案 近年来&#xff0c;智慧能源行业受益于国家政策扶持、市场需求拉动和先进技术支撑呈现出了蓬勃发展态势。助推智慧能源发展&#xff0c;打造了支持能源在线监测系统应用的AIOT产品方案。 能源在线监测系统的市场潜力 随着社会经济的飞…

Python | Leetcode Python题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution:def bulbSwitch(self, n: int) -> int:return int(sqrt(n 0.5))