数学建模学习(4):TOPSIS 综合评价模型及编程实战

一、数据总览

需求:我们需要对各个银行进行评价,A-G为银行的各个指标,下面是银行的数据:

二、代码逐行实现

清空代码和变量的指令

Matlab 复制代码
clear;clc;

层次分析法

每一行代表一个对象的指标评分

Matlab 复制代码
p = [8,7,6,8;7,8,8,7];%每一行代表一个对象的指标评分

A为自己构造的输入判别矩阵

Matlab 复制代码
%A为自己构造的输入判别矩阵
A=[1,3,1,1/3;
    1/3,1,1/2,1/5;
    1,2,1,1/3;
    3,5,3,1];

求特征值特征向量,找到最大特征值对应的特征向量

Matlab 复制代码
%%
[n,m]=size(A);
%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(A);    %求特征值和特征向量  D记录特征值  V代表特征向量
%%

找到最大的特征值

Matlab 复制代码
tzz=max(max(D));     %找到最大的特征值

找到最大的特征值位置

Matlab 复制代码
c1=find(max(D)==tzz);%找到最大的特征值位置

最大特征值对应的特征向量

Matlab 复制代码
tzx=V(:,c1);%最大特征值对应的特征向量

计算权重

Matlab 复制代码
quan1 = tzx/sum(tzx);
%%
%赋权重
quan=zeros(n,1);
for i=1:n
    quan(i,1)=tzx(i,1)/sum(tzx);
end

一致性检验

Matlab 复制代码
Q=quan;
%一致性检验
CI=(tzz-n)/(n-1);
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];
%判断是否通过一致性检验
CR=CI/RI(1,n);
if CR>=0.1
   fprintf('没有通过一致性检验\n');
else
  fprintf('通过一致性检验\n');
end

显示出所有评分对象的评分值

Matlab 复制代码
%显示出所有评分对象的评分值
 score=P*Q;
 for i=1:length(score)
     name=['object_score',num2str(i)];
    eval([name,'=score(i)'])
 end
  

Topsis层次分析法

待评价的数据

Matlab 复制代码
data=[220	6	30	10	10	5
190	8	25	9	8	3
180	8	28	7	7	4
170	7	23	8	7	2];

负向指标准化处理

Matlab 复制代码
%负向指标准化处理
 index=3;
 for i=1:length(index)
     data1(:,index(i))=(max(data(:,index(i)))-data(:,index(i)))/(max(data(:,index(i)))-min(data(:,index(i))));
end

正向指标的标准化处理

Matlab 复制代码
%%
%%正向指标准化处理
index_all=1:size(data1,2); 
index_all(index)=[];    % 除负向指标外其余所有指标
index=index_all;
%%
for i=1:length(index)
     data1(:,index(i))=(data(:,index(i))-min(data(:,index(i))))/(max(data(:,index(i)))-min(data(:,index(i))));
end

标准化处理

Matlab 复制代码
%%标准化处理
 data1=zscore(data);
% for j=1:size(data1,2)
%     data1(:,j)= data(:,j)./sqrt(sum(data(:,j).^2));
% end

得到加权后的数据

Matlab 复制代码
%得到加权重后的数据
w=[0.3724, 0.1003,0.1991, 0.1991,0.0998,0.0485]; %使用求权重的方法求得
R=data1.*w;

得到最大值和最小值距离

Matlab 复制代码
%得到最大值和最小值距离
r_max=max(R);  %每个指标的最大值
r_min=min(R);  %每个指标的最小值
d_z = sqrt(sum([(R -repmat(r_max,size(R,1),1)).^2 ],2)) ;  %d+向量
d_f = sqrt(sum([(R -repmat(r_min,size(R,1),1)).^2 ],2)); %d-向量  
%sum(data,2)对行求和 ,sum(data)默认对列求和

得到得分

Matlab 复制代码
%得到得分
s=d_f./(d_z+d_f );
Score=100*s/max(s);
for i=1:length(Score)
    fprintf('第%d个投标者百分制评分为:%d\n',i,Score(i));   
end

三、代码整体实现

下面是matlab实现层次分析法和Topsis综合评价法的代码:

