4 TOPSIS法(评价类):优劣解距离法
常用的综合评价方法,能充分利用原始数据的的信息,精准反映各方案的差距。分析数据内在特征建模。
4.1极小型极大型指标
4.1.1 正向化
4.1.1.1 极小型转化为极大型
4.1.1.2 中间型转化为极大型
4.1.1.3 区间型转化为极大型
4.1.2 标准化:将不同的指标转化成相同的标准
代码及含义示例:
% 把已经正向化的指标标准化
% 标准化矩阵中每一个元素=正向化矩阵中每一个元素/sqrt(所在列平方的和)
clc
a=input('A:')
a=a./(sum(a.*a).^(1/2))
% 标准化结束
最小值最大值指的是各个列的最小值和最大值,行是对象,列是指标
此处求距离类似于求平面上点的坐标,或者多维空间中。然后每个指标代表一个维度,进行计算距离。
最后进行归一化得分
计算代码:
% 假设已知两个指标
% 把已经正向化的指标标准化
% 标准化矩阵中每一个元素=正向化矩阵中每一个元素/sqrt(所在列平方的和)
clc
a=input('A:')
a=a./(sum(a.*a).^(1/2))
% 标准化结束
% 计算得分
max_zhibiao=max(a) % 返回的是指标中最大的矩阵
min_zhibiao=min(a) % 返回的是指标中最小的矩阵
%计算未归一化
[r,c] =size(a)
max_distance=zeros(r,c)
min_distance=zeros(r,c)
for i=1:r
for j=1:c
max_distance(i,j)=max_distance(i,j)+((a(i,j)-max_zhibiao(j)).^2)
min_distance(i,j)=min_distance(i,j)+((a(i,j)-min_zhibiao(j)).^2)
end
temx=sum(max_distance,2).^(1/2)
temy=sum(min_distance,2).^(1/2)
end
tar=temy./(temx+temy)
disp(tar)
%归一化
res=tar./sum(tar)
%归一化完成
例题
代码
clc
data=xlsread('C:\Users\admin\Desktop\数学建模\第2讲.TOPSIS法(优劣解距离法)\代码和例题数据\20条河流的水质情况数据.xlsx');
[r,c]=size(data);
disp(['共有' num2str(r) '个评价对象,' num2str(c) '个评价指标'])
judge=input('请输入是否需要正向化处理, 1需要0不需要');
c_zxh=input('请输入需要正向化指标所在的列'); % 需要正向化指标所在列
[,num]=size(c_zxh);
type=input('请输入指标类型:1:极小型 2:中间型 3:区间型'); % 正向化指标类型
[x,y]=size(type);
for i=1:y
% 正向化
if judge==1
%极小型正向化
if type(1,i)==1
maxValue=max(data(:,c_zxh(1,i)));%极小型数值列的最大值
data(:,c_zxh(1,i))=maxValue-data(:,c_zxh(1,i));
end
%极小型结束
%中间型正向化
if type(1,i)==2
best=input('请输入最优值');
M=max(abs(data-best))
M=max(M(:,c_zxh(1,i)))
data(:,c_zxh(1,i))=1 - (abs(data(:,c_zxh(1,i))-best)/M)
end
%中间型结束
%区间型正向化
if type(1,i)==3
[tar]=input('请输入目标区间');
tem_max= max(data(:,c_zxh(1,i))-tar(1,2))
tem_min= min(tar(1,1)-data(:,c_zxh(1,i)))
if tem_max>tem_min
M=tem_max
else
M=tem_min
end
for j=1:r
if data(j,c_zxh(1,i)) < tar(1,1)
data(j,c_zxh(1,i)) = 1-(tar(1,1)-data(j,c_zxh(1,i)))/M
elseif data(j,c_zxh(1,i)) > tar(1,2)
data(j,c_zxh(1,i)) = 1-(data(j,c_zxh(1,i))-tar(1,2))/M
elseif tar(1,1) < data(j,c_zxh(1,i)) < tar(1,2)
data(j,c_zxh(1,i)) = 1
end
end
end
%区间型结束
end
%正向化结束
end
disp(data)
% 接下来进行标准化
data=data./(sum(data.^2).^(1/2))
% 标准化结束
%开始计算分数
max_stand=max(data)
min_stand=min(data)
max_distance=data-max_stand
min_distance=data-min_stand
Dbig=sum(max_distance.^2,2).^(1/2)
Dmin=sum(min_distance.^2,2).^(1/2)
res=Dmin./(Dbig+Dmin)
disp(res)
% 分数计算结束
%归一化
res=res./sum(res)
[sort_s,index]=sort(res ,'descend') % 从大到小排序
disp(index)
disp(res)
%归一化结束