注意:代码文件仅供参考,一定不要直接用于自己的数模论文中
国赛对于论文的查重要求非常严格,代码雷同也算作抄袭
如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231   //清风数学建模

一、基础知识

Topsis模型解决的是一些客观指标,同时数据不一定是极大型(如成绩,即数值越大越好)

可能会有极小型(如被处罚次数,越少越好)、中间型(达到一个数值最好,比如化学要求某种液体的ph=7)和区间型(介于两个数字之间,比如人的睡眠介于7-8小时)

先把这些数据都处理成极大型,这个过程是指标正向化。

0.把数据复制到工作区

工作区右键建立一个变量X,把excel的数据(只要数)粘贴到里面,把其另存为到和代码同一个目录下,下次直接导入打开即可

比如取名为shuju.mat 导入 shuju.mat 即load shuju.mat

注:没法导入可能是matlab上面的路径不对,把路径改成有你保存的文件目录即可

>> cd 'D:\AAA桌面\清风数学建模课件\视频课件和代码\topsis加入了权重的代码'

1.正向化处理

[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标'])
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0:  ']);if Judge == 1Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,4]disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]:  '); %[2,1,3]% 注意,Position和Type是两个同维度的行向量for i = 1 : size(Position,2)  %这里需要对这些列分别处理,因此我们需要知道一共要处理的次数,即循环的次数X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));% Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数% 第一个参数是要正向化处理的那一列向量 X(:,Position(i))   回顾上一讲的知识,X(:,n)表示取第n列的全部元素% 第二个参数是对应的这一列的指标类型(1:极小型, 2:中间型, 3:区间型)% 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列% 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量enddisp('正向化后的矩阵 X =  ')disp(X)
end

Positivization是自己定义的函数,在同一个目录下新建脚本(Positivization.m)编写函数,写了不用运行它,让它安静地躺着就行

function [posit_x] = Positivization(x,type,i)
% 输入变量有三个:
% x:需要正向化处理的指标对应的原始列向量
% type: 指标的类型(1:极小型, 2:中间型, 3:区间型)
% i: 正在处理的是原始矩阵中的哪一列
% 输出变量posit_x表示:正向化后的列向量if type == 1  %极小型disp(['第' num2str(i) '列是极小型,正在正向化'] )posit_x = Min2Max(x);  %调用Min2Max函数来正向化disp(['第' num2str(i) '列极小型正向化处理完成'] )disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')elseif type == 2  %中间型disp(['第' num2str(i) '列是中间型'] )best = input('请输入最佳的那一个值: ');posit_x = Mid2Max(x,best);disp(['第' num2str(i) '列中间型正向化处理完成'] )disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')elseif type == 3  %区间型disp(['第' num2str(i) '列是区间型'] )a = input('请输入区间的下界: ');b = input('请输入区间的上界: '); posit_x = Inter2Max(x,a,b);disp(['第' num2str(i) '列区间型正向化处理完成'] )disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')elsedisp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值')end
end

选定要正向化的列后,也要有极小转极大、中间转极大和区间转极大三种函数,我们同样在目录下写这三个脚本(.m)

function [posit_x] = Min2Max(x)posit_x = max(x) - x;%posit_x = 1 ./ x;    %如果x全部都大于0,也可以这样正向化
end
function [posit_x] = Mid2Max(x,best)M = max(abs(x-best));posit_x = 1 - abs(x-best) / M;
end
function [posit_x] = Inter2Max(x,a,b)r_x = size(x,1);  % row of x M = max([a-min(x),max(x)-b]);posit_x = zeros(r_x,1);   %zeros函数用法: zeros(3)  zeros(3,1)  ones(3)% 初始化posit_x全为0  初始化的目的是节省处理时间for i = 1: r_xif x(i) < aposit_x(i) = 1-(a-x(i))/M;elseif x(i) > bposit_x(i) = 1-(x(i)-b)/M;elseposit_x(i) = 1;endend
end

2.是否需要算加权

比如四列数据,可能都一样重要,不需要加权,但大多数需要进行加权处理,这里乘以一个设置好权重的一行矩阵即可。比如对四列数据,设B=[0.2,0.3,0.1,0.4] 。X1=X .* B(点乘)

%% 让用户判断是否需要增加权重
disp("请输入是否需要增加权重向量,需要输入1,不需要输入0")
Judge = input('请输入是否需要增加权重: ');
if Judge == 1disp(['如果你有3个指标,你就需要输入3个权重,例如它们分别为0.25,0.25,0.5, 则你需要输入[0.25,0.25,0.5]']);weigh = input(['你需要输入' num2str(m) '个权数。' '请以行向量的形式输入这' num2str(m) '个权重: ']);OK = 0;  % 用来判断用户的输入格式是否正确while OK == 0 if abs(sum(weigh) - 1)<0.000001 && size(weigh,1) == 1 && size(weigh,2) == m   % 这里要注意浮点数的运算是不精准的。OK =1;elseweigh = input('你输入的有误,请重新输入权重行向量: ');endend
elseweigh = ones(1,m) ./ m ; %如果不需要加权重就默认权重都相同,即都为1/m
end