Matlab 复制代码
%% 层次分析法
clear;clc;
P=[8,7,6,8;7,8,8,7];%每一行代表一个对象的指标评分
%%
%A为自己构造的输入判别矩阵
A=[1,3,1,1/3;
    1/3,1,1/2,1/5;
    1,2,1,1/3;
    3,5,3,1];
%%
[n,m]=size(A);
%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(A);    %求特征值和特征向量  D记录特征值  V代表特征向量
%%
tzz=max(max(D));     %找到最大的特征值
%%
c1=find(max(D)==tzz);%找到最大的特征值位置
%%
tzx=V(:,c1);%最大特征值对应的特征向量
%%
quan1 = tzx/sum(tzx);
%%
%赋权重
quan=zeros(n,1);
for i=1:n
    quan(i,1)=tzx(i,1)/sum(tzx);
end
%%
%%%
Q=quan;
%一致性检验
CI=(tzz-n)/(n-1);
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];
%判断是否通过一致性检验
CR=CI/RI(1,n);
if CR>=0.1
   fprintf('没有通过一致性检验\n');
else
  fprintf('通过一致性检验\n');
end
%%
%显示出所有评分对象的评分值
 score=P*Q;
 for i=1:length(score)
     name=['object_score',num2str(i)];
    eval([name,'=score(i)'])
 end
  
 %%  TOPSIS
 clc;clear;
 %%
data=[220	6	30	10	10	5
190	8	25	9	8	3
180	8	28	7	7	4
170	7	23	8	7	2];
%%
 index=3;
 for i=1:length(index)
     data1(:,index(i))=(max(data(:,index(i)))-data(:,index(i)))/(max(data(:,index(i)))-min(data(:,index(i))));
end
%%
%%正向指标准化处理
index_all=1:size(data1,2); 
index_all(index)=[];    % 除负向指标外其余所有指标
index=index_all;
for i=1:length(index)
     data1(:,index(i))=(data(:,index(i))-min(data(:,index(i))))/(max(data(:,index(i)))-min(data(:,index(i))));
end
 data1=zscore(data);
% for j=1:size(data1,2)
%     data1(:,j)= data(:,j)./sqrt(sum(data(:,j).^2));
% end

%得到加权重后的数据
w=[0.3724, 0.1003,0.1991, 0.1991,0.0998,0.0485]; %使用求权重的方法求得
R=data1.*w;

%得到最大值和最小值距离
r_max=max(R);  %每个指标的最大值
r_min=min(R);  %每个指标的最小值
d_z = sqrt(sum([(R -repmat(r_max,size(R,1),1)).^2 ],2)) ;  %d+向量
d_f = sqrt(sum([(R -repmat(r_min,size(R,1),1)).^2 ],2)); %d-向量  
%sum(data,2)对行求和 ,sum(data)默认对列求和
%得到得分
s=d_f./(d_z+d_f );
Score=100*s/max(s);
for i=1:length(Score)
    fprintf('第%d个投标者百分制评分为:%d\n',i,Score(i));   
end

对应的原理公式,请跳转到下面的链接:

http://t.csdn.cn/HXaGB

相关推荐
科研工作站14 小时前
【创新算法】改进深度优先搜索算法配合二进制粒子群的配电网故障恢复重构研究
matlab·配电网·故障恢复·改进粒子群·深度优先搜索·33节点
zzc92114 小时前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
软件算法开发14 小时前
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
matlab·wsn·距离变化·能量开销·动态调整·低功耗拓扑控制开销算法
Shan120516 小时前
3Ds Max 2026安装包+教程网盘下载与安装教程指南
数学建模·3d
机器学习之心21 小时前
机器学习用于算法交易(Matlab实现)
算法·机器学习·matlab
HCl+NaOH=NaCl+H_2O2 天前
数学建模期末速成 聚类分析与判别分析
数学建模
人大博士的交易之路2 天前
今日行情明日机会——20250606
大数据·数学建模·数据挖掘·数据分析·涨停回马枪
曹勖之2 天前
UE 5 和simulink联合仿真,如果先在UE5这一端结束Play,过一段时间以后**Unreal Engine 5** 中会出现显存不足错误
matlab·ue5·机器人
曹勖之2 天前
simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出?
matlab
数模竞赛Paid answer3 天前
数学建模-嘉陵江铊污染事件解题全过程文档及程序
数学建模·数据分析