一、算法的提出
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}
⎣⎢⎢⎡x11x21…xn1x12x22…xn2……⋱…x1mx2m…xnm⎦⎥⎥⎤
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′=xmax−xminxi−xmin
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′=xmax−xminxmax−xi
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′=1−∣xi−xbest∣max∣xi−xbest∣
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{a−min{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′=⎩⎪⎨⎪⎧1−Ma−x x<a1 a≤x≤b1−Mx−b x>b
(2)指标标准化处理得到新矩阵
a i = x i ′ ∑ j = 1 n x j ′ a_i=\frac{x_i'}{\sum_{j=1}^nx_j'} ai=∑j=1nxj′xi′
此时我们已经得到了一个经过正向化、标准化的决策矩阵:
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=⎣⎢⎢⎡a11a21…an1a12a22…an2……⋱…a1ma2m…anm⎦⎥⎥⎤
(3)计算加权决策矩阵
对于
m
m
m个因素,我们使用层次分析法AHP计算
m
m
m个因素的权重向量:
ω
=
(
w
1
,
w
2
,
.
.
.
,
w
m
)
\omega=(w_1,w_2,...,w_m)
ω=(w1,w2,...,wm)
将各个指标对应的权重与正向化标准化的决策矩阵相乘得到加权决策矩阵:
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×aij,i=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=1∑m(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=1∑m(zj−−rij)2
(3)计算每个方案的优劣值
定义第
i
i
i个方案的优劣值:
v
i
=
d
i
−
d
i
+
+
d
i
−
v_i=\frac{d_i^-}{d_i^++d_i^-}
vi=di++di−di−
我们先来理解一下每个方案距离最优最劣解的距离
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.=4−14.0735−4≈0.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.0245≈0.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 0−0.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的第二列即为排序结果