當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python NetworkX threshold_accepting_tsp用法及代碼示例


本文簡要介紹 networkx.algorithms.approximation.traveling_salesman.threshold_accepting_tsp 的用法。

用法:

threshold_accepting_tsp(G, init_cycle, weight='weight', source=None, threshold=1, move='1-1', max_iterations=10, N_inner=100, alpha=0.1, seed=None)

返回旅行商問題的近似解。

該函數使用閾值接受方法來近似通過節點的最小成本循環。從次優解決方案開始,閾值接受方法會擾亂該解決方案,接受使解決方案不比增加閾值量更差的任何更改。成本的改進是可以接受的,但導致成本小幅增加的變化也是如此。這允許解決方案在解決方案空間中留下次優的局部最小值。隨著迭代的進行,閾值會緩慢降低,以幫助確保最佳狀態。總之,該函數返回一個從source 開始的循環,其中總成本最小化。

參數

G圖形

G 應該是一個完整的加權無向圖。應包括所有節點對之間的距離。

init_cycle列表或“greedy”

初始解決方案(循環所有節點返回起點)。這個論點沒有默認讓你思考。如果“greedy”,請使用greedy_tsp(G, weight)。其他常見的起始周期是 list(G) + [next(iter(G))] 或執行 threshold_accepting_tsp simulated_annealing_tsp 的最終結果。

weight字符串,可選(默認=”weight”)

邊權重對應的邊數據鍵。如果任何邊不具有此屬性,則權重設置為 1。

source節點,可選(默認:列表(G)中的第一個節點)

起始節點。如果沒有,默認為next(iter(G))

thresholdint,可選(默認=1)

算法的閾值參數。它代表初始閾值的值

move“1-1” 或 “1-0” 或函數,可選(默認 =”1-1”)

在尋找新的試驗解決方案時使用什麽移動的指標。字符串表示兩個特殊的內置移動:

  • “1-1”:1-1 交換,它轉置了當前解決方案的兩個元素的位置。調用的函數是 swap_two_nodes() 。例如,如果我們在解決方案A = [3, 2, 1, 4, 3]中應用1-1交換,我們可以通過1和4元素的轉置得到以下內容:A' = [3, 2, 4, 1, 3]
  • “1-0”:1-0 交換,將解決方案中的節點移動到新位置。調用的函數是 move_one_node() 。例如,如果我們在解決方案A = [3, 2, 1, 4, 3] 中應用 1-0 交換,我們可以將第四個元素轉移到第二個位置:A' = [3, 4, 2, 1, 3]

您可以提供自己的函數來製定從一個解決方案到相鄰解決方案的轉變。該函數必須將解作為輸入以及 seed 輸入來控製隨機數生成(請參閱此處的 seed 輸入)。您的函數應該將解決方案維護為一個循環,其中第一個和最後一個節點相等,所有其他節點都出現一次。您的函數應該返回新的解決方案。

max_iterationsint,可選(默認=10)

當外部循環的此數量的連續迭代發生而最佳成本解決方案沒有任何變化時聲明完成。

N_innerint,可選(默認=100)

內循環的迭代次數。

alpha在 (0, 1) 之間浮點數,可選(默認 = 0.1)

當至少有一個鄰居解決方案被接受時,閾值降低的百分比。如果沒有接受內循環移動,則閾值保持不變。

seed整數、random_state 或無(默認)

隨機數生成狀態的指示符。請參閱隨機性。

返回

cycle節點列表

返回推銷員可以遵循的循環(節點列表)以最小化行程的總重量。

拋出

NetworkXError

如果G 未完成,算法將引發異常。

注意

閾值接受是一種元啟發式局部搜索算法。該算法的主要特點是它接受偶數解,從而導致成本增加,以逃避低質量的局部最優解。

該算法需要一個初始解。這個解決方案可以通過一個簡單的貪心算法來構建。在每次迭代中,它都會仔細選擇一個鄰居解決方案。考慮當前解決方案的 成本和鄰居解決方案的 成本。如果 則鄰居解成為下一次迭代的當前解,其中閾值被命名為閾值。

與模擬退火算法相比,閾值接受算法不接受質量非常低的解決方案(由於存在閾值)。在模擬退火的情況下,即使是非常低質量的解決方案也可以以概率 被接受。

時間複雜度:它有一個運行時間 ,其中 分別是外循環和內循環運行的次數。

有關更多信息以及如何啟發算法,請參閱:https://doi.org/10.1016/0021-9991(90)90201-B

例子

>>> from networkx.algorithms import approximation as approx
>>> G = nx.DiGraph()
>>> G.add_weighted_edges_from({
...     ("A", "B", 3), ("A", "C", 17), ("A", "D", 14), ("B", "A", 3),
...     ("B", "C", 12), ("B", "D", 16), ("C", "A", 13),("C", "B", 12),
...     ("C", "D", 4), ("D", "A", 14), ("D", "B", 15), ("D", "C", 2)
... })
>>> cycle = approx.threshold_accepting_tsp(G, "greedy", source="D")
>>> cost = sum(G[n][nbr]["weight"] for n, nbr in nx.utils.pairwise(cycle))
>>> cycle
['D', 'C', 'B', 'A', 'D']
>>> cost
31
>>> incycle = ["D", "B", "A", "C", "D"]
>>> cycle = approx.threshold_accepting_tsp(G, incycle, source="D")
>>> cost = sum(G[n][nbr]["weight"] for n, nbr in nx.utils.pairwise(cycle))
>>> cycle
['D', 'C', 'B', 'A', 'D']
>>> cost
31

相關用法


注:本文由純淨天空篩選整理自networkx.org大神的英文原創作品 networkx.algorithms.approximation.traveling_salesman.threshold_accepting_tsp。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。