gpt4 book ai didi

python - 改进广度优先搜索,找到图中最高分离度的搜索

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:15 25 4
gpt4 key购买 nike

输入图:我有一个字典,它表示一个有向图,其中键是一个节点,值是它指向的节点。

输入英雄:所有节点的集合

该方法用于查找所有节点组合之间的最大分离度。

def largestDegreeOfSeparation(graph, heroes):
q = deque()
currentHighestDoS = 0
DoS = 0
for hero in heroes:
path = (hero,)
q.append(path)
visited = set([hero])
while q:
path = q.popleft()
last_node = path[-1]
for node in graph[last_node]:
if node not in visited:
visited.add(node)
q.append(path + (node,))
DoS = len(path) - 1
if DoS > currentHighestDoS:
currentHighestDoS = DoS
currentHero = path[0]
currentHerosDestination = last_node
print str(currentHero) + '\t' + str(path) + '\t' + str(currentHighestDoS)

这个程序找到了 4 的分离度,然后是 5,然后它就继续运行,我认为是因为它花费的时间太长了。有没有办法让这个方法运行得更快?

最佳答案

您可以创建一个 numpy (np) 数组,其中包含每个英雄的位置,其存储顺序与包含英雄对象的另一个数组相同。假设你有英雄坐标:

 pos_heros   = np.array( [hero.coordinates for hero in heros], dtype='float64' )
array_heros = np.array( [hero for hero in heros], dtype = object )

然后计算距离矩阵:

 dist  = np.subtract.outer( pos_heros[:,0], pos_heros[:,0] )**2
dist += np.subtract.outer( pos_heros[:,1], pos_heros[:,1] )**2
dist += np.subtract.outer( pos_heros[:,2], pos_heros[:,2] )**2

现在,您将通过获取对距离矩阵进行排序的索引来找到每个最近的英雄:

 a = np.argsort( dist, axis=1 )

可以使用np.take高效获取排序后的pos_heros矩阵:

 matrix_heros = np.take( array_heros, a )

matrix_heros 中的每一行都代表一个英雄,第一列将是第一个最接近的英雄,第二列是第二个英雄,依此类推...

例如,要获取距离第 10 列英雄最近的第一个和第二个英雄:

 matrix_heros[9,0]  # 9--> hero    0-->  first closest hero
matrix_heros[9,1] # 9--> hero 1--> second closest hero

去寻找你想要的,最遥远的英雄:

 ans = matrix_heros[:,-1]

ans 将按照您创建 array_heros 的顺序包含最远的英雄。

关于python - 改进广度优先搜索,找到图中最高分离度的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com