数模算法:优劣解距离法Topsis模型
程序员文章站
2022-05-22 14:12:45
...
概念:
TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为先将原始数据矩阵统一指标类型(一般正向化处理) 得到正向化的矩阵,再对正向化的矩阵进行标准化处理以消除各指 标量纲的影响,并找到有限方案中的最优方案和最劣方案,然后分 别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对 象与最优方案的相对接近程度,以此作为评价优劣的依据
算法步骤
确定指标类型
将原始矩阵正向化(将不同类型的指标转换为极大型)
中间型正向化
正向化矩阵标准化(消除不同量纲的影响)
计算得分,归一化
根据得分大小进行排序,给出评价结果
案例应用
确定指标类型:
含氧量:极大型
PH值:中间型
细菌总数:极小型
植物性营养物量:区间型
正向化处理后的矩阵:
对矩阵标准化处理
计算最后得分(未加入权值向量):
排序后结果
matlab代码
%正向化处理函数
function [new_X]=Normalization(x,type,i)
if type==1
disp('极小型正向化:')
new_X=Min2Max(x);
elseif type==2
disp('中间型正向化:')
bestx=input('输入最好的中间值:');
new_X=Mid2Max(x,bestx);
elseif type==3
disp('区间型正向化:')
a=input('输入区间下界:');
b=input('输入区间上界:');
new_X=Inter2Max(x,a,b);
else
disp('输入有误')
end
end
%极小型转为极大型
function [new_X]=Min2Max(x)
new_X=max(x)-x;
end
%中间型转换为极大型
function [new_X]=Mid2Max(x,bestx)
M=max(abs(x-bestx));
new_X=1-abs(x-bestx)/M;
end
%区间型转换成极大型
function [new_X]=Inter2Max(x,a,b)
rows=size(x,1);%x的行数
M=max([a-min(x),max(x)-b]);
new_X=zeros(rows,1);
for i=1:rows
if x(i)<a
new_X(i)=1-(a-x(i))/M;
elseif x(i)>b
new_X(i)=1-(x(i)-b)/M;
else
new_X(i)=1;
end
end
end
%加载数据(事先将数据导入data.mat文件)
load data.mat
%X是数据矩阵
[n,m]=size(X);
disp(['有' num2str(n) '个评价对象,' num2str(m) '个评价指标']);
judge=input('指标是否需要经过正向化处理,1是,2否:');
if judge==1
targetCol=input('输入需要正向化的指标所在列,例如[1,2,3]是1,2,3列:');
type=input('输入需要处理列的对应指标类型,例如[1,2,3],1极小型,2中间型,3区间型:');
for i=1:size(targetCol,2)
%正向化处理,参数1是要正向化处理的列向量,参数2是该列的指标类型,参数3是正在处理原始矩阵的哪一列
X(:,targetCol(i))=Normalization(X(:,targetCol(i)),type(i),targetCol(i));
end
disp('正向化后的矩阵X=')
disp(X)
end
judge2=input('是否需要加入权重,1是,2否:');
if judge2==1
%权重可以由层次分析法或熵权法获得,和为1
weight=input('输入对应指标的权重向量例如3个指标[0.2,0.4.0.4]:')
else
%默认权重相同,为1/m
weight=ones(1,m)./m;
end
%对正向化后的矩阵标准化
Z=X./repmat(sum(X.*X).^0.5,n,1);
disp('标准化矩阵为:')
disp(Z)
%第四步:计算与最大值的距离和与最小值的距离,并算出得分
%最大距离D1
D1=sum([(Z-repmat(max(Z),n,1)).^2].*repmat(weight,n,1),2).^0.5;
%最小距离D2
D2=sum([(Z-repmat(min(Z),n,1)).^2].*repmat(weight,n,1),2).^0.5;
S=D2./(D1+D2);%未归一化
disp('最后得分为:')
S_stand=S/sum(S)
%降序排序,得到结果和索引
[S_sorted,index]=sort(S_stand,'descend')
上一篇: 数学建模04-图论