python中的BFS实现不够快

时间:2018-02-20 10:06:15

标签: python algorithm breadth-first-search

我正在尝试加速我的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 个答案:

答案 0 :(得分:1)

您的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))

我认为你也可以在 while循环之前将archive.append(copy.deepcopy(df_grid))移动到,这样你就可以立即丢弃什么都不做的动作。

在使用

之前检查您是否看过电路板
if not True in [child_df_grid.equals(x) for x in archive]: 

似乎也效率低下。无论如何,archive是什么类型的对象?我建议使用set列表!)。如果您的电路板表示为pd.DataFrame,那么这可能无法正常工作(乍一看似乎有点过于复杂,而没有看到您的其他功能是如何实现的)。包含correctly implemented __eq____hash__函数(设置所需)的简单自定义类可能会更好。然后,您可以使用以下方法有效地检查某些内容是否真的是新的:

if not child_df_grid in archive: