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

相关推荐
yyy(十一月限定版)2 小时前
matlab矩阵的操作
算法·matlab·矩阵
做科研的周师兄3 小时前
【MATLAB 实战】栅格数据 K-Means 聚类(分块处理版)—— 解决大数据内存溢出、运行卡顿问题
人工智能·算法·机器学习·matlab·kmeans·聚类
打点计时器4 小时前
初见波动方程和贝塞尔函数
数学建模·信号处理
hoiii1875 小时前
基于LSB匹配的隐写术MATLAB实现程序
开发语言·matlab
民乐团扒谱机5 小时前
【微实验】基于MATLAB的一维条材下料优化问题求解
数学建模·matlab·线性规划·最优化模型·整数线性规划
步达硬件5 小时前
【Matlab】批量自定义图像处理
开发语言·matlab
崇山峻岭之间5 小时前
Matlab学习记录32
开发语言·学习·matlab
机器学习之心7 小时前
MATLAB灰狼优化算法(GWO)改进物理信息神经网络(PINN)光伏功率预测
神经网络·算法·matlab·物理信息神经网络
ghie909017 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
wuk99817 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab