代码之家  ›  专栏  ›  技术社区  ›  R A

python中的BFS实现速度不够快

  •  1
  • R A  · 技术社区  · 7 年前

    我正在尝试加快BFS算法的速度,它可以解决尖峰时刻的游戏。我为算法提供了一个父电路板,我想知道我的BFS算法的实现或我从算法调用的代码中使用的构建块是否应该更改。

    这是目前的BFS算法:

    def start_bfs(start_grid):
    vehicle_dict = dict()
    queue = deque()
    queue.append(pd.DataFrame(start_grid))
    while queue:
        vehicle_dict.clear()
        df_grid = queue.pop()
        vehicle_dict = set_up(vehicle_dict,df_grid)
        for key, value in vehicle_dict.iteritems():
            check_adjecent(key, value, vehicle_dict)
            movelist, object_location, direction = get_movelist(key, value, vehicle_dict, df_grid)
            if not movelist:
                continue
            while movelist:
                    node = movelist.pop(0)
                    new_vehicle_dict = move(node, copy.deepcopy(vehicle_dict), df_grid)
                    child_df_grid = create_board(new_vehicle_dict)
                    if not True in [child_df_grid.equals(x) for x in archive]:
                        check_goal(node[1], new_vehicle_dict, archive, df_grid, child_df_grid) 
                        queue.append(copy.deepcopy(child_df_grid))
                        archive.append(copy.deepcopy(child_df_grid))
            archive.append(copy.deepcopy(df_grid))
    

    例如,起始网格如下所示:

     start_grid = [['.', '.', 'T', 'F', 'F', 'E'],
             ['.', '.', 'T', '.', '.', 'E'],
             ['.', '.', 'T', 'R', 'R', 'E'],
             ['.', '.', '.', 'C', '.', '.'],
             ['A', 'B', 'B', 'C', '.', '.'],
             ['A', '.', '.', 'C', 'H', 'H']]
    

    这里有没有什么我天生就做错的事?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dennis Soemers    7 年前

    做你的 set_up(vehicle_dict,df_grid) , get_movelist(key, value, vehicle_dict, df_grid) ,和/或 move(node, copy.deepcopy(vehicle_dict), df_grid) 修改 df_grid 传给他们了?如果没有,我高度怀疑你正在做的许多深度复制是必要的。您可能需要仔细检查以确保自己,但我认为以下几行不需要所有这些深度副本:

    • queue.append(copy.deepcopy(child_df_grid))
    • archive.append(copy.deepcopy(child_df_grid))
    • archive.append(copy.deepcopy(df_grid))

    我想你也可以搬家 档案文件追加(复制.深度复制(df\U网格)) 之前 while循环,以便您可以立即放弃不做任何操作的移动。

    在使用前检查是否见过电路板

    if not True in [child_df_grid.equals(x) for x in archive]: 
    

    也似乎效率低下。什么样的物体 archive 无论如何我建议使用 set ( 列表!)。如果您的电路板表示为 pd.DataFrame 但是(乍一看这里似乎过于复杂了,而没有看到其他函数是如何实现的)。一个包含数据的简单自定义类 correctly implemented __eq__ __hash__ 功能(set所需)可能会更好。然后,您可以使用以下工具有效地检查是否有真正的新内容:

    if not child_df_grid in archive: