目录
一、理想解法
1-基本概念
2-基本方法和原理
3-理想解法的计算步骤
4-理想解法经典案例及MATLAB实现
理想解法,也叫做优劣解距离法,简称TOPSIS,是一种有效的多指标评价方法,通过构造评价问题的最优解和最劣解,然后计算每个方案到靠近最优解和远离最劣解的程度,来对方案进行排序,从而选出最优方案。
引入正理想解和负理想解,防止方案与正理想解距离相等,此时可以比较与负理想解的距离,TOPSIS法所用的距离是欧式距离。
首先需要进行正向化,都转换成效益性指标,然后才进行规范化消除量纲的影响。
计算各方案的排序指标,并排序,距离正理想解的距离越小,越接近最大值,越好。
在这里对上述理想解法的步骤进行总结:
1、数据预处理,正向化,都转换成极大型指标,然后归一化消除量纲的影响。
2、对各项指标加权(可省略)
3、确定正负理想解;
4、计算各个方案到正负理想解的距离;
5、计算各方案的综合评价指标;
6、根据评价指标由大到小排列方案的优劣次序;
对上述方案进行评估,根据评价好坏进行排名:
人均专著和科研经费是极大型,生师比是区间型,逾期毕业率是极小型;区间型5-6为最好。
主程序:
%主程序
clear; clc
X = [0.1, 5, 5000, 4.7;
0.2, 6, 6000, 5.6;
0.4, 7, 7000, 6.7;
0.9, 10, 10000, 2.3;
1.2, 2, 400, 1.8] ;
%正向化处理,全部转换成极大型
[n,m] = size(X) ;
disp(['一共有' num2str(n) '个评价对象,' num2str(m) '个评价指标']) ;
position = [2,4] ; %需要正向化处理的指标所在的列
type = [3,1] ; %区间型和极小型
for i = 1 : size(position, 2)
X(:,position(i)) = Positivization(X(:,position(i)),type(i),position(i));
end
disp('正向化后的矩阵 = ') ;
disp(X) ;
%对正向化处理后的矩阵进行标准化处理
z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 = ') ;
disp(z) ;
disp('需要给指标加相应的权重?需要输入1,不需要输入2') ;
judge2 = input('请输入1或者2:') ;
%计算与最大值和最小值的距离,计算得分,并降序排序
if judge2 == 2
D1 = sum((z - repmat(max(z),n,1)) .^ 2 ,2) .^ 0.5;
D2 = sum((z - repmat(min(z),n,1)) .^ 2,2) .^ 0.5;
end
if judge2 == 1
w = input('请按照向量形式输入各个指标权重:') ;
D1 = sum(repmat(w,n,1) .* (z - repmat(max(z),n,1)) .^ 2 ,2) .^ 0.5;
D2 = sum(repmat(w,n,1) .* (z - repmat(min(z),n,1)) .^ 2,2) .^ 0.5;
end
s = D2 ./ (D1 + D2) ;
disp('最后的得分:') ;
ss = s / sum(s) ;
disp(ss) ;
[s1, I] = sort(s, 1, 'descend') ;
disp('最后的排名由高到底依次是:') ;
disp(I) ;
极小型转换成极大型:
function [position_x] = min_max(x)
position_x = max(x) - x ;
end
区间型转换成极大型代码:
function [position_x] = inter_max(x, left, right)
row = size(x, 1) ;
M = max([left - min(x),max(x) - right]) ;
position_x = zeros(row, 1) ;
for i = 1 : row
if x(i) < left
position_x(i) = 1 - (left - x(i)) / M ;
else if x(i) > right
position_x(i) = 1 - (x(i) - right) / M ;
else
position_x(i) = 1 ;
end
end
end
end
区间型转换成极大型代码2:
function [position_x] = inter_max(x, left, right)
row = size(x, 1) ;
position_x = zeros(row, 1) ;
for i = 1 : row
if x(i) < left && x(i) >= 2
position_x(i) = 1 - (left - x(i)) / (left - 2) ;
else if x(i) >= left && x(i) <= right
position_x(i) = 1 ;
else if x(i) > right && x(i) <= 12
position_x(i) = 1 - (x(i) - right) / (12 - right) ;
else
position_x(i) = 0 ;
end
end
end
end
end