我想从发现的最短路径goal来root工作向后
goal
root
我的输入root是{'4345092': ['6570646', '40586', '484']} 我输入goalIS{'886619': ['GOAL']}
{'4345092': ['6570646', '40586', '484']}
{'886619': ['GOAL']}
我的输入path_holder是输入,但它被转换为dct并用于此功能。我对while循环感到困惑,因为它为我创建了向后的路径。现在我无法q打印,因为那部分代码没有被执行。dct基本上是包含循环的有向图表示形式。我似乎无法弄清楚如何从节点开始GOAL和结束root。我想知道是否有人可以帮助我解决这个问题!
path_holder
dct
q
GOAL
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'] }
我的功能:
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
只需找到路径,然后将其反转即可。
更新: 在结束条件中,将“ []”添加到“ DEADEND”和“ GOAL”中。
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)