数学建模学习(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

相关推荐
yugi98783810 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
IT猿手19 小时前
基于强化学习的多算子差分进化路径规划算法QSMODE的机器人路径规划问题研究,提供MATLAB代码
算法·matlab·机器人
fie88891 天前
基于MATLAB的转子动力学建模与仿真实现(含碰摩、不平衡激励)
开发语言·算法·matlab
机器学习之心1 天前
基于GRU门控循环单元的轴承剩余寿命预测MATLAB实现
深度学习·matlab·gru·轴承剩余寿命预测
简简单单做算法1 天前
基于FFT粗估计和LS最小二乘法精估计的正弦信号参数估计和检测matlab仿真
matlab·最小二乘法·参数估计·fft粗估计·ls最小二乘法
kaikaile19951 天前
基于MATLAB的滑动轴承弹流润滑仿真程序实现
开发语言·matlab
Not Dr.Wang4221 天前
FIR数字滤波器设计的两种实现
matlab
3GPP仿真实验室1 天前
【MATLAB源码】CORDIC-QR :基于Cordic硬件级矩阵QR分解
开发语言·matlab·矩阵
三克的油2 天前
数学建模-day5
数学建模
lichensun2 天前
2026美赛A题智能手机电池耗电建模—思路全解析(含具体模型和代码)
数学建模·智能手机