当前位置: 首页 > news >正文

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

一、数据总览

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

 二、代码逐行实现

清空代码和变量的指令

clear;clc;

层次分析法

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

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

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

%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:nquan(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.1fprintf('没有通过一致性检验\n');
elsefprintf('通过一致性检验\n');
end

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

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

 Topsis层次分析法

待评价的数据

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

三、代码整体实现

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

%% 层次分析法
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:nquan(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.1fprintf('没有通过一致性检验\n');
elsefprintf('通过一致性检验\n');
end
%%
%显示出所有评分对象的评分值score=P*Q;for i=1:length(score)name=['object_score',num2str(i)];eval([name,'=score(i)'])end%%  TOPSISclc;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))));
enddata1=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

http://www.lryc.cn/news/97243.html

相关文章:

  • PHP之Smarty使用以及框架display和assign原理
  • 《TCP IP网络编程》第十一章
  • Folx Pro 5 最好用的Mac磁力链接BT种子下载工具
  • Redis 数据库的高可用
  • elementPlus dialog组件设置可拖动,当内容高度大于视口高度拖动显示异常的解决办法
  • 亲测解决Git inflate: data stream error (incorrect data check)
  • Ansible 自动化运维工具
  • node.js 爬虫图片下载
  • VAE-根据李宏毅视频总结的最通俗理解
  • 【LangChain】检索器之上下文压缩
  • uniapp 语音文本播报功能
  • 腾讯云高IO型云服务器CPU型号处理器主频性能
  • 【数据结构】实验八:树
  • kafka消费者api和分区分配和offset消费
  • 【驱动开发day4作业】
  • Ubuntu 20.04 Ubuntu18.04安装录屏软件Kazam
  • ADC 的初识
  • MMdetection框架速成系列 第07部分:数据增强的N种方法
  • 基于Kitti数据集的智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv5模型)
  • 4.4. 深拷贝 vs 浅拷贝
  • 网络安全(黑客)自学建议笔记
  • Linux CentOS快速安装VNC并开启服务
  • redis到底几个线程?
  • mysql修改UUID
  • NoSQL之redis配置与优化
  • Python单例模式介绍、使用
  • 1334179-85-9,BTTAA,是各种化学生物学实验中生物偶联所需
  • Linux系统中的SQL语句
  • 力扣27 26 283 844 977 移除数组
  • 【沐风老师】3DMAX自动材质插件使用方法教程