我正在寻找一种高效,快速的方法,并且要牢记一些条件,才能从巨大的无序字典(大约10000个元素)中查找所有可能的无向图循环。
周期必须符合以下标准(停止,时间):
2,4
3,7.5
4,10.5
5、14
6、17
7,20.5
8、24
字典以以下格式表示机场航班:
d = {i: [(j, time), ...]}
其中: i:起点(从0-999唯一) j:下一个停靠点(从0-999开始,每个i和j均不重复,不等于i) 时间:旅行需要多长时间
例如:
d = {
9: [(8, 4.0), (1, 1.5), (0, 3.0), (6, 4.0), (5, 1.5)],
4: [(9, 4.5), (1, 4.0), (5, 1.5)],
7: [(6, 4.0), (10, 5.0), (9, 1.0)],
5: [(9, 1.5), (10, 3.0)]
}
可能的往返行程为9,5,9
我有一个工作代码,可以根据上述标准计算往返行程,但是它仅对少量元素(约100个)快速。
def findRoundtripsHourLimit(graph, start, end, stops=2):
stopMaxHours = {
2: 4,
3: 7.5,
4: 10.5,
5: 14,
6: 17,
7: 20.5,
8: 24
}
trips = [(start, [], 0)]
while trips:
stop, trip, time = trips.pop()
if (len(trip) == stops) and (stop == end) and (time <= stopMaxHours[stops]):
yield trip, time
continue
for t in graph[stop]:
(next_stop, next_time) = t
if next_stop in trip:
continue
trips.append((next_stop, trip+[next_stop], time+next_time))
>>> cycles = [([node]+path, time) for node in dNext for path, time in findRoundtripsHourLimit(dNext, node, node, stops)]
>>> cycles
[([9, 5, 9], 3.0), ([5, 9, 5], 3.0)]