当前位置: 首页 > news >正文

数学建模值TOPSIS法及代码

TOPSIS法

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

模型介绍

上篇文章谈到的层次分析法是有局限性的。比如评价的决策层不能太多,太多的话n会很大,判断矩阵和一致性矩阵差异可能会很大。其次,其无法利用原始的数据来做精确的评价。这个时候就体现出TOPSIS法的好处了。

它在原始数据上,充分反映各个评价方案之间的差距。

统一指标类型

将所有的指标转换为极大型称为指标正向化。(最常用)

file


标准化处理

为了消去不同量纲的影响,需要对已经正向化的矩阵进行标准化处理

file


如何计算得分

file


TOPSIS的流程

第一步:原始矩阵正向化

最常见的四种指标:

指标名称指标特点例子
极大型指标越大越好成绩、GDP增速
极小型指标越小越好费用、污染程度
中间型指标越接近某个值越好水的PH值
区间型指标落在某个区间最好体温

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

极小型-->极大型

公式: $$ max(xi) - x $$ 或者都是整数的话: $$ 1/x $$

中间型-->极大型

{xi}是一组中间型序列,且最佳的值为xbest

公式: $$ M = max{(|xi - xbest|)}, xi = 1 - |xi - xbest|/M $$

区间型-->极大型

{xi}是一组区间型指标序列,且最佳的区间为[a,b]

公式: $$ M = max({a - min{(xi)},max{(xi)} - b}) $$ file


正向化矩阵标准化

如图:

file

计算得分并归一化

file

代码部分

第一步:把数据复制到工作区

clear;clc
load data_water_quality.mat
X = data_water_quality
%进行初步处理,得到行与列
[n,m]  = size(X)

第二步,判断是否需要正向化

%%topsis.m
disp['共有' num2str(n) '个评价对,象' num2str(m) '个评价指标' ]%确定哪几列需要正向化
judge = input('请输入是否需要正向化,0代表不需要,1代表需要  ')if judge == 1%记录需要正向化的列Position = input('输入需要处理的列数,比如[1,2,3]')%记录对应要处理列的指标类型Type = input('请输入对应的处理类型(1,极小型) (2,中间型) (3,区间型)')%对每一列进行正向化处理for i = 1 : size(Position,2)X(:,Position(i)) = Posivization(X(:,Position(i)),Type(i),i)enddisp('正向化的矩阵X=')disp(X)
end%%正向化矩阵标准化
stand_X = X ./ repmat(sum(X .* X) .^ 0.5,n,1)
disp('标准矩阵stand_X = ')
disp(stand_X)%%标准矩阵归一化,计算得分
D_P = sum(((stand_X - repmat(max(stand_X),n,1)).^2),2).^0.5
D_N = sum(((stand_X - repmat(min(stand_X),n,1)).^2),2).^0.5
S = D_    n ./ (D_P + D_N)
%归一化
S = S / sum(S)
%%Posivization.m
function [output] = Posivization(x,type,i)if type == 1 %极小型disp(['第' num2str(i) '列式极小型,正在正向化'])output = Min2Max(x) %调用Min2Max函数来完成正向化disp(['第' num2str(i) '列式极小型正向化完成'])elseif type == 2 %中间型disp(['第' num2str(i) '列式中间型,正在正向化'])best = input('请输入最佳的那一个值')output = Mid2Max(x,best)disp(['第' num2str(i) '列式中间型正向化完成'])elseif type == 3 %区间型disp(['第' num2str(i) '列式区间型,正在正向化'])a = input('请输入区间的下界')b = input('请输入区间的上界')output = Inter2Max(x,a,b)disp(['第' num2str(i) '列式区间型正向化完成'])elsedisp('输入的类型错误,请检查')end
end
%%Min2Max.m
function [output] = Min2Max(x)output = max(x) - x
end
%%MidMax.m
function [output] = Mid2Max(x,best)output = 1 - abs(x - best)/max(abs(x-best))
end
%%Inter2Max.m
function [output] = Inter2Max(x,a,b)M = max(a - min(x),max(x) - b)output = zeros(size(x,1),1)for i = 1 : size(x,1)if x(i) < aoutput(i) = 1 - (a - x(i))/Melseif x(i) > boutput(i) = 1 - (x(i) - b)/Melseoutput(i) = 1;endendend

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

  • Linux(Ubuntu)安装JDK环境
  • Flink和Kafka连接时的精确一次保证
  • 文字的力量
  • C++项目案例圆和点的关系 (涉及知识点:头文件定义类,cpp文件实现类,类和作用域,linux编译运行c++项目)
  • html实现图片裁剪处理(附源码)
  • 通过bat命令启动jar后缀软件
  • C++继承(公有继承,保护继承,私有继承)
  • 企业APP软件定制开发的关键步骤|网站小程序搭建
  • asp.net在线考试系统+sqlserver数据库
  • Ubuntu22.04 部署Mqtt服务器
  • 最长单调上升子序列问题
  • Centos(Linux)服务器安装Dotnet8 及 常见问题解决
  • 21. 深度学习 - 拓朴排序的原理和实现
  • 使用webhook发送企业微信消息
  • 【C++】类和对象(7)--友元, static成员
  • 深入了解以太坊
  • SegmentFault for Android 3.0 发布
  • 【RocksDB】TransactionDB源码分析
  • 2019年如何成为全栈工程师?
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Java应用性能调优
  • LeetCode18.四数之和 JavaScript
  • Mysql数据库的条件查询语句
  • PHP 7 修改了什么呢 -- 2
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开源地图数据可视化库——mapnik
  • 前端_面试
  • 一起参Ember.js讨论、问答社区。
  • ​flutter 代码混淆
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $().each和$.each的区别
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2)STM32单片机上位机
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (SpringBoot)第七章:SpringBoot日志文件
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (力扣)1314.矩阵区域和
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .NET Core WebAPI中封装Swagger配置
  • .net framework4与其client profile版本的区别
  • .Net Web窗口页属性
  • [2]十道算法题【Java实现】
  • [383] 赎金信 js
  • [android] 练习PopupWindow实现对话框
  • [android] 手机卫士黑名单功能(ListView优化)
  • [C++]指针与结构体
  • [DevEpxress]GridControl 显示Gif动画
  • [ffmpeg] av_opt_set 解析
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx
  • [leetcode] 3Sum