• 沒有找到結果。

要判斷哪些角色是屬於同一玩家,首先我們要先找出哪兩個角色是同一個 玩家,稱為兩角色分身組。有了兩角色分身組後,再進一步判別結合,找出更 多角色的分身組。

3.2.1 兩角色分身組

利用所收集到的資料,就可以找出所有在收集資料時曾經上線的角色,並 得知每個角色的上線時間序列。有了上線序列的資料,便可以進一步過濾出分 身。我們使用的過濾條件有兩個:同時上線與否和上線順序的接續。首先是同 時上線與否。前面提過,分身最大的特色便是不會同時上線,所以只要同一個 時間點同時在線上的兩個角色,即會被排除是分身的可能性4,如圖2中的AC

退出公會

升級 改變所在地點

和BC皆不會是分身組。

2 角色是否同時出現判別是否為分身組

(註:紅色(深色)代表角色有上線,黃色(淺色)代表無上線)

另一個判斷的條件是上線順序的接續。根據我們的分析,大多數的玩家會交錯 地使用多重角色,也就是輪流使用其中幾個角色,而不會單只使用一個角色。

假設一個玩家擁有A1、A2、A3、A4四個角色,上線順序如圖3,可以發現在一 段時間之內他都在線上,只是使用不同的角色;而角色之間互有需要,因此切 換角色,而且切換的時間都很短。因此我們以切換角色的時間點和切換角色的 次數來判斷角色是否屬於同一玩家。假設A角色在線上並且下線之後,B角色 立刻上線,我們定義為上線間隔△T=1,並記作A→B;A角色在線上並且下線 之後, C角色隔了一個時間後上線,則定義為△T=2;A角色在線上並且下線 之後,D角色隔了兩個時間後上線,則定義為△T=3(圖4)。時間點的間隔 為收集資料的時間間隔,約7~15分鐘,若因伺服器關閉或其它因素使時間間隔 拉長,我們把相隔一小時以上的時間點以新時間序列計算。

4 由於收集資料不可避免的時間差,同一玩家的分身角色有可能會在同一個收集資料的 時間內交換上線,而發生同時上線的狀況,但是這種情形很少,我們設定每5000個時 間點允許重複上線一次;本實驗後面所提及的未重複上線即為此意。

3 同一玩家的分身組可能的上線模式

4 兩個角色的上線間隔△T 由左至右分別為 1、2、3

在一個角色下線之後,有可能玩家會休息一下、倒個水,才切換角色;或 是像圖3中,在時間點4時,A1先換成A2(△T=1),再換成A3(△T=2),

再換成A4(△T=3)。為了使A1和A3、A4的關聯度存在,所以我們計算到△T

=3,再以不同權重計算之。△T愈小愈可能是分身,因此權重愈高。切換次數 愈頻繁,也愈可能是分身。對於兩個角色A和B來說,A→B和B→A是一起算的

(例如A→B有5次,B→A有2次,所以A、B的△T=1次數就有7次)。A、B 的總分數為:

(△T=1的次數)* 5 + (△T=2的次數)* 3 +(△T=3的次數)* 1

若角色A、B已符合「未重複上線」,再符合「AB總分數在X分以上」,即 視A、B為兩角色分身組。X的值將視伺服器人數做調整。

3.2.2 三角色分身組

找出兩角色分身組之後,我們接著要找出更大的分身組。若同一玩家的分 身彼此切換都很頻繁,那麼只要找出兩角色分身組中的clique即可;但是對一 個玩家來說,擁有愈多角色就代表時間愈難分配,因此可能有些角色之間彼此 切換的次數不是那麼明顯。假設A1、A2、A3屬於同一玩家,但玩家大部份時間 會使用A1(如圖5a),那麼A2和A3的關聯度就很小,只能靠A1將它們串連起來。

同樣的,假設B1、B2、B3屬於同一玩家,但玩家的使用順序是B1→B2→B3,那 麼B1和B3也需要靠B2來串連(如圖5b)。因此我們對所有角色分別做搜尋,假 設角色A的兩角色分身組有AB、AC、AE,則對BC、CE、BE做調查。先看是 否為已知分身組;若BC已經是已知分身組,那由於AB、BC、AC都是分身組,

我們便可以確定ABC為三角色分身組。若BC並非已知分身組,則看BC同時上 線次數是否符合門檻:在兩次以下。若是,則可以判斷這屬於圖5的情況,B 和C因為關聯度小而沒被確認為分身組,但經由A將之串連,故ABC為三角色 分身組。

5 同一玩家的角色因為上線順序的關係而失去關聯度

3.2.3 Pseudocode

(Assume player[i][k] == 1 means player i is online at time k.) for i = 0 to player_count

both_online[i][j] = true;

else

else players_score[j][i] += score;

for i = 0 to player_count for j = i+1 to player_count

if( both_online[i][j] == false && players_score[i][j] > x ) (i, j) is two_ava;

for every i in two_ava

find all j that (i, j) is in two_ava for every j

if(j1, j2) is in two_ava (i, j1, j2) is three_ava else

if( both_online[j1][j2] == false ) (i, j1, j2) is three_ava

相關文件