TOPSIS算法(优劣解距离法)的使用举例与matlab实现

一、算法的提出

 
​  C.L.Hwang和K.Yoon在1981年首次提出TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution)算法,直接即逼近理想解排序法,国内通常称之为优劣解距离法。
 
  相比较于层次分析法AHP与模糊综合评价法,TOPSIS算法能够充分利用原始数据的信息,并能更精确反映出各个状况/方案之间的优劣与差距。
 
  ​TOPSIS算法的基本过程为先将原始数据矩阵(决策矩阵)进行正向化处理得到正向化矩阵,再进行标准化处理消除各指标量纲的影响。再通过AHP或其他方法得到各个因素之间的权重向量,构造出新的加权决策矩阵。
  
  然后在所有的数据中找到最优和最劣方案,计算各个评价对象相对于最优方案与最劣方案的欧氏距离,最终获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。
 
  TOPSIS算法对数据的分布及含量等没有严格限制,且数据易处理计算简单,思路清晰,因而被广泛使用。

二、TOPSIS算法的一般步骤

注意:下列的交标含义请仔细辨别,交标含义并未相同含义贯穿始终。
如果有不清楚的地方可以在评论区指出,有人指出后我再修改交标含义。

1.形成决策矩阵

设共有 n n n个评价对象,每个评价对象含有 m m m个参数指标。将 n n n个评价对象的参数指标排列得到 n × m n×m n×m矩阵,即决策矩阵:
[ x 11 x 12 … x 1 m x 21 x 22 … x 2 m … … ⋱ … x n 1 x n 2 … x n m ] \begin{bmatrix} x_{11} & x_{12} & \dots & x_{1m} \\ x_{21} & x_{22} & \dots& x_{2m}\\ \dots& \dots & \ddots& \dots\\ x_{n1}& x_{n2}& \dots& x_{nm}\end{bmatrix} x11x21xn1x12x22xn2x1mx2mxnm

2.计算加权决策矩阵

(1)指标正向化处理

常见的四种指标(即评价对象的 m m m个参数指标所属类型)

指标类型指标特点举例
极大型指标(效益型)越大越好成绩、利润
极小型指标(成本型)越小越好成本、费用
中间型指标越接近某个值越好人体所处环境温度
区间型指标落在某个区间最好体温、饮用水中的矿物质含量

为了后续处理,我们需要将所有类型的指标转换为极大值指标,且需要将所有指标类型统一转换为各自对应的正向化指标,准换的方式可以不一样,下面给出一些转换公式的参考。

a.极大值指标正向化

x i ′ = x i − x m i n x m a x − x m i n x'_i=\frac{x_i-x_{min}}{x_{max}-x_{min}} xi=xmaxxminxixmin

b.极小型指标极大正向化

x i ′ = x m a x − x i x m a x − x m i n x'_{i}=\frac{x_{max}-x_i}{x_{max}-x_{min}} xi=xmaxxminxmaxxi

c.中间型指标极大正向化

x i ′ = 1 − ∣ x i − x b e s t ∣ ∣ x i − x b e s t ∣ m a x x'_i=1-\frac{|x_i-x_{best}|}{|x_i-x_{best}|_{max}} xi=1xixbestmaxxixbest

d.区间型指标极大正向化

设最佳区间为 [ a , b ] [a,b] [a,b],且记
M = max ⁡ { a − min ⁡ { x i } , max ⁡ { x i } − b } M=\max\{a-\min\{x_i\},\max\{x_i\}-b\} M=max{amin{xi},max{xi}b}

