Można znaleźć odpowiednie docs tutaj :)
Simple Paths in NetworkX
zasadzie to tylko wyszukiwarka drzewo jakiegoś
można użyć list of nodes i zrobić
list_of_nodes = nodes(my_graph)
for mysource in list_of_nodes:
for mytarget in list_of_nodes:
if source != target:
print all_simple_paths(my_graph,source=mysource,target=mytarget, cutoff=4)
Jeśli chcesz wszystkie najkrótsze ścieżki o długości 4, możesz użyć ``all_pairs_shortest_path_```
paths = all_pairs_shortest_path(my_graph,cutoff=4)
for k,v in paths:
if len(paths[k][v]) == 4:
print paths[k][v]
Nie ma prawdziwego polecenia wbudowanego w celu wygenerowania wszystkich prostych ścieżek o określonej długości, ponieważ jedynym sposobem znalezienia jest wygenerowanie drzewa z każdego węzła, np. robi zmodyfikowaną wersję mojej pętli for powyżej, ponieważ używa zmodyfikowanego pierwszego wyszukiwania głębi.
"Droga bez powtarzających się wierzchołków nazywany jest prosta ścieżka" - Wikipedia
Jeśli chcieliby Państwo paper citation. Jedynym sposobem sprawdzenia prostych ścieżek jest sprawdzenie z każdego węzła. Jeśli masz wykres z 90000 elementów; nie ma innego sposobu sprawdzenia, czy dwa łączą się: /. "Cel" nie jest tak naprawdę konsekwencją, ponieważ jest tylko kolejnym punktem odcięcia, ale jeśli masz dużą liczbę węzłów, to może to coś zmienić, więc jesteś na miejscu :).
" def _all_simple_paths_graph(G, source, target, cutoff=None):
if cutoff < 1:
return
visited = [source]
stack = [iter(G[source])]
while stack:
children = stack[-1]
child = next(children, None)
if child is None:
stack.pop()
visited.pop()
elif len(visited) < cutoff:
if child == target:
yield visited + [target]
elif child not in visited:
visited.append(child)
stack.append(iter(G[child]))
else: #len(visited) == cutoff:
if child == target or target in children:
yield visited + [target]
stack.pop()
visited.pop()"
powyższy kod z networkx docs
zmodyfikować go w celu wygenerowania DFS bez 'docelowej' odcięcia można użyć:
def _all_simple_paths_graph(G, source, target, cutoff=None):
if cutoff < 1:
return
visited = [source]
stack = [iter(G[source])]
while stack:
children = stack[-1]
child = next(children, None)
if child is None:
stack.pop()
visited.pop()
elif len(visited) < cutoff:
#if child == target:
# yield visited + [target]
#elif child not in visited:
if child not in visited:
visited.append(child)
stack.append(iter(G[child]))
#else: #len(visited) == cutoff:
#if child == target or target in children:
# yield visited + [target]
#stack.pop()
#visited.pop()
nadzieja, że pracuje dla Ciebie:)
Czy "znajdź wszystkie proste ścieżki o długości 4" należy czytać jako "znajdź wszystkie ścieżki najkrótsze między węzłami i o długości 4"? – denz