Python - эффективный и быстрый способ найти все возможные циклы для неориентированного графа - PullRequest
0 голосов
/ 11 апреля 2019

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