给定一个网格,如果启发式更好,最好首先搜索跳到一个单元格?

时间:2012-11-17 20:42:01

标签: java algorithm search greedy

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

这些是已打开的所有节点的(y,x)坐标(注意它是y,x表示2D数组):

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

1 个答案:

答案 0 :(得分: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]

等等。