我发现很多算法和方法都在讨论找到2点之间的最短路径,但我有这种情况,数据被建模为:
[(A,B),(C,D),(B,C),(D,E)...] # list of possible paths
如果我们假设我需要从A到E的路径,结果应为:
(A,B)=>(B,C)=>(C,D)=>(D,E)
但我无法找到进行此搜索的pythonic方法。
答案 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')]