無向圖處理的四個基礎模塊

源代碼:https://github.com/gt11799/undirected_graph_compute

Coursera算法課的本週應用是建立在無向圖的處理上的。根據要求,我寫了四個處理模塊。

def bfs_visited(ugraph, start_node):
    visited = set([start_node])
    tovisit = deque([start_node])
    while tovisit:
        node = tovisit.popleft()
        for item in ugraph[node]:
            if item not in visited:
                visited.add(item)
                tovisit.append(item)                 
    return visited
Breadthfirst search visited。給定無向圖(字典形式),和開始的node,把所有的與該node相連的點作爲集合返回。deque不算是純正的隊,但是從頭部或者尾部取值的效率是O(1),而列表則是O(n)。又append, appendleft, pop, popleft, extend, extendleft, extend就是對象是列表的時候使用。其他的可以顧名思義,實在是靈活的很。

def cc_visited(ugraph):
    remain_node = ugraph.keys()
    cc_set = []
    while remain_node:
        node = remain_node.pop()
        visited = bfs_visited(ugraph, node)
        cc_set.append(visited)
        remain_node = [item for item in remain_node if item not in visited]
    return cc_set
計算出Connected Components。把相連的node放到一個集合,然後把所有的集合作爲一個列表返回。其中計算remain_node的這種形式是我在python核心編程中學到的,
既可以保持代碼的簡潔易懂,更是保證了高效率。

def largest_cc_size(ugraph):
    cc_set = cc_visited(ugraph)
    try:
        return max([len(item) for item in cc_set])
    except(ValueError):
        return 0
返回相連的node的最大集合的大小,無向圖以最大集合的大小去衡量緊密度(在我要做的作業中),這個模塊使用了上兩個模塊。

def compute_resilience(ugraph, attack_order):
    result = [largest_cc_size(ugraph)]
    ugraph_attack = dict(ugraph)
    for item in attack_order:
        ugraph_attack.pop(item)
        for node in ugraph_attack:
            try:
                ugraph_attack[node].remove(item)
            except(KeyError):
                pass
        result.append(largest_cc_size(ugraph_attack))        
    return result
這個是用來計算無向圖的適應能力。輸入無向圖和一個node的列表,返回的列表中,第一個是攻擊前的CC-Size, 然後依次移除列表中的node後的CC-Size,注意移除時時疊加的。

從CC-Size的變化可以看出這個node在這個圖的重要性。

然後寫幾個模塊測試一下:

def test_bfs():
    for node in UGRAPH10.keys():
        print("start at: %s, bfs-visted: %s" %(node, bfs_visited(UGRAPH10,node)))
        
def test_cc():
    print("cc-visited: %s" %cc_visited(UGRAPH10))
    print("largest-cc-size: %s" %largest_cc_size(UGRAPH10))
    
def test_resilience():
    print("when attack node: %s, the compute_resilience is: %s" \
    %([1,4,5], compute_resilience(UGRAPH10, [1,4,5])))
結果就不貼了。

這些模塊可以用來計算網絡的結構,網絡的受攻擊能力,單個結點的重要性。具體應用下週貼出。

——————————————

github主頁:https://github.com/gt11799 

E-mail:[email protected]




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章