【数学建模】优劣解距离法(TOPSIS)+Matlab代码实现
学习内容:
1、 了解优劣解距法
2、 matlab代码实现TOPSIS
学习时间:
2020.12.07
学习内容
1.这次先亮代码!!!!
下面是主运行文件
%*******************************************************************************************
clear;clc;
%第一步:读取存储好的变量,里面存放的是数据矩阵
load X.mat;
%第二步:判断是否需要正向化
[r,c] = size(X); %获取数据矩阵X的行数r和列数c
disp("数据矩阵中共有 "+c+" 个评价指标, "+r+" 个评价对象");
judge = input("这"+c+"个评价指标是否需要经过正向化处理,需要请输入1,不需要请输入0:");
disp("--------------------------------------------------------------------------------------");
if judge == 1disp("请输入需要正向化处理的指标所在列,例如第2,3,6列需要处理,那么你需要输入[2,3,6]");position = input("请输入:");disp("--------------------------------------------------------------------------------------")disp("请输入你要处理的这些列的指标类型(1.极小型 2.中间型 3.区间型)");disp("例如,第1列要转换为中间型,第二列转换为区间型,第三列转换为极小型,那么你需要输入:[2,3,1]");type = input("请输入:");disp("--------------------------------------------------------------------------------------");for i=1:size(position,2)X(:,position(i)) = PositiveChange(X(:,position(i)),type(i),position(i));enddisp("正向化后的矩阵:");disp(X);
end
%第三步:对正向化后的矩阵进行标准化(原矩阵除以每一列元素平方之和的开方)
temp1 = X.*X; %先让每每一个元素平方
temp2 = sum(temp1); %再对每一列求和
temp3 = temp2.^0.5; %再把结果开方
temp4 = repmat(temp3,r,1); %把开方后的结果按行复制r行
Z = X./temp4; %原矩阵除以每一列元素平方之和的开方
disp("******标准化后的矩阵为:");
disp(Z);
%第四步:计算最大值和最小值之间的距离,并算出得分
Z_max = max(Z) %获得Z每一列中最大的元素
Z_min = min(Z) %获得Z每一列中最小的元素
D_max = sum((Z-repmat(Z_max,r,1)).^2,2).^0.5
D_min = sum((Z-repmat(Z_min,r,1)).^2,2).^0.5
disp("******未归一化的得分:")
S = D_min./(D_max+D_min) %未归一化的得分
disp("******归一化后的得分:");
standard_S = S./sum(S)
disp("******降序排列后的得分:");
%降序排列得分,不加参数descend就是升序排列,sort_stand_S代表排序后的矩阵,index代表对应元素的索引
[sort_stand_S,index] = sort(standard_S,'descend');
disp(sort_stand_S);
disp(index);
其中,PositiveChange是自定义的函数,在Matlab中使用自定义的函数,需要在主文件同目录下单独创建另一个文件,这里我们需要创建一个文件,命名为PositiveChange.m,该文件里的内容如下:
%-------------------------------------------------------------------------------------------------
%用于把指标正向化的函数
%X_positive是返回的值,X是传入的矩阵,tpye传入的指标类型,i代表X中的第几列
function [X_positive] = PositiveChange(X,type,i)if type==1 %极小型X_positive = max(X)-X;disp("第"+i+"列极小型正向化处理完毕:");disp(X_positive);disp("--------------------------------------------------------------------------------------");elseif type==2 %中间型best = input("请输入best值:");M = max(abs(X-best));X_positive = 1-abs(X-best)/M;disp("第"+i+"列中间型正向化处理完毕:");disp(X_positive);disp("--------------------------------------------------------------------------------------");elseif type==3 %区间型a = input("请输入区间的最小边界值:");b = input("请输入区间的最大边界值:");r = size(X,1); %rowM = max(a-min(X),max(X)-b);X_positive = zeros(r,1); %初始化X_positive全为0for j=1:rif X(j)<aX_positive(j) = 1-(a-X(j))/M;elseif X(j)>bX_positive(j) = 1-(X(j)-b)/M;elseX_positive(j) = 1;endenddisp("第"+i+"列区间型正向化处理完毕:");disp(X_positive);disp("--------------------------------------------------------------------------------------");elsedisp("没有这种类型的指标,请检查Type向量中是否有除了1,2,3之外的值");disp("--------------------------------------------------------------------------------------");end
end
%-------------------------------------------------------------------------------------------------
代码运行结果
数据矩阵中共有 4 个评价指标, 20 个评价对象
这4个评价指标是否需要经过正向化处理,需要请输入1,不需要请输入0:1
--------------------------------------------------------------------------------------
请输入需要正向化处理的指标所在列,例如第2,3,6列需要处理,那么你需要输入[2,3,6]
请输入:[2,3,4]
--------------------------------------------------------------------------------------
请输入你要处理的这些列的指标类型(1.极小型 2.中间型 3.区间型)
例如,第1列要转换为中间型,第二列转换为区间型,第三列转换为极小型,那么你需要输入:[2,3,1]
请输入:[2,1,3]
--------------------------------------------------------------------------------------
请输入best值:7
第2列中间型正向化处理完毕:0.71720.40690.52410.96550.65520.84140.85520.86900.57240.81380.63450.80690.144800.58620.40690.60000.02760.81380.4897--------------------------------------------------------------------------------------
第3列极小型正向化处理完毕:335884161627493745373173122915046--------------------------------------------------------------------------------------
请输入区间的最小边界值:10
请输入区间的最大边界值:20
第4列区间型正向化处理完毕:1.00000.69400.90580.44430.69140.60070.655101.00000.78480.69920.54191.00000.45461.00001.00000.18241.00000.40880.2731--------------------------------------------------------------------------------------
正向化后的矩阵:4.6900 0.7172 3.0000 1.00002.0300 0.4069 35.0000 0.69409.1100 0.5241 8.0000 0.90588.6100 0.9655 8.0000 0.44437.1300 0.6552 4.0000 0.69142.3900 0.8414 16.0000 0.60077.6900 0.8552 16.0000 0.65519.3000 0.8690 27.0000 05.4500 0.5724 49.0000 1.00006.1900 0.8138 37.0000 0.78487.9300 0.6345 45.0000 0.69924.4000 0.8069 37.0000 0.54197.4600 0.1448 31.0000 1.00002.0100 0 7.0000 0.45462.0400 0.5862 31.0000 1.00007.7300 0.4069 2.0000 1.00006.3500 0.6000 29.0000 0.18248.2900 0.0276 15.0000 1.00003.5400 0.8138 0 0.40887.4400 0.4897 46.0000 0.2731******标准化后的矩阵为:0.1622 0.2483 0.0245 0.30650.0702 0.1408 0.2863 0.21270.3150 0.1814 0.0655 0.27760.2977 0.3342 0.0655 0.13610.2466 0.2268 0.0327 0.21190.0826 0.2912 0.1309 0.18410.2659 0.2960 0.1309 0.20080.3216 0.3008 0.2209 00.1885 0.1981 0.4009 0.30650.2141 0.2817 0.3027 0.24050.2742 0.2196 0.3682 0.21430.1522 0.2793 0.3027 0.16610.2580 0.0501 0.2536 0.30650.0695 0 0.0573 0.13930.0705 0.2029 0.2536 0.30650.2673 0.1408 0.0164 0.30650.2196 0.2077 0.2373 0.05590.2867 0.0095 0.1227 0.30650.1224 0.2817 0 0.12530.2573 0.1695 0.3763 0.0837Z_max =0.3216 0.3342 0.4009 0.3065Z_min =0.0695 0 0 0D_max =0.41770.35000.36980.37700.40210.38320.29770.35700.19040.16830.15790.24710.32620.56680.31930.43380.34050.42890.48580.2855D_min =0.40590.38350.41780.43200.35880.36880.42850.45030.55500.49970.52120.45170.44300.15060.44660.39130.35370.39530.31280.4611******未归一化的得分:S =0.49290.52280.53050.53400.47160.49040.59010.55780.74460.74810.76740.64640.57590.21000.58310.47430.50940.47960.39170.6176******归一化后的得分:standard_S =0.04510.04780.04850.04880.04310.04480.05390.05100.06810.06840.07020.05910.05270.01920.05330.04340.04660.04380.03580.0565******降序排列后的得分:0.07020.06840.06810.05910.05650.05390.05330.05270.05100.04880.04850.04780.04660.04510.04480.04380.04340.04310.03580.01921110912207151384321716181651914%---------------------------------------------------------------------------
其中X的矩阵为表格构成
| 
2.了解优劣解距法(图片来源:https://www.bilibili.com/video/BV1DW411s7wi?p=4)









总结
剩余内容就不展示啦~如果还想看可以私信我,或者去https://www.bilibili.com/video/BV1DW411s7wi?p=4直接观看就好啦!
老规矩!喜欢的朋友点个赞点个关注叭~感谢支持!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