x i ′ = { 1 − a − x M       x < a 1                  a ≤ x ≤ b 1 − x − b M       x > b x_i'= \begin{cases} 1-\frac{a-x}{M}\ \ \ \ \ x<a\\ 1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ a\leq x\leq b\\ 1-\frac{x-b}{M}\ \ \ \ \ x>b \end{cases} xi=1Max     x<a1                axb1Mxb     x>b

(2)指标标准化处理得到新矩阵

a i = x i ′ ∑ j = 1 n x j ′ a_i=\frac{x_i'}{\sum_{j=1}^nx_j'} ai=j=1nxjxi

此时我们已经得到了一个经过正向化、标准化的决策矩阵:
A n × m = [ a 11 a 12 … a 1 m a 21 a 22 … a 2 m … … ⋱ … a n 1 a n 2 … a n m ] A_{n×m}=\begin{bmatrix} a_{11} & a_{12} & \dots & a_{1m} \\ a_{21} & a_{22} & \dots& a_{2m}\\ \dots& \dots & \ddots& \dots\\ a_{n1}& a_{n2}& \dots& a_{nm}\end{bmatrix} An×m=a11a21an1a12a22an2a1ma2manm

(3)计算加权决策矩阵

对于 m m m个因素,我们使用层次分析法AHP计算 m m m个因素的权重向量:
ω = ( w 1 , w 2 , . . . , w m ) \omega=(w_1,w_2,...,w_m) ω=(w1,w2,...,wm)

层次分析法AHP的简单使用举例与matlab实现

将各个指标对应的权重与正向化标准化的决策矩阵相乘得到加权决策矩阵:
R = ( r i j ) n × m R=(r_{ij})_{n×m} R=(rij)n×m

r i j = w j × a i j , i = 1 , 2 , . . . , n r_{ij}=w_j×a_{ij},i=1,2,...,n rij=wj×aiji=1,2,...,n

3.计算每个方案的优劣值

(1)计算每个参数对应的最大最小值

z j + = max ⁡ { r 1 j , r 2 j , . . . , r n j } , j = 1 , 2 , . . . , m z_{j}^+=\max\{r_{1j},r_{2j},...,r_{nj}\},j=1,2,...,m zj+=max{r1j,r2j,...,rnj}j=1,2,...,m

z j − = min ⁡ { r 1 j , r 2 j , . . . , r n j } , j = 1 , 2 , . . . , m z_{j}^-=\min\{r_{1j},r_{2j},...,r_{nj}\},j=1,2,...,m zj=min{r1j,r2j,...,rnj}j=1,2,...,m

事实上,我们结合之前正向化的步骤很容易知道, z j − z_j^- zj其实就是一个零向量。

(2)计算每个方案距离最优最劣解的距离

由于我们已经将四种类型的指标转换为了极大型指标,所以我们已经可以认为,每个参数存在的最大值就是最优解,每个参数存在的最小值就是最劣解。
我们采用欧式距离计算每个方案在各个因素下的最优距离与最劣距离:
d i + = ∑ j = 1 m ( z j + − r i j ) 2 d_i^+=\sqrt{\sum_{j=1}^m(z_j^+-r_{ij})^2} di+=j=1m(zj+rij)2

d i − = ∑ j = 1 m ( z j − − r i j ) 2 d_i^-=\sqrt{\sum_{j=1}^m(z_j^--r_{ij})^2} di=j=1m(zjrij)2

余弦距离与欧氏距离的关系与使用

(3)计算每个方案的优劣值

定义第 i i i个方案的优劣值:
v i = d i − d i + + d i − v_i=\frac{d_i^-}{d_i^++d_i^-} vi=di++didi
我们先来理解一下每个方案距离最优最劣解的距离 d i + 、 d i − d_i^+、d_i^- di+di的含义。
首先我们先时刻记住“距离”这一含义:
距离值越大,说明离得越远;距离值越小,说明离得越近。
对应地:
d i + d^+_i di+越大,说明离最优情况越远,该方案越不优秀。
   d i + d^+_i di+越小,说明离最有情况越近,该方案更加优秀。
d i − d^-_i di同样去理解。
在我们现在明确了距离最优最劣解的距离 d i + 、 d i − d_i^+、d_i^- di+di的含义之后,我们就不难理解计算优劣值的表达式了:
d i + d_i^+ di+越大,离最优解越远,优劣值 v i v_i vi越小,更不优秀。
d i − d_i^- di越大,离最劣解越远,优劣值 v i v_i vi越大,更加优秀。

三、使用举例

如下题:(题目描述来源于网络,侵删)

评价下表中20条河流的水质情况
注意:含氧量越高越好;pH值越接近7越好;细菌总数越少越好;植物性营养含量在10~20之间最佳在这里插入图片描述

1.形成决策矩阵

在这里插入图片描述

2.计算加权决策矩阵

(1)指标正向化处理

在这里插入图片描述

(2)指标标准化处理得到新矩阵

在这里插入图片描述

(3)计算加权决策矩阵

注意,此处我们层次分析法中的两两比较判断矩阵未必符合真实科学性,此处我们仅仅是作为一个例子来举例而已。
假设四个影响因素的两两比较判断矩阵为:
C = [ 1 1 7 5 1 1 7 5 1 7 1 7 1 1 3 1 5 1 5 3 1 ] C=\begin{bmatrix} 1 & 1 & 7 & 5 \\ 1 & 1 & 7& 5\\ \frac17& \frac17 & 1& \frac13\\ \frac15& \frac15& 3& 1\end{bmatrix} C=117151117151771355311
该矩阵的最大特征值:
λ m a x = 4.0735 \lambda_{max}=4.0735 λmax=4.0735
一致性检验:
C . I . = 4.0735 − 4 4 − 1 ≈ 0.0245 C.I.=\frac{4.0735-4}{4-1}≈0.0245 C.I.=414.073540.0245

R . I . = 0.89 R.I.=0.89 R.I.=0.89

C . R . = 0.0245 0.89 ≈ 0.0275 < 0.1 C.R.=\frac{0.0245}{0.89}≈0.0275<0.1 C.R.=0.890.02450.0275<0.1
因此我们认为该判断矩阵的一致性可以接受。
计算得到权重向量:
W = ( 0.4225    0.4225    0.0506    0.1044 ) W=(0.4225\ \ 0.4225\ \ 0.0506\ \ 0.1044) W=(0.4225  0.4225  0.0506  0.1044)
接下来计算加权决策矩阵:
在这里插入图片描述

3.计算每个方案的优劣值

(1)计算每个参数对应的最大最小值

z j + = ( 0.1476    0.1412    0.0203    0 − 0.0320 ) z_j^+=(0.1476\ \ 0.1412\ \ 0.0203\ \ 0-0.0320) zj+=(0.1476  0.1412  0.0203  00.0320)

z j − = ( 0    0    0    0 ) z_j^-=(0\ \ 0\ \ 0\ \ 0) zj=(0  0  0  0)

(2)计算每个方案距离最优最劣解的距离

在这里插入图片描述在这里插入图片描述

(3)计算每个方案的优劣值

在这里插入图片描述

4.根据优劣值进行排序得到结果

最优状况排序如下:
4>8>7>11>3>10>5>20>16>17>12>1>9>19>18>13>6>15>2>4

四、matlab代码实现

M=[4.69 6.59 51 11.94;
    2.03 7.86 19 6.46;
    9.11 6.31 46 8.91;
    8.61 7.05 46 26.43;
    7.13 6.5 50 23.57;
    2.39 6.77 38 24.62;
    7.69 6.79 38 6.01;
    9.3 6.81 27 31.57;
    5.45 7.62 5 18.46;
    6.19 7.27 17 7.51;
    7.93 7.53 9 6.52;
    4.4 7.28 17 25.3;
    7.46 8.24 23 14.42;
    2.01 5.55 47 26.31;
    2.04 6.4 23 17.91;
    7.73 6.14 52 15.72;
    6.35 7.58 25 29.46;
    8.29 8.41 39 12.02;
    3.54 7.27 54 3.16;
    7.44 6.26 8 28.41];%最开始的数据矩阵
type=[1,3,2,4];%指标类型矩阵,1表示极大型指标,2表示极小型指标,3表示中间型指标,4表示区间型矩阵
for j=1:4
    if(type(j)==1)
        Max=-99999.9999;
        Min=99999.9999;
        for i=1:20
            Max=max(Max,M(i,j));
            Min=min(Min,M(i,j));
        end
        for i=1:20
            M(i,j)=(M(i,j)-Min)/(Max-Min);
        end
    elseif(type(j)==2)
        Max=-99999.9999;
        Min=99999.9999;
        for i=1:20
            Max=max(Max,M(i,j));
            Min=min(Min,M(i,j));
        end
        for i=1:20
            M(i,j)=(Max-M(i,j))/(Max-Min);
        end
    elseif(type(j)==3)
        Max=-99999.9999;
        for i=1:20
            Max=max(Max,abs(M(i,j)-7));
        end
        for i=1:20
            M(i,j)=1-abs(M(i,j)-7)/Max;
        end
    elseif(type(j)==4)
        Max=-99999.9999;
        Min=99999.9999;
        for i=1:20
            Max=max(Max,M(i,j));
            Min=min(Min,M(i,j));
        end
        T=max(10-Min,Max-20);
        for i=1:20
            if(M(i,j)<10)
                M(i,j)=1-(10-M(i,j))/T;
            elseif(M(i,j)>20)
                M(i,j)=1-(M(i,j)-20)/T;
            else
                M(i,j)=1;
            end
        end
    end
end
%以上是讨论四种类型指标,分别进行正向化
A=zeros(20,4);
for j=1:4
    sum=0
    for i=1:20
        sum=sum+M(i,j)^2;
    end
    sum=sqrt(sum);
    for i=1:20
        A(i,j)=M(i,j)/sum;
    end
end
%以上是将正向化处理得到的矩阵进行标准化
C=[1 1 7 5;
    1 1 7 5;
    1/7 1/7 1 1/3;
    1/5 1/5 3 1];
[Omega,Lambda]=eig(C);
mx=-99999.99999;
id=0;
for i=1:4
    if(Lambda(i,i)>mx)
        mx=Lambda(i,i);
        id=i;
    end
end
W=zeros(4,1);
sum=0;
for i=1:4
    sum=sum+Omega(i,id);
end
for i=1:4
    W(i,1)=Omega(i,id)/sum;
end
%以上是求得权重向量W
R=zeros(20,4);
for j=1:4
    for i=1:20
        R(i,j)=W(j,1)*A(i,j);
    end
end
%求得加权决策矩阵R
Z_plus=[-99999.9999 -99999.9999 -99999.9999 -99999.9999];
Z_minus=[99999.9999 99999.9999 99999.9999 99999.9999 99999.9999];
for j=1:4
    for i=1:20
        Z_plus(j)=max(Z_plus(j),R(i,j));
        Z_minus(j)=min(Z_minus(j),R(i,j));
    end
end
%求得每个参数对应的最大最小值、
d_plus=zeros(20,1);
d_minus=zeros(20,1);
for i=1:20
    for j=1:4
        d_plus(i)=d_plus(i)+(Z_plus(j)-R(i,j))^2;
        d_minus(i)=d_minus(i)+(Z_minus(j)-R(i,j))^2;
    end
    d_plus(i)=sqrt(d_plus(i));
    d_minus(i)=sqrt(d_minus(i));
end
%计算每个方案距离最优最劣解的距离
v=zeros(20,2);
for i=1:20
    v(i,1)=d_minus(i)/(d_plus(i)+d_minus(i));
    v(i,2)=i;
end
%计算每个方案的优劣值
for i=1:20
    MaxId=i;
    for j=i+1:20
        if(v(j,1)>v(MaxId,1))
            MaxId=j;
        end
    end
    temp=v(i,1);
    v(i,1)=v(MaxId,1);
    v(MaxId,1)=temp;
    temp=v(i,2);
    v(i,2)=v(MaxId,2);
    v(MaxId,2)=temp;
end
%进行优劣值排序
%v的第二列即为排序结果
  • 32
    点赞
  • 217
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值