目录
1.TOPSIS法介绍
2. 计算步骤
(1)数据标准化
(2)得到加权后的矩阵
(3)确定正理想解和负理想解
(4)计算各方案到正(负)理想解的距离
(5)计算综合评价值
3.实例研究
3.1 读取数据
3.2 数据标准化
3.3 得到信息熵
3.4 计算权重并计算权重数据
3.5 得到最大值和最小值距离
3.6 计算得分
总代码
1.TOPSIS法介绍
TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution),可翻译为逼近理想解排序法,国内常简称为优劣解距离法,TOPSIS 法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。
2. 计算步骤
(1)数据标准化
设决策矩阵为X=(xij)m×n,(在进行决策时,因决策属性类型的不同、属性量纲不同和属性值的大小不同,决策与评价的结果会受影响)进行属性值的规范化(方法不唯一,可视具体情况而定),设规范化决策矩阵(也就是标准化后的矩阵)X=(xij)m×n ,其中
(2)得到加权后的矩阵
计算信息熵:
权重为:
设标准化后的数据矩阵元素为rij ,由上可得指标正向化后数据矩阵元素为xij' :
(3)确定正理想解和负理想解
处理过后可以构成数据矩阵 R=(rij)m*n
-
定义每个指标即每列的最大值为正理想解
- 定义每个指标即每列的最大值为负理想解
(4)计算各方案到正(负)理想解的距离
- 定义第i个对象与最大值距离为正理想解的距离
- 定义第i个对象与最大值距离为负理想解的距离
(5)计算综合评价值
得分为:
明显可以看出0<=score<=1 ,当scorei越大时,d+越小,说明指标离最大值距离越小,越接近最大值
3.实例研究
数据来源:蓝奏云
3.1 读取数据
data=xlsread('D:\桌面\TOPSIS.xlsx')
3.2 数据标准化
%标准化 标准化处理后数据为data1
data1=data;
for j=1:size(data1,2)data1(:,j)= data(:,j)./sqrt(sum(data(:,j).^2));
end
3.3 得到信息熵
%得到信息熵
[m,n]=size(data1);
p=zeros(m,n);
for j=1:np(:,j)=data1(:,j)/sum(data1(:,j));
end
for j=1:nE(j)=-1/log(m)*sum(p(:,j).*log(p(:,j)));
end
3.4 计算权重并计算权重数据
%计算权重
w=(1-E)/sum(1-E);
%得到加权重后的数据
R=data1*w';
3.5 得到最大值和最小值距离
%得到最大值和最小值距离
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-向量
3.6 计算得分
%得到得分
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
返回:
总代码
clc;clear;
data=xlsread('D:\桌面\TOPSIS.xlsx');
%标准化 标准化处理后数据为data1
data1=data;
for j=1:size(data1,2)data1(:,j)= data(:,j)./sqrt(sum(data(:,j).^2));
end
%得到信息熵
[m,n]=size(data1);
p=zeros(m,n);
for j=1:np(:,j)=data1(:,j)/sum(data1(:,j));
end
for j=1:nE(j)=-1/log(m)*sum(p(:,j).*log(p(:,j)));
end
%计算权重
w=(1-E)/sum(1-E)
%得到加权重后的数据
% 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