目录
一.总述
二.引子
三.TOPSIS的算法
四.问题解决
五.模型改进
TOPSIS法(Technique for Order Preference by Similarity to an Ideal Solution )亦称为理想解法,由C.L.Hwang和K.Yoon于1981年首次提出,是一种简单易行的多指标评价方法。
TOPSIS法通过构造评价问题的正理想解和负理想解,即各指标的最优解和最劣解,通过计算每个方案到理想解的相对贴近度(relative closeness),来对不同样本进行比较和排序。
假设咱们要对5个国家的经济发展水平进行排序,现在有4个指标来衡量国家的经济发展水平。其中,指标1和指标3为效益性指标(值越大,说明发展水平越好),指标2为区间型指标(值落在某个区间最好),指标4为成本型指标(值越小,说明发展水平越好),那么我们怎么根据下表的数据来对这5个国家的经济发展水平进行排序?
表1:5个国家的经济发展情况
图1:TOPSIS算法流程图
(一)规范化处理
1.正向化的方法
(1)极小型指标
(2)中间型指标
(3)区间型指标
(设本文中问题的指标2的最优区间为[4,6],无法容忍下限为3,无法容忍上限为12)
2.向量规范化
无论成本型属性还是效益型属性,向量规范化如下式进行变换:
(二)确定正理想解和负理想解
(三)计算各对象到正理想解与负理想解的距离
(四)计算各对象的综合评价指数
(五)按照对象的综合评价指数进行排序
1.向量规范化
a=[0.3 6 3000 3.8
0.5 8 2000 4.7
1.7 10 4000 5.5
0.2 7 2500 6.8
0.8 2 6000 2.1];
[m,n]=size(a);
x2=@(range,lb,ub,x)(1-(range(1)-x)./(range(1)-lb)).*...
(x>=lb & x=range(1) & x<=range(2))+...
(1-(x-range(2))./(ub-range(2))).*(x>range(2) & x<=ub);
range=[4,6];lb=3;ub=12;
a(:,2)=x2(range,lb,ub,a(:,2));%对指标2进行变换
b=a./vecnorm(a) %向量规范化
2.确定正理想解和负理想解
Cstar=max(b); %求正理想解
Cstar(4)=min(b(:,4))%指标4为成本型指标
得到的正理想解为
C0=min(b);%求负理想解
C0(4)=max(b(:,4))%指标4为成本型指标
得到的负理想解为
3.计算各对象到正理想解与负理想解的距离
Sstar=vecnorm(b-Cstar,2,2) %逐行计算二范数得到正理想解的距离
S0=vecnorm(b-C0,2,2) %逐行计算二范数得到负理想解的距离
4.计算综合评价指数
f=S0./(Sstar+S0)
[sf,ind]=sort(f,'descend')%求排序结果
最终结果:
完整代码:
a=[0.3 6 3000 3.8
0.5 8 2000 4.7
1.7 10 4000 5.5
0.2 7 2500 6.8
0.8 2 6000 2.1];
[m,n]=size(a);
x2=@(range,lb,ub,x)(1-(range(1)-x)./(range(1)-lb)).*...
(x>=lb & x=range(1) & x<=range(2))+...
(1-(x-range(2))./(ub-range(2))).*(x>range(2) & x<=ub);
range=[4,6];lb=3;ub=12;
a(:,2)=x2(range,lb,ub,a(:,2));%对指标2进行变换
b=a./vecnorm(a) %向量规范化
Cstar=max(b); %求正理想解
Cstar(4)=min(b(:,4))%指标4为成本型指标
C0=min(b);%求负理想解
C0(4)=max(b(:,4))%指标4为成本型指标
Sstar=vecnorm(b-Cstar,2,2) %逐行计算二范数得到正理想解的距离
S0=vecnorm(b-C0,2,2) %逐行计算二范数得到负理想解的距离
f=S0./(Sstar+S0)
[sf,ind]=sort(f,'descend')%求排序结果
TOPSIS法的局限性:默认了所有指标对最终打分的重要程度是相同的,即权重相同,但在实际问题中,不同的指标往往具有不同的权重大小。
因此,我们常常在TOPSIS法的基础上,使用层次分析法、熵权法等等方法对不同指标赋予权重。本文使用客观权重赋权法(CRITIC法)对问题中的4个指标进行赋权,此处参考了知乎博主和wt一起快乐学习的Python代码(https://zhuanlan.zhihu.com/p/439207297),得到赋权结果:
在上面MATLAB代码的基础上加入指标的权重矩阵即可得到排序结果,完整代码如下:
a=[0.3 6 3000 3.8
0.5 8 2000 4.7
1.7 10 4000 5.5
0.2 7 2500 6.8
0.8 2 6000 2.1];
[m,n]=size(a);
x2=@(range,lb,ub,x)(1-(range(1)-x)./(range(1)-lb)).*...
(x>=lb & x=range(1) & x<=range(2))+...
(1-(x-range(2))./(ub-range(2))).*(x>range(2) & x<=ub);
range=[4,6];lb=3;ub=12;
a(:,2)=x2(range,lb,ub,a(:,2));%对指标2进行变换
b=a./vecnorm(a) %向量规范化
w=[0.39935266 0.14388528 0.26744244 0.18931962]; %加权矩阵
c=b.*w;
Cstar=max(c); %求正理想解
Cstar(4)=min(c(:,4))%指标4为成本型指标
C0=min(c);%求负理想解
C0(4)=max(c(:,4))%指标4为成本型指标
Sstar=vecnorm(c-Cstar,2,2) %逐行计算二范数得到正理想解的距离
S0=vecnorm(c-C0,2,2) %逐行计算二范数得到负理想解的距离
f=S0./(Sstar+S0)
[sf,ind]=sort(f,'descend')%求排序结果
模型改进后的结果: