Python最短路径2点之间

时间:2014-01-17 02:10:03

标签: python artificial-intelligence

我发现很多算法和方法都在讨论找到2点之间的最短路径,但我有这种情况,数据被建模为:

[(A,B),(C,D),(B,C),(D,E)...] # list of possible paths

如果我们假设我需要从A到E的路径,结果应为:

(A,B)=>(B,C)=>(C,D)=>(D,E)

但我无法找到进行此搜索的pythonic方法。

3 个答案:

答案 0 :(得分:6)

Pythonic方法是使用模块(如果存在)。在这种情况下,我们知道,networkx在那里,我们可以写

<强>实施

import networkx as nx
G = nx.Graph([('A','B'),('C','D'),('B','C'),('D','E')])
path = nx.shortest_path(G, 'A', 'E')

<强>输出

zip(path, path[1:])
[('A', 'B'), ('B', 'C'), ('C', 'D'), ('D', 'E')]

答案 1 :(得分:0)

如果您将点视为图形中的顶点,将对作为该图形中的边,则可以为边缘图边指定一个等于点之间距离的权重。

以这种方式框架,您的问题只是经典的shortest path problem

你要求用Pythonic的方法来编写它。我给出的唯一建议是将图表表示为字典,以便每个键都是一个点,返回的值是从该点直接可以到达的其他点的列表。这将使图表更快地遍历。 graph[C] -> [B, D]为您的例子。

答案 2 :(得分:0)

以下是使用A *的解决方案:

pip install pyformulas==0.2.8

import pyformulas as pf

transitions = [('A', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'F'), ('D', 'F'), ('F', 'D'), ('F', 'B'), ('D', 'E'), ('E', 'C')]

initial_state = ('A',)

def expansion_fn(state):
    valid_transitions = [tn for tn in transitions if tn[0] == state[-1]]
    step_costs = [1 for t in valid_transitions]

    return valid_transitions, step_costs

def goal_fn(state):
    return state[-1] == 'E'

path = pf.discrete_search(initial_state, expansion_fn, goal_fn) # A*
print(path)

输出:

[('A',), ('A', 'B'), ('B', 'C'), ('C', 'F'), ('F', 'D'), ('D', 'E')]