第四章 節點分群與加邊之演算法
4.1 三種節點分群演算法
4.1.1 Dynamic Programming 為主之演算法
Dynamic Programming 為一個可以有效得出一個問題的最佳解,其概念與 Divide and Conquer 類似,作法是先將原始問題分成數個子問題來解決,並動態 存取每次所解決的子問題的答案,以利於節省計算重複問題的時間,每個子問 題都有一個最佳解,將所有子問題解決後,即可得到原問題的最佳解。如圖 15,若要計算從 VS點到 VT點的最短路徑,首先須找出各點到其鄰居的距離,
並從 VS點開始每次路徑增加一個節點時,就調整最短路徑的途徑,直到終點 VT
點為止。如 VS到其鄰居的最近距離為 2,即為 VS到 VB的距離。接著當路徑要 在新增一個節點時則重新評估最短路徑的途徑,比較{VS, VA, VD}, {VS, VB, VD}….等路徑長度,並在這些路徑其中找出最短路徑。即為{VS, VB, VD},以此 類推,最後得出 VS到 VT的最短路徑是{VS, VB, VD, VT}。
S
C
A D
F
B
T
8
E
圖 15 Dynamic Programming 範例
Liu et al. (2008) 所提出的 k-degree anonymous 方法中修改 Dynamic
Programming 來做節點分支度分群,此方法的前提是以每一群的分群大小需要 控制在 k 與 2k-1 個節點之間,當分群大小等於或超過 2k 時,則將此群分成兩 群,原因是因為當群內的節點越多,則每一群內的加邊總數就越高,故此做法 能降低每一群的群集之隱匿成本。原始的 Dynamic Programming 執行時間為 𝑂(𝑛2),原因是 Dynamic Programming 必須將所有的分群結果計算完後,考慮每 一種分群結果,才可得知哪一種分群結果的加邊數量最少;但在經過 Liu et al.
修改過後的 Dynamic Programming 方法只需花𝑂(𝑛𝑘),詳細流程如下。k 代表每 群節點群集至少要有 k 個節點;n 代表總節點數, d 代表節點分支度數由大到 小排序後的分支度序列,此序列的關係 : 𝑑(1) ≥ 𝑑(2) ≥ ⋯ ≥ 𝑑(𝑛);𝑑̂ 代表隱 匿後的分支度序列;DA( d[1, i])代表 d[1, i]序列的分支度隱匿成本;I( d[i, j])代 表當節點i, i+1, …,j 皆被放入同一群時,此群的隱匿成本。故可得知以下關 係:
𝐼(𝑑[ 𝑖, 𝑗]) = ∑(𝑑(𝑖) − 𝑑(𝑙))
𝑗
𝑙=𝑖
從以上的關係建立 Dynamic Programming 的等式:
(1) 當 i < 2k 時
𝐷𝐴( 𝑑[1, 𝑖]) = 𝐼(𝑑[ 1, 𝑖]) (2) 當 i ≥ 2k 時
𝐷𝐴( 𝑑[1, 𝑖]) = 𝑚𝑖𝑛
𝑗 ≤ 𝑡 ≤ 𝑖−𝑘(𝐷𝐴(𝑑[ 1, 𝑡]) + 𝐼( 𝑑[ 𝑡 + 1, 𝑖])) 且 j = max{ k, i-2k+1}
式子(1)指當群內節點數少於 2k 個時,無法將節點分成兩群,故這些節點將全 部分為一群,隱匿成本即代表當群內的節點要將分支度數增加至與 d(1)的分支 度相同所需要的邊數。式子(2)則代表當節點數等於或超過 2k 個時,則分支度 隱匿成本為 d[1, t]序列的隱匿成本再加上群內節點為 t+1, t+2,…到第 i 個節點的 最佳隱匿成本,並且每一群的大小皆不能超過 2k。此方法只需花𝑂(𝑛),大大的
加速執行速度。
以圖 12 為例,圖形上的 TN ( Transfer Node)為{VX , VE, VG, VD, VF, VY},其 分支度分別為{ 3, 5, 3, 4, 2, 4},如表 2,將 TN 依分支度由大到小排序成為一串 新序列TN’, TN’為{ VE, VD, VY, VX , VG, VF},其分支度為{5, 4, 4, 3, 3, 2}。若 k2
等於 2,TN’的節點數共有六個,則必須分成兩群。而這些節點的數量大於 2k2,故若要求出此序列的隱匿成本,則需要由式子(2)的條件才能求得。此序列 的隱匿成本為𝐷𝐴(𝑑[ 1, 𝑡]) + 𝐼( 𝑑[ 𝑡 + 1, 𝑖])的最小值,其中 t 的範圍必須界定在 j ≤ t ≤ i-k ,j 代表 max{ k, i-2k+1},從上述已知可得出 j =3,t 的範圍即為 3≤ t
≤4。將這些參數帶回原式後可得到分群結果為{ VE, VD, VY }及{ VX, VG, VF}。最 後我們在檢查這些分群結果內的節點是否皆在同一條最短路徑上,當有違反此 限制的節點群時,則從其他節點群中找出分支度數與此群分支度數最大值最相 近的節點,並挑出一節點與另一群分支度數最大值最相近的節點做交換,來滿 足此限制條件。
以下為 Dynamic Programming 之演算法:
Input:1. 一張 k-anonymous path privacy 的隱匿圖 2. k2值
Output:若干個至少包含 k2個節點的群集 Parameter:
TN : 最短路徑上所經過的點 SP : 最短路徑
Nsp: 最短路徑上的所有節點 S : 起點
T : 終點
d:分支度序列 n:代表節點數 演算法:
1. Find all SPs a Nsp
2. 令 TN = { ti | 包含所有 TN 的集合}
3. For each ti 4. di = ti的分支度
5. 依照節點分支度由大到小排序 6. 令 I( d[ i , j ] ) = ∑𝑗𝑙=𝑖(𝑑𝑖 − 𝑑𝑙) 7. if ( | TN| < 2k2) then
8. DA(d[ 1, i ] ) = I( d[ 1,i ] ) 9. Else
10. DA(d [1, i] ) = 𝑚𝑖𝑛
𝑚𝑎𝑥{𝑘2,𝑖−2𝑘2+1 }≤𝑡≤𝑖−𝑘2{𝐷𝐴(𝑑[1, 𝑡]) + 𝐼(𝑑[𝑡 + 1 , 𝑖])}
11. If (a cluster contains nodes all from the same SP), then
12. Select a vertex that has closest node degree with neighboring cluster vertex, not on the same SP, and swap the two vertices;