簡體   English   中英

遍歷圖中所有邊的算法

[英]Algorithm to traverse all edges in a graph

作為個人復活節項目,我正在嘗試在工作中實施一些基於模型的測試。 我在 python 中實現了一個圖,我需要遍歷所有邊/進行圖的所有轉換,至少一次。 遍歷一條邊兩次或更多次並不重要,但我需要在同一個節點開始和結束並返回一系列邊/轉換。

更簡單的算法 > 最短序列。

我環顧四周,發現了很多算法,但找不到適合我的算法/組合。 如果有人能指出正確的方向或給我一些如何做到這一點的提示,那就太好了。

我的圖表實現如下所示:

graph = {
    A : {'IDLE': 't8', 'B': 't2', 'C': 't4'},
    B : {'A': 't3', 'C': 't4', 'IDLE': 't6'},
    C : {'A': 't5', 'IDLE': 't7', 'B': 't2'},
    IDLE : {'A': 't1'}
}

圖形

方法一

您可以將圖 G 更改為新圖 G',其中 G 中的每條邊都成為 G' 中的一個節點。 如果“A -> t1 -> B -> t2 -> C”對於某些 A、B 和 C 在 G 中是可能的,則在 G' 中創建一條從 t1 到 t2 的邊。

然后你需要在G'中找到一個路徑覆蓋

方法二

  • 您的 position P 最初是某個節點 P0(例如空閑)。
  • 對於每條邊 T(從 A 到 B),找到從 P 到 A 的任何路由,然后使用 T 到 go 到 B。將 P 更新為 B。
  • 最后找到從 P 回到 P0 的任何路徑。

此問題與旅行商問題不同。 相反,它被稱為中文 Postman 問題。 最大的區別是TSP要訪問所有節點(城市),而CPP要訪問所有邊(街道)。

可以在這里找到一個完美的教程: https://www.datacamp.com/community/tutorials.networkx-python-graph-tutorial

對於圖中的每個 P1、P2 點,找到所有 R 條道路,其中 R 如下所示:

R = (P1, Pf1, ..., Pfn, P2)

對於從 P1 到 P2 的每條 R1、R2 道路,如果 Intersection(R1, R2) 的點數大於 0(當然 P1 和 P2 除外),則確定哪個更短。 如果 R1 的長度小於 R2 的長度則忽略 R2,否則忽略 R1。

在迭代中,您將找到從 P1 到 P2 的最短的完全獨立的道路。 如果你想穿越一條路,你有點 (P1, ..., Pk) 如果我們選擇 Pi,其中 1<= i <= k,我們知道第一個點是 Pi,最后一個點是也是Pi。

假設順序無關緊要。 每當您遍歷一個點時,將其標記為已遍歷。 如果某個點被標記為已遍歷,您將不想再次 go 到給定點,但如果有必要,您也不會介意再次遍歷該點。 因此,規划的道路將是:Pf1, ..., Pfk, Pf1。

對於每個 Pfj、Pfm:

這一刻我們在 Pfj。 如果Pfm被遍歷那么我們不想go再到Pfm,所以我們go到下一次迭代

如果不遍歷 Pfm,我們有 R1, ..., Rq 路從 Pfj 到 Pfm。 選擇具有最大未遍歷點數和最小已遍歷點數的道路。 你需要通過一個聰明的想法來權衡道路中一個未遍歷的點和一個已遍歷的點的重要性(希望你的權重將最小化你從 Pf1 到 Pf1 的道路總長度)。

請注意,不應將 Pf1 標記為已遍歷,因為您希望在算法結束時到達那里。

我不確定您是想要算法還是想知道如何完成工作。 如果是后者,則可以使用networkx

下載並安裝 .networkx 后,您可以嘗試以下操作

>>> import networkx as nx
>>> DG=nx.DiGraph()
>>> def CycleFrom(G,node):
    return sorted((c for c in nx.simple_cycles(DG) if node in c), key=len)[0]

>>> for (stnode, edges) in graph.items():
    for (ennode,edge) in edges.items():
        DG.add_edge(stnode,ennode,name=edge)


>>> for node in DG.nodes():
    print "Cycles from {0} is {1}".format(node,CycleFrom(DG,node))


Cycles from A is ['A', 'IDLE', 'A']
Cycles from IDLE is ['A', 'IDLE', 'A']
Cycles from B is ['A', 'B', 'A']
Cycles from C is ['A', 'C', 'A']
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM