簡體   English   中英

在嵌套列表 python 中查找所有可能的插入組合

[英]Finding all possible combinations of insertions in nested list python

對於車輛路線問題,我需要檢查具有多條路線的某個列表,插入某個城市對該路線列表的總長度會產生什么影響。 所有城市都由 integer 數字表示。

基本上我需要在每個可能的“位置”中插入一個 integer 元素,然后繼續計算所有可能性的最短距離。 考慮這個嵌套的路由列表:

rl = [[0, 7, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0],
[0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]] 

其中 0 是總部,這里是每天路線的起點和終點。 假設我需要插入一個由 9 表示的城市。

預期的 output 將比:

[[0, 9, 7, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], ...rest of list] 
[[0, 7, 9, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], ...rest of list] 
[[0, 7, 40, 9  41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], ...rest of list] 
[[0, 7, 40, 41, 9  96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], ...rest of list]

以此類推,直到每個可能的位置都已嘗試並附加到可行矩陣。

我寫了以下 function 來實現這一點:

def check_possible_insertions(city, route_list):
    feasible_matrix = []
    for i, route in enumerate(route_list):
        for j, value in enumerate(route[1:]):
            possibility = route_list.copy()
            possibility[i].insert(j+1, city)
            feasible_matrix.append(possibility)
    return feasible_matrix

我首先創建一個“可行”矩陣,然后遍歷所有路線。 然后,對於路由中的每個可能的 position(第二個 for 循環),我創建了 route_list 的副本(作為參數傳遞的原始路由列表)。 然后我將城市插入正確的路線 [i] 在正確的位置 (j) 和 append 的可能性到我的可行矩陣。

至少,這就是我認為這段代碼應該如何工作的方式。 一個 function 調用check_possible_insertions(9, rl)告訴我代碼的行為不像預期的那樣:它只是在每條路線的前面插入#j 個 9。 我正在俯瞰某些東西,但無法弄清楚是什么。 我究竟做錯了什么?

您只是淺復制整個列表列表。 你的意思是淺拷貝一個單獨的路線:

possibility = route.copy()
possibility.insert(j, city)

同樣在您的內部循環value未使用,因此您的 function 的可能版本是:

def check_possible_insertions(city, route_list):
    feasible_matrix = []
    for i, route in enumerate(route_list):
        new_list=[]
        feasible_matrix.append(new_list)
        for j in range(1, len(route)):
            possibility = route.copy()
            possibility.insert(j, city)
            new_list.append(possibility)
    return feasible_matrix

這會生成一個路線列表列表,當找到最佳路線時,可以將其縮減為新的rl 例如:

rl = [[0, 7, 40, 78, 0],
[0, 56, 45, 2, 0],
[0, 35, 97, 60, 0]]

result = check_possible_insertions(9,rl)
print(result)

Output:

[[[0, 9, 7, 40, 78, 0], [0, 7, 9, 40, 78, 0], [0, 7, 40, 9, 78, 0], [0, 7, 40, 78, 9, 0]], [[0, 9, 56, 45, 2, 0], [0, 56, 9, 45, 2, 0], [0, 56, 45, 9, 2, 0], [0, 56, 45, 2, 9, 0]], [[0, 9, 35, 97, 60, 0], [0, 35, 9, 97, 60, 0], [0, 35, 97, 9, 60, 0], [0, 35, 97, 60, 9, 0]]]

問題是route_list.copy()創建了一個淺拷貝,內部列表是相同的對象,例如:

rl = [[0, 7, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0],
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0],
[0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]]

cp = rl.copy()
cp[0].insert(0, 9)

for i in rl:
print(i)

Output

[9, 0, 7, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0]
[0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0]
[0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]

如您所見, rl的第一個列表已修改,因為它與cp中的第一個相同。

作為解決方案,您可以使用 deepcopy

import copy


def check_possible_insertions(city, route_list):
    feasible_matrix = []
    for i, route in enumerate(route_list):
        for j, value in enumerate(route[1:]):
            possibility = copy.deepcopy(route_list)
            possibility[i].insert(j+1, city)
            feasible_matrix.append(possibility)
    return feasible_matrix

Output (前 5 個結果)

[[0, 9, 7, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0], [0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]]
[[0, 7, 9, 40, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0], [0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]]
[[0, 7, 40, 9, 41, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0], [0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]]
[[0, 7, 40, 41, 9, 96, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0], [0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]]
[[0, 7, 40, 41, 96, 9, 34, 75, 127, 48, 65, 79, 27, 126, 78, 0], [0, 56, 45, 2, 67, 66, 59, 124, 82, 133, 102, 54, 57, 0], [0, 35, 97, 81, 87, 80, 61, 98, 101, 52, 83, 60, 109, 39, 53, 0]]

暫無
暫無

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

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