Python-查找无向图的所有可能周期的高效快捷方法

时间:2019-04-11 18:51:17

标签: python undirected-graph

我正在寻找一种高效,快速的方法,并且要牢记一些条件,才能从巨大的无序字典(大约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)]

0 个答案:

没有答案