Я ищу эффективный и быстрый способ найти все возможные неориентированные циклы графа из огромного неупорядоченного словаря (около 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)]