\quad 模糊层次分析法( F A H P FAHP FAHP)将模糊理论( F u z z y S e t Fuzzy Set FuzzySet)嵌入到基本层次分析法( A H P AHP AHP)中。 A H P AHP AHP是一种广泛应用于各种多准则决策问题的决策工具,它将不同的备选方案与不同的标准进行成对比较,并为多标准决策问题提供了决策支持工具。在一般的AHP模型中,目标在第一层,标准和子标准分别在第二层和第三层,第四个层次为备选方案。由于基本AHP不包括个人判断的模糊性,它通过受益于模糊逻辑方法得到了改进。在FAHP中,通过语言变量对标准和备选方案进行成对比较,语言变量由三角模糊数等表示。
\quad 定义:三角模糊数 A ~ = ( a l , a m , a u ) \tilde{A}=(a_l,a_m,a_u) A~=(al,am,au), a l 、 a m 和 a u a_l、a_m和a_u al、am和au分别为下届、中值和上届,其隶属函数表示如下:
μ A ~ = { x − a l a m − a l , a l ≤ x ≤ a m a − a u a m − a u , a m ≤ x ≤ a u 0 , 其他 \mu_{\tilde{A}}=\begin{cases} \frac{x-a_l}{a_m-a_l},a_l\le x\le a_m\\ \frac{a-a_u}{a_m-a_u},a_m\le x\le a_u\\ 0,其他\\ \end{cases} μA~=⎩ ⎨ ⎧am−alx−al,al≤x≤amam−aua−au,am≤x≤au0,其他
\quad 运算方法: M 1 = ( l 1 , m 1 , u 1 ) M_1=\left(l_1,m_1,u_1\right) M1=(l1,m1,u1), M 2 = ( l 2 , m 2 , u 2 ) M_2=\left(l_2,m_2,u_2\right) M2=(l2,m2,u2)
{ M 1 ⨁ M 2 = ( l 1 + l 1 , m 1 + m 2 , u 1 + u 2 ) M 1 ⨂ M 2 ≈ ( l 1 l 2 , m 1 m 2 , u 1 u 2 ) 1 M 1 ≈ ( 1 u , 1 m , 1 l ) \begin{cases} M_1 \bigoplus \ M_2 = \left(l_1 + l_1, m_1 + m_2, u_1 + u_2\right) \\ M_1 \bigotimes \ M_2 \approx \left(l_1 l_2, m_1 m_2, u_1 u_2\right) \\ \frac{1}{M_1} \approx \left(\frac{1}{u},\frac{1}{m}, \frac{1}{l}\right) \\ \end{cases} ⎩ ⎨ ⎧M1⨁ M2=(l1+l1,m1+m2,u1+u2)M1⨂ M2≈(l1l2,m1m2,u1u2)M11≈(u1,m1,l1)
Saaty等级 | 定义 | 三角模糊数 |
1 | 同等重要(EI) | (1,1,1) |
3 | 稍微重要(WI) | (2,3,4) |
5 | 相当重要(FI) | (4,5,6) |
7 | 非常重要(SI) | (6,7,8) |
9 | 绝对重要(AI) | (9,9,9) |
2 4 6 8 |
两个相邻刻度之间的间歇值 | (1,2,3) (3,4,5) (5,6,7) (7,8,9) |
\quad 如果C1比C2弱重要,则 C 1 → C 2 C1\rightarrow C2 C1→C2取三角模糊数 ( 2 , 3 , 4 ) (2,3,4) (2,3,4), C 1 ← C 2 C1\leftarrow C2 C1←C2取三角模糊数 ( 1 4 , 1 3 , 1 2 ) (\frac{1}{4},\frac{1}{3},\frac{1}{2}) (41,31,21)
S1. 建立三角模糊成对比较矩阵
\quad 第k个专家评价结果为:
A ~ k = [ d ~ 11 k d ~ 12 k … d ~ 1 n k d ~ 21 k d ~ 22 k … d ~ 2 n k ⋮ ⋮ ⋱ ⋮ d ~ n 1 k d ~ n 2 k … d ~ n n k ] (1) \tilde{A}^{k}= \begin{bmatrix} \tilde{d}_{11}^{k} & \tilde{d}_{12}^{k} & \ldots & \tilde{d}_{1n}^{k} \\ \tilde{d}_{21}^{k} & \tilde{d}_{22}^{k} & \ldots & \tilde{d}_{2n}^{k} \\ \vdots & \vdots & \ddots & \vdots \\ \tilde{d}_{n1}^{k} & \tilde{d}_{n2}^{k} & \ldots & \tilde{d}_{nn}^{k} \\ \end{bmatrix} \tag{1} A~k= d~11kd~21k⋮d~n1kd~12kd~22k⋮d~n2k……⋱…d~1nkd~2nk⋮d~nnk (1)
S2. 当存在多个决策者时,计算每个决策者的偏好( d i j k ~ \tilde{d_{ij}^{k}} dijk~)的平均值, d i j k ~ \tilde{d_{ij}^{k}} dijk~的计算表达式如下:
d i j k ~ = ∑ k = 1 K d ~ i j k K (2) \tilde{d_{ij}^{k}}=\frac{\sum_{k=1}^{K}\tilde{d}_{ij}^{k}}{K}\tag{2} dijk~=K∑k=1Kd~ijk(2)
S3. 根据平均偏好,更新成对比较矩阵
A ~ = [ d 11 ~ d 12 ~ … d 1 n ~ d 21 ~ d 22 ~ … d 2 n ~ ⋮ ⋮ ⋱ ⋮ d n 1 ~ d n 2 ~ … d n n ~ ] (3) \tilde{A}= \begin{bmatrix} \tilde{d_{11}} & \tilde{d_{12}} & \ldots & \tilde{d_{1n}} \\ \tilde{d_{21}} & \tilde{d_{22}} & \ldots & \tilde{d_{2n}} \\ \vdots & \vdots & \ddots & \vdots \\ \tilde{d_{n1}} & \tilde{d_{n2}} & \ldots & \tilde{d_{nn}} \\ \end{bmatrix} \tag{3} A~= d11~d21~⋮dn1~d12~d22~⋮dn2~……⋱…d1n~d2n~⋮dnn~ (3)
S4. 根据Buckley,计算每个标准的模糊比较值的几何平均值 r i ~ \tilde{r_{i}} ri~(三角数)
r i ~ = ( ∏ j = 1 n d ~ i j ) 1 n , i = 1 , 2 , … , n (4) \tilde{r_{i}}={\left(\prod_{j=1}^{n}\tilde{d}_{ij}\right)}^{\frac{1}{n}},i=1,2,\ldots,n \tag{4} ri~=(j=1∏nd~ij)n1,i=1,2,…,n(4)
S5. 计算每个标准的模糊权重:求每个 r i ~ \tilde{r_{i}} ri~的矢量和;求和向量的 − 1 -1 −1次方,替换模糊三角数,使其按递增顺序排列;计算 r i ~ \tilde{r_{i}} ri~和它的逆向量的乘积
w ~ i = r i ~ ⨂ ( r 1 ~ ⨁ r 2 ~ ⨁ … ⨁ r n ~ ) − 1 = ( l w i , m w i , u w i ) (5) \tilde{w}_{i} = \tilde{r_{i}}\bigotimes {\left(\tilde{r_{1}} \bigoplus \tilde{r_{2}} \bigoplus \ldots \bigoplus \tilde{r_{n}}\right)}^{-1}=\left(lw_i,mw_i,uw_i\right) \tag{5} w~i=ri~⨂(r1~⨁r2~⨁…⨁rn~)−1=(lwi,mwi,uwi)(5)
S6.反模糊化计算
w i = l w i + m w i + u w i 3 (6) w_i = \frac{lw_i + mw_i + uw_i}{3} \tag{6} wi=3lwi+mwi+uwi(6)
S7. 归一化处理
n w i = w i ∑ n = 1 n w i (7) nw_i = \frac{w_i}{\sum_{n=1}^n w_i} \tag{7} nwi=∑n=1nwiwi(7)
\quad 然后,通过将每个备选权重与相关标准相乘,计算每个备选的分数。根据这些结果,向决策者建议得分最高的备选方案。
import numpy as np
# Function: Fuzzy AHP
def fuzzy_ahp_method(dataset):
'''
dataset: 专家判断矩阵,n*n*3,n表示指标数
'''
row_sum = []
s_row = []
f_w = [] #模糊权重
d_w = [] #去模糊权重
# 一致性检测指标
inc_rat = np.array([0, 0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51, 1.48, 1.56, 1.57, 1.59])
# 模糊判断矩阵转为清晰判断矩阵
X = [(item[0] + 4*item[1] + item[2])/6 for i in range(0, len(dataset)) for item in dataset[i]] #三角数转为模糊数
X = np.asarray(X) #列表转数组
X = np.reshape(X, (len(dataset), len(dataset))) #转为n*n矩阵
# S4. 计算每个准则的模糊比较值的几何平均值r_i(公式4)
for i in range(0, len(dataset)):
a, b, c = 1, 1, 1
for j in range(0, len(dataset[i])):
d, e, f = dataset[i][j]
# 计算公式(4)的括号内部分: r_s = \prod_{j=1}^n d_ij
a, b, c = a*d, b*e, c*f
row_sum.append( (a, b, c) )
L, M, U = 0, 0, 0
for i in range(0, len(row_sum)):
a, b, c = row_sum[i]
# 计算公式(4)的括号外部分: s_r = (r_s)^(1/n)
a, b, c = a**(1/len(dataset)), b**(1/len(dataset)), c**(1/len(dataset))
s_row.append( ( a, b, c ) )
# 计算公式(5)中⨁运算部分:R5 = r1⨁r2⨁...⨁rn
L = L + a
M = M + b
U = U + c
for i in range(0, len(s_row)):
a, b, c = s_row[i]
# 计算公式公式(5)中⨂运算部分:wi = ri⨂R5
a, b, c = a*(U**-1), b*(M**-1), c*(L**-1)
# 模糊权重
f_w.append( ( a, b, c ) )
# 计算公式(6):去模糊权重
d_w.append( (a + b + c)/3 )
# 计算公式(7): 归一化权重
n_w = [item/sum(d_w) for item in d_w]
# 计算特征根向量
vector = np.sum(X*n_w, axis = 1)/n_w
# 获得平均特征根
lamb_max = np.mean(vector)
# 计算一致性指标
cons_ind = (lamb_max - X.shape[1])/(X.shape[1] - 1)
# 一致性判断
rc = cons_ind/inc_rat[X.shape[1]]
return f_w, d_w, n_w, rc
dataset = list([
[ ( 1, 1, 1), ( 4, 5, 6), ( 3, 4, 5), ( 6, 7, 8) ], #g1
[ (1/6, 1/5, 1/4), ( 1, 1, 1), (1/3, 1/2, 1/1), ( 2, 3, 4) ], #g2
[ (1/5, 1/4, 1/3), ( 1, 2, 3), ( 1, 1, 1), ( 2, 3, 4) ], #g3
[ (1/8, 1/7, 1/6), (1/4, 1/3, 1/2), (1/4, 1/3, 1/2), ( 1, 1, 1) ] #g4
])
fuzzy_weights, defuzzified_weights, normalized_weights, rc = fuzzy_ahp_method(dataset)
print('模糊权重')
for i in range(0, len(fuzzy_weights)):
print('g'+str(i+1)+': ', np.around(fuzzy_weights[i], 3))
print('清晰权重')
for i in range(0, len(defuzzified_weights)):
print('g'+str(i+1)+': ', round(defuzzified_weights[i], 3))
print('归一化权重')
for i in range(0, len(normalized_weights)):
print('g'+str(i+1)+': ', round(normalized_weights[i], 3))
print('一致性判断')
print('RC: ' + str(round(rc, 2)))
if (rc > 0.10):
print('The solution is inconsistent, the pairwise comparisons must be reviewed')
else:
print('The solution is consistent')
输出结果为:
模糊权重
g1: [0.428 0.61 0.859]
g2: [0.085 0.131 0.218]
g3: [0.117 0.196 0.309]
g4: [0.044 0.063 0.099]
清晰权重
g1: 0.632
g2: 0.145
g3: 0.207
g4: 0.068
归一化权重
g1: 0.601
g2: 0.138
g3: 0.197
g4: 0.065
一致性判断
RC: 0.06
The solution is consistent