数学建模评价类—Topsis法

news2024/9/30 9:33:29

目录

文章目录

前言

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

一、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==Judge
    position = 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));
    end
    disp('正向化处理后的矩阵 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==type
       disp(['第',num2str(k),'列是极小型,正在正向化'])
       Posit_D = Min2Max(D);%调用Min2Max函数来正向化
       disp(['第',num2str(k),'列极小项正向化处理完成'])
       disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')

   elseif 2==type
        disp(['第',num2str(k),'列是中间型,正在正向化'])
        best = input('请输入最优值:');
        Posit_D = Mid2Max(D,best);%调用Mid2Max函数来正向化
       disp(['第',num2str(k),'列中间型正向化处理完成'])
       disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')

   elseif 3==type
       disp(['第',num2str(k),'列是区间型,正在正向化'])
       a = input('请输入区间下界:');
       b = input('请输入区间上界:');
       Posit_D = Inter2Max(D,a,b);%调用Inter2Max函数来正向化
       disp(['第',num2str(k),'列区间型正向化处理完成'])
       disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')


   else
       disp('没有该种类型的指标请重新输入')
   end


end

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

  • 极大型:越大越好。如:成绩,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_D
        if D(j)<a
            Posit_D(j) = 1-(a-D(j))/M;
        elseif D(j)>a
            Posit_D(j) = 1-(D(j)-b)/M;
        else
            Posit_D(j) = 1;
        end
    end
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.coloradmin.cn/o/1980057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Can Large Language Models Provide Feedback to Students? A Case Study on ChatGPT

文章目录 题目摘要相关工作方法结果讨论意义 题目 大型语言模型能为学生提供反馈吗&#xff1f;ChatGPT 案例研究 论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/10260740 摘要 摘要——教育反馈已被广泛认为是提高学生学习能力的有效方法。然而&#x…

Python | Leetcode Python题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; class Solution:def coinChange(self, coins: List[int], amount: int) -> int:dp [float(inf)] * (amount 1)dp[0] 0for coin in coins:for x in range(coin, amount 1):dp[x] min(dp[x], dp[x - coin] 1)return dp[amount] if d…

Python的if语句及其运用

一、条件测试 每条if语句的核心都是一个值为True或False的表达式&#xff0c;这种表达式称为条件测试。如果测试的条件满足if语句则为True&#xff0c;接着执行if里的语句&#xff1b;如果测试的条件不满足if语句则为False&#xff0c;则不执行if里的语句。 1.1、检查是否相等…

C++ | Leetcode C++题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; class Solution { public:int coinChange(vector<int>& coins, int amount) {int Max amount 1;vector<int> dp(amount 1, Max);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < (int)coins.size();…

二叉树(真题)

1.用非递归遍历求二叉树结点个数【计学2020】 算法思想:用先序非递归遍历 当前指针不为空或栈不为空进行循环&#xff1b; 当前指针不为空访问当前结点&#xff0c;当前节点入栈&#xff0c;进入左子树 当前指针为空&#xff0c;栈顶元素出栈&#xff08;回溯&#xff09;&…

【kickstart+pxe批量安装linux系统】

目录 一、实验环境准备二、安装kickstart1、kickstart自动安装脚本的制作 三、安装web服务器&#xff0c;提供网络源四、安装dhcp五、安装syslinux&#xff0c;tftp-server六、虚拟机中新建新主机 一、实验环境准备 1、rhel7主机 2、开启主机图形 init 5 开图形 3、配置网络可…

ESP8266 烧录,待坑

ets Jan 8 2013,rst cause:1, boot mode:(7,0)waiting for host 空芯片&#xff0c;未加SPI FLASH 显示 下载模式(IO15 10k下拉 &#xff0c; IO0下拉 &#xff08;直接GND),IO2上拉&#xff08;文档上说是有内部上拉的&#xff0c;先上拉&#xff09;&#xff09; &#xff…

jdbc(mysql)

1.概述 jdbc&#xff1a;java database connection&#xff08;java与数据库连接&#xff09; java可以连接不同数据库&#xff0c;不同数据库连接细节不同&#xff0c;具体细节都由数据库自己实现 由java设计出一系列连接数据库的接口规范&#xff0c;然后由不同的数据库开发…

C语言程序设计26

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.3 上机运行下面的程序&#xff0c;分析输出结果 代码 //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题2.3 上机运行下面的程序&#xff0c;分析输出结果#include <stdio.h> int …

【MYSQL】MYSQL逻辑架构

mysql逻辑架构分为3层 mysql逻辑架构分为3层 1). 连接层&#xff1a;主要完成一些类似连接处理&#xff0c;授权认证及相关的安全方案。 2). 服务层&#xff1a;在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的&#xff0c;包括权限判断&#xff0c;SQL接口&…

GD 32 IIC通信协议

前言&#xff1a; ... 通信方式 通信方式分为串行通信和并行通信。常见的串口就是串行通信的方式 常用的串行通信接口 常用的串行通信方式有USART,IIC,USB,CAN总线 同步与异步 同步通信&#xff1a;IIC是同步通信&#xff0c;有两个线一个是时钟信号线&#xff0c;一个数数据…

rocketMq-5.2.0双主双从搭建

最近在研究rocketmq5.x的运行机制&#xff0c;研究到高可用章节&#xff0c;看到rocketMq采用了主从机制实现高可用&#xff0c;将broker分成了master和slave。为了更好的理解主从源码&#xff0c;我觉着需要先搭建一个主从的集群&#xff0c;先了解主从集群是怎么使用的。 这篇…

【practise】只出现一次的数字

现在给你一个数组&#xff0c;里面放了一些数字&#xff0c;里面都是两两成对&#xff0c;只有一个数字是单独的&#xff0c;要求找出其中只出现一次的数字。相必这道题是非常简单了&#xff0c;有很多解法比如说用暴力求解&#xff1f;比如说用位运算&#xff1f;甚至说用哈希…

使用Docker+ollama部署大模型

Docker的安装----在 Ubuntu 系统上安装 Docker 一&#xff1a;配置系统的 APT 软件包管理器 首先添加 Docker 的官方 GPG 密钥 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/ke…

使用 宝塔面板 部署 php网站

【语料库网站】宝塔面板 在线部署全过程 代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…

DA14695 printf没办法打印浮点数

是因为没有打开浮点数库&#xff0c;添加了这个库也会导致堆内存的增加

基于Kahn算法|动态线程池,支持扩展点并发执行|召回|过滤

背景 在《分布式领域扩展点设计稿》一文中&#xff0c;我们提到针对业务横向扩展点和纵向扩展点的编排能力。 那有这样的一种场景&#xff1a;针对于一次会话&#xff0c;同时会调很多外部服务&#xff0c;同时这些RPC服务会有多种直接或间接的关系&#xff0c;是否有更高效的…

【Spring】Bean详细解析

1.Spring Bean的生命周期 整体上可以简单分为四步&#xff1a;实例化 —> 属性赋值 —> 初始化 —> 销毁。初始化这一步涉及到的步骤比较多&#xff0c;包含 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始…

【Vue3】组件通信之$refs

【Vue3】组件通信之$refs 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

操作系统|day4.Linux、Linux内核、Linux负载、Linux文件存储

文章目录 LinuxLinux内核定义功能态 Linux负载定义 Linux文件存储链接分类区别使用场景 拷贝 Linux Linux内核 定义 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它负责管理系统的进程、内存、设备驱动程序、文件和网络系统&#xff0c;决定着系统的性能…