ruta más corta desde el objetivo hasta la raíz en el gráfico dirigido con ciclos python
Frecuentes
Visto 345 veces
0
Quiero encontrar el camino más corto desde goal
a root
trabajando al revés
mi entrada para root
is {'4345092': ['6570646', '40586', '484']}
mi entrada para goal
is {'886619': ['GOAL']}
mi entrada para path_holder
es una entrada pero se convierte en dct
y se utiliza para esta función. Me estoy quedando atascado con respecto al ciclo while, ya que crea el camino hacia atrás para mí. ahora mismo no puedo conseguir q
para imprimir porque esa parte del código no se está ejecutando. dct
es básicamente una representación gráfica dirigida que contiene ciclos. Parece que no puedo averiguar cómo empezar desde GOAL
y terminar en el root
nodo. Me preguntaba si alguien podría ayudarme a resolver esto, ¡gracias!
dct:
dct =
{ '612803266': ['12408765', '46589', '5880', '31848'],
'8140983': ['7922972', '56008'],
'7496838': ['612803266'],
'1558536111': ['7496838'],
'31848': ['DEADEND'],
'1910530': ['8140983'],
'242010': ['58644', '886619'],
'727315568': ['DEADEND'],
'12408765': ['DEADEND'],
'56008': ['DEADEND'],
'58644': ['DEADEND'],
'886619': ['GOAL'],
'40586': ['931', '727315568', '242010', '1910530'],
'5880': ['1558536111'],
'46589': ['DEADEND'],
'6570646': ['2549003','43045', '13830'],
'931': ['299159122'],
'484': ['1311310', '612803266'],
'1311310': ['DEADEND'],
'7922972': ['DEADEND']
}
mi función:
def backtrace(path_holder, root, goal):
dct = {}
for d in path_holder:
dct.update(d)
rootnode = root.keys()[0]
goal = goal.keys()[0]
path = []
path.append(goal)
q = 0
while goal != rootnode:
# find key that contains goal in list
for i in dct: #iterate keys
if i in dct: # prevent repeat of path
continue
for j in dct[i]: #iterate though children
if j == goal:
path.append(i)
goal = i # look for new goal
q += 1
print q
#print goal
# append key that has goal in the list
# set goal to be the key that was appended
# repeat
return path
1 Respuestas
1
Solo encuentra los caminos y luego inviértelos.
ACTUALIZADO: Se agregó "[]" a "DEADEND" y "GOAL" en las condiciones finales.
import copy as cp
DCT = {...} # You already know what goes here.
FOUND_PATHS = [] # In case of more than one path to GOAL.
FOUND_REVERSE_PATHS = []
COUNTER = len(DCT)
def back_track(root, target_path = [], counter=COUNTER):
"""
@param root: DCT key.
@type root: str.
@param target_path: Reference to the path we are constructing.
@type target_path: list.
"""
global FOUND_PATHS
# Avoiding cycles.
if counter == 0:
return
# Some nodes aren't full generated.
try:
DCT[root]
except KeyError:
return
# End condition.
if DCT[root] == ['DEADEND']:
return
# Path found.
if DCT[root] == ['GOAL']:
FOUND_PATHS.append(target_path) # The normal path.
reverse_path = cp.copy(target_path)
reverse_path.reverse()
FOUND_REVERSE_PATHS.append(reverse_path) # The path you want.
return
for node in DCT[root]:
# Makes copy of target parh and add the node.
path_copy = cp.copy(target_path)
path_copy.append(node)
# Call back_track with current node and the copy
# of target_path.
back_track(node, path_copy, counter=(counter - 1))
if __name__ == '__main__':
back_track('4345092')
print(FOUND_PATHS)
print(FOUND_REVERSE_PATHS)
Respondido el 03 de diciembre de 13 a las 16:12
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python algorithm python-2.7 shortest-path or haz tu propia pregunta.
Pero, ¿será el camino más corto? - bailarín del león
No importa, creo que sí porque utilicé la primera búsqueda de Amplitud para generar el gráfico. Así que debería ser el camino más corto - bailarín del león
La ruta más corta es la lista más corta en FOUND_PATH o FOUND_REVERSE_PATHS - Raydel Miranda
Intenté compilar tu código y ocurre este error.
if DCT[root] == 'DEADEND': TypeError: unhashable type: 'dict'
- bailarín del leónEl valor que debe pasar como argumento raíz es la clave del dict que representa la raíz de su gráfico. Significado: si su raíz es {'4345092': ['6570646', '40586', '484']} el argumento raíz será '4345092'. - Raydel Miranda