簡體   English   中英

修改的最短路徑算法 - 頂點有點

[英]Modified shortest path algorithm - vertices have points

現在我有一個無向圖。 每條邊表示頂點之間的距離。 每個頂點都包含一個數字(讓我們稱之為點數)。 我想在使用最小距離時獲得最大點數。 我對最大距離有約束,因此我不需要到達每個頂點。 我可以從任何頂點開始並在任何頂點結束(我不需要回到原點)。

現在我認為通過動態編程可以實現,但我不完全確定如何設置問題。

任何有關如何設置/正確的算法使用的幫助將不勝感激!

我認為一個好方法可能是在圖上構建最小生成樹。 之后你可以選擇一個根節點(選擇是我自己的算法/啟發式算法)並遍歷樹。 然而,這可能不是最佳解決方案,因為我認為問題是NP完成。 或者,您可以嘗試搜索TSP(旅行商問題)的解決方案算法,並提取獲得最多積分的路徑。

使用遞歸函數 ,您可以迭代點,並使用第一個點連接的每個點執行相同的函數,依此類推。

pts = [[(1,8), (2,5), (3,6)...]...] //each sublist of points needs to be sorted by the second index in each value contained
paths = []
def Branch(history, distance):
  for index, dist in pts[history[-1]][1:tree_branches_per_iteration]: //make the shorter distances go first
    if not index in history: //check for repetition
      new_distance = distance + dist
      if new_distance > limit: //check for distance limit
        paths.append((history + [index], new_distance))
      else:
        Branch(history + [index], new_distance)
    else:
      paths.append((history, distance))

Branch([0], 0)

此函數調用自身,在所有可能的方向上組裝點鏈(並且不會兩次到達同一點),並在它到達相同點兩次或達到距離限制時終止。

通過基本上制作從每個坐標到彼此的所有距離的矩陣來生成距離。

這種方法使用貪婪的銷售人員。

所以在這次經歷之后,我發現你應該研究蟻群算法並將其應用於旅行商問題。 您也可以使用修改后的貪婪算法,該方法從隨機點開始,並根據給您最佳點的位置選擇基於隨機雙方骰子的下一個位置。 然后,您可以進一步修改算法以存儲先前的結果並迭代以獲得更好的結果。

暫無
暫無

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

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