【问题标题】:Given a grid, would best first search jump to a cell across the board if heuristics are better?给定一个网格,如果启发式更好,最好首先搜索跳到一个单元格?
【发布时间】:2012-11-17 20:42:00
【问题描述】:

我目前正在使用 2D 数组来实现 Greedy Best First Search 来表示网格。我现在的实现返回打开的节点。我正在使用优先队列。当我返回遍历的路径/打开的节点并查看节点时,算法似乎会从网格的一侧跳到另一侧。它应该这样做吗?玩家在穿越网格时跳到网格另一侧的单元格是没有意义的,因为那里的启发式更好然后跳回去。 我正在使用这个网格:

这些是所有已经打开的节点的(y,x)坐标(注意是y,x代表一个二维数组):

0,0 Goes across the top of the board
0,1
0,2
0,3
0,4
0,5
1,5 Goes down one cell
1,4 goes left
1,6 goes right 2 spaces
0,6 goes up
1,7 goes down the side of the board
2,7 \/
3,7 \/
4,7 \/
5,7 \/
0,7 jumps up across the board
6,7
1,2 jumps up across the board
2,2
3,2
4,2
3,1
4,1
3,0
2,1
5,2
5,1
4,0
2,0
7,7 jumps up across the board
7,6
7,5
6,5
5,5
5,4
4,4
3,4
3,5

【问题讨论】:

    标签: java algorithm search greedy


    【解决方案1】:

    如果您在将每个节点的父节点添加到优先级队列时跟踪它们,那么您可以将队列视为不仅跟踪节点,还跟踪整个路径段。队列中的每个节点都代表一个可行的路径段,该路径段结束于该节点。

    例如,当您达到 5,7 时,您已经确定这条路径是迄今为止最有希望的:

    (0,0 0,1 0,2 0,3 0,4 0,5 1,5 1,6 1,7 2,7 3,7 4,7) [5,7]
    

    (我将节点放在[brackets] 中,到达该节点的路径放在(parentheses) 中。沿着父链向后产生路径。)

    当 5,7 节点没有成功时,将其所有 5,7 的后继节点添加到队列中,然后从队列中拉出下一个节点。在这一点上,事实证明你没有得到 5,7 的继任者之一。相反,启发式函数决定尝试不同的节点:

    (0,0 0,1 0,2 0,3 0,4 0,5) [0,6]
    

    它尝试了这个,没有达到目标,然后继续。现在回到考虑 5,7 的继任者之一:

    (0,0 0,1 0,2 0,3 0,4 0,5 1,5 1,6 1,7 2,7 3,7 4,7 5,7) [6,7]
    

    等等。

    【讨论】:

    • 您好,感谢您的解释。我将曼哈顿距离和欧几里得距离用于我的贪婪最佳优先搜索的启发式方法,它似乎对两种启发式方法都做了同样的事情。因此,您是说这没问题,即这是 GBFS 的属性吗?我只需要不返回不是最优的其他路径段?当然,在此之后我将继续实施 A*,所以我想确保我首先做到这一点。
    • @JohnathanAu 啊,我读你的问题有点模糊,并推断你在做 A*。如果启发式函数表明路径同样有希望,GBFS 也可以在可能的路径之间跳转。
    • @JohnathanAu 编辑了我的答案以删除对 A* 的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多