3.对正向化后的矩阵进行标准化

处理后由于不同类比数据之间相差比较大,如评价一个学生,平均成绩是93分,其获奖学金次数是2,要把它们进行统一化处理,将原始数据按照一定的比例进行转换,使之落入到一个小的特定区间内,例如0~1或-1~1的区间内。

%% 第三步:对正向化后的矩阵进行标准化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 Z = ')
disp(Z)

4.计算出与最大值的距离和最小值的距离,并算出得分

D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;   % D+ 与最大值的距离向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;   % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N);    % 未归一化的得分
disp('最后的得分为:')
stand_S = S / sum(S)
[sorted_S,index] = sort(stand_S ,'descend')

二、例题演示

有二十条河流,四种指标,让我们通过数学建模选择综合情况最好的一条河流。

创建数据+加载

四个数据中,(例题认定)含氧量越高越好,ph=7最好,细菌总数越少越好,植物性营养数量在10-20最好。所以需要进行正向化处理。

这里划分一下权重,为[0.2,0.2,0.5,0.1]

权重为weigh,最后会用,这里先不用乘。

把X标准化后为Z

最后得到每条河的得分,和排序后(降序后)的分数及其索引位置。

这个就是计算后综合情况最好的河流排名。

数学建模-Topsis模型(Matlab)相关推荐

  1. 数学建模——TOPSIS综合评价模型Python代码

    数学建模--TOPSIS综合评价模型Python代码 正常代码 import numpy as np # 导入numpy包并将其命名为np ##定义正向化的函数 def positivization( ...

  2. 【数学建模】基于matlab船舶三自由度MMG模型【含Matlab源码 1925期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab船舶三自由度MMG模型[含Matlab源码 1925期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...

  3. 【数学建模】基于matlab三维海浪模型仿真【含Matlab源码 1159期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab三维海浪模型仿真[含Matlab源码 1159期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付 ...

  4. 数学建模专栏 | 开篇:如何备战数学建模竞赛之 MATLAB 编程

    作 者 简 介 卓金武,MathWorks中国高级工程师,教育业务经理,在数据分析.数据挖掘.机器学习.数学建模.量化投资和优化等科学计算方面有多年工作经验,现主要负责MATLAB校园版业务.曾2次获 ...

  5. 数学建模常见模型总结

    数学建模常见模型总结 一.插值 当已有数据量不够,需要补充,且认定已有数据可信时,通常利用函数插值方法. 常用插值方法 拉格朗日插值 分段线性插值 Hermite 三次样条插值 克里金法 matlab ...

  6. 数学建模——支持向量机模型详解Python代码

    数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...

  7. 数学建模——线性规划模型详解Python代码

    数学建模--线性规划模型详解Python代码 标准形式为: min z=2X1+3X2+x s.t x1+4x2+2x3>=8 3x1+2x2>=6 x1,x2,x3>=0 上述线性 ...

  8. 数学建模传染病模型_数学建模| 时间序列模型

    1 数学建模 时间序列模型 1.与实践有关系的一组数据,叫做时间序列: 2.得到时间序列的数据后,要构建模型,其中平稳时间序列的模型,是本节课重点介绍的: 3.y=at+季节性+周期性 一.     ...

  9. 【数学建模】基于matlab武汉地铁2号线路线地图动态模拟【含Matlab源码 1092期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab武汉地铁2号线路线地图动态模拟[含Matlab源码 1092期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

最新文章

  1. 20种看asp源码的方法及工具
  2. 步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)
  3. 初学__Python——Python 自定义函数
  4. 数据查找matlab,MATLAB:使用矢量化查找已排序数据的统计信息
  5. ​坚持写代码,这是晋级大师的唯一方法。
  6. python input 拖入路径 去除转义 空格_python学习笔记(基础-2)(转载)
  7. Spring3.1+Quertz1.8实现多个计划任务
  8. oracle使用关键字做表字段名_ArcGIS SQL使用
  9. python二维数据读取对齐_python代码要严格对齐
  10. redis与memcached区别
  11. 绕过图片打印成PDF时出现锯齿的问题
  12. Scratch案例——弹球游戏
  13. 在App Store提交应用时,提示“app名称已被使用”
  14. 项目配置多Redis数据源(Redis分片)
  15. LibPcap丢包怎么办
  16. 47、backtrader的一些基本概念---技术指标(indicator)的使用教程
  17. 住房教育当从娃娃抓起
  18. node-red安装
  19. 微信开发(3):微信公众号发现金红包功能开发,利用第三方SDK实现(Java)
  20. 钟汉良日记:写作的基础是读书

热门文章

  1. mybatis:selectKey的使用
  2. javase个人小结
  3. 无法访问maven官网
  4. python getattr函数_Python getattr()方法
  5. 微信小程序如何修改项目首页
  6. 亚洲游戏展Freeze化身女神代言《神泣》
  7. 电路-并联谐振电路分析
  8. CentOS 7.5 的详细安装教程及初始配置
  9. 刷题记录:牛客NC21841牛牛玩平板
  10. 选择排序C语言实现(源代码)