2017-10-09 64 views
1

這似乎是一個簡單的問題,但實際上將它實現到代碼中給我帶來了很多麻煩。我正在尋找在Python中編寫循環遍歷所有可能的長度爲L的不同路徑。使用給定的開始點和結束點生成所有路徑

該路徑中的第一個節點必須爲0,最後一個節點必須是整數n - 1。第一個節點和最後一個節點之間的每個節點可以是[0 , n-1]中的任何整數,但必須與其之前的一個節點以及其後的一個節點不同。

n可以是任何[2, 7]整數,L可以是任意整數> = 3

例如,如果n = 4L = 3,環路應該通過

[ 0, 1, 3] 
[ 0, 2, 3] 

迭代對於n = 4,和L = 4循環應該迭代通過

[ 0, 1, 0, 3] 
[ 0, 1, 2, 3] 
[ 0, 2, 0, 3] 
[ 0, 2, 1, 3] 
[ 0, 3, 0, 3] 
[ 0, 3, 1, 3] 
[ 0, 3, 2, 3] 

我想要生成此路徑的過程如下。

  1. 遍歷所有數字0到(n - 1)^(L-3)
  2. 轉換這些數字到基座n - 1
  3. 轉換回一個字符串,追加0至左側,直至它是長度L - 3的。
  4. 對於這些數字中的每一個,遍歷所有數字[0, n-2]並將這些數字追加到右邊。把這些我們path_ids
  5. 先從第一個節點的新路徑[0]
  6. 對於在path_id每個數字,但最後創建列表x = range(n),刪除一個節點,從x路徑,並追加x[ digit]到您的路徑
  7. 對於路徑ID中的最後一位數字創建x = range(n)刪除路徑中的最後一個節點,並從x中刪除n-1,將x[ digit]附加到您的路徑。
  8. n-1附加到路徑的末尾。

對於我的問題,這看起來像是一個非常複雜的過程,最終可能導致我的代碼變慢,導致它無法使用。我正在尋找一種簡單的方法來做到這一點。這個過程將在所有可能的路徑長度的迭代之內,並且我將遍歷每個生成的路徑並檢查它是否符合某些條件,如果是,我將存儲它。然後,我將遍歷每條滿足這些條件的路徑,並檢查其他條件以獲取最佳條件。可能會有很多'最好'的路徑,所以我必須對它們進行排序。正如你可以想象的那樣,低效地編寫這個函數會極大地減慢我的整個程序。

對於屠宰格式我很抱歉,我一直在潛伏,但這是我問自己的第一個問題。

+1

你嘗試過什麼碼? – APerson

+0

'但實際上將它實現爲代碼給我帶來了很多麻煩'你試過了什麼,你面臨什麼麻煩?這太寬泛了,沒有人會提交你的代碼。 –

+0

@greenkraken您是否可以將您的代碼/策略編輯到您的問題中,而不是將它放入評論中,因此更容易提供幫助? – APerson

回答

0

你想要itertools.product(range(n-1), repeat=L-2)。然後計算每個組合模塊n(從1開始)的累計和。這樣可以避免所有重複內容,只是在最後檢查完畢後才能檢查。

(我看到這個建議時,提問者想不重複的隨機數,但它工作在這裏。我會發佈一個鏈接,如果我能再次找到它。)

相關問題