有趣的問題,我從來沒有聽說過這個問題,可能是因爲我沒有太多的背景在這個主題中,也沒有太多的經驗與NetworkX。但是,我確實有一個算法的想法。這可能是最簡單的方法,我很樂意聽到一個更聰明的算法。
這個想法是,您可以使用您的限制規則將圖轉換爲所有邊有效的新圖,使用以下算法。
- 如果你離開如果你來的(1,2),然後刪除(2,3)
- :
路徑(1,2,3)的限制,可以在兩種規則被分割(2,3)然後刪除(1,2)
把這個放在圖中,你可以爲每個案例插入節點2的副本。我將在相應情況下的有效邊緣之後調用新節點1_2和2_3。對於這兩個節點,您將所有傳入和傳出邊緣減去限制邊緣。
例如:
Nodes = [1,2,3,4]
Edges = [(1,2),(2,3),(4,2)]
的有效路徑,應僅是4-> 2-> 3不1-> 2-> 3。所以我們展開圖:
Nodes = [1,1_2,2_3,3,4] # insert the two states of 2
Edges = [ # first case: no (1_2,3) because of the restriction
(1,1_2), (4, 1_2)
# 2nd case, no (1,2_3)
(2_3,3), (4,2_3)]
此圖中唯一有效的路徑是4-> 2_3-> 3。這只是在原始圖中映射爲4-> 2-> 3。
我希望這個答案至少可以幫助你,如果你找不到現有的解決方案。更長的限制規則會使狀態節點的數量呈指數級增長,從而導致圖形爆炸,所以要麼這個算法太簡單,要麼很難;-)
我不知道這是否可以在NetworkX內部完成,但是(概念上)簡單的方法是觀察節點1,如果它被使用,則完全刪除節點3。 – Wilduck