我正在研究几种计算图上最短路径的算法的实现。你知道吗
我已经成功地按顺序实现了Dijkstra的算法,现在我正试图通过Python的多处理模块来优化我的算法。你知道吗
作为一个整体,代码是有效的。我想做的是:
nb_cpu = mp.cpu_count()
处理多少个cpusubprocess_dijkstra
,它作为一个参数给出(其思想是每个进程只需要为图的较小部分计算算法)。你知道吗当我运行脚本时(从主.py文件中,我只是格式化的数据,以满足我的需要),我有4个进程启动,因为我应该。你知道吗
但是,它们似乎没有执行for node in nodes
中定义的subprocess_dijkstra
循环。你知道吗
每个进程只计算一次代码,然后它们无限期地等待。。。你知道吗
这是我第一次尝试在Python下进行多处理,所以我可能错过了一个细节。有人有主意吗?你知道吗
当我中断脚本时,python告诉我中断发生在p.join()
行。你知道吗
感谢所有帮助我的人:)
这是我的密码:
import multiprocessing as mp
def subprocess_dijkstra(do_print, nodes, tab_contenu, tab_distances):
tab_dist_initial = dict(tab_distances)
tab_dist = dict()
for node in nodes:
visited_nodes = list()
tab_dist = dict(tab_dist_initial)
dmin = -1
resultat = ""
filename = "dijkstra"+str(node)+".txt"
if do_print:
dt = open(filename, 'w')
tab_dist[node] = 0
"""Ligne de résultat initiale"""
for valeur in tab_dist.values():
resultat += str(valeur)
resultat += " "
resultat += "\n"
dt.write(resultat)
while len(visited_nodes) != len(tab_contenu):
""" On se place sur le noeud non visité qui a la distance minimale de notre départ """
for cle, valeur in tab_dist.items():
if cle not in visited_nodes:
if dmin ==-1 or valeur<dmin:
dmin = valeur
node = cle
""" On vérifie que le noeud n'a pas déjà été visité """
if (node not in visited_nodes):
""" On regarde les fils de ce noeud et la longueur des arcs"""
for cle,valeur in tab_contenu[node].items():
tab_dist[cle] = min(tab_dist[cle], tab_dist[node]+valeur)
visited_nodes.append(node)
if do_print:
resultat = ""
""" Ligne de résultat """
for valeur in tab_dist.values():
resultat += str(valeur)
resultat += " "
resultat += "\n"
dt.write(resultat)
if do_print:
dt.close()
def main(do_print,donnees):
tab_contenu = donnees[1]
nb_nodes = int(donnees[0])
tab_distances = {x: float('inf') for x in range(nb_nodes)}
args=[(do_print, x, tab_contenu, tab_distances) for x in range(nb_nodes)]
nb_cpu = mp.cpu_count()
pool = mp.Pool(processes = nb_cpu)
pool.starmap(subprocess_dijkstra, args)
pool.close()
pool.join()
我找到了问题的根源。你知道吗
tab_dist[node] = 0
放错了位置,应该放在if do_print:
语句之前。你知道吗现在一切正常。你知道吗
相关问题 更多 >
编程相关推荐