我正在学习关于8拼图问题的A *算法。
我没有关于A *的问题,但有一些关于启发式得分 - 尼尔森的序列得分。
Justin Heyes-Jones web pages - A* Algorithm非常清楚地解释了A *。它有一张Nilsson序列分数的图片。
它解释说:
尼尔森的序列得分
中心的瓷砖得分
1
(因为它应该是空的)对于不在中心的每个瓦片,如果顺时针方向的瓦片不是顺时针方向的瓦片,则得分为
2
。将此序列乘以3,最后添加将每个图块移回其正确位置所需的总距离。
我无法理解上面计算分数的步骤。
例如,对于开始状态,h = 17
是什么?
+---+---+---+
| | A | C |
+---+---+---+
| H | B | D |
+---+---+---+
| G | F | E |
+---+---+---+
因此,按照描述,B
位于中心,所以我们得到1
的分数。
然后
对于不在中心的每个标题,如果顺时针方向的瓷砖不是顺时针方向的那个,那么得分为
2
。
我不确定这句话是什么意思。粗体瓷砖是指什么?它所指的粗体是什么?粗体是否指中心标题(本例中为B)?或者它是指不在中心的每个瓷砖?
我们下一步是从A
开始,所以C
不应该顺时针到A
,那么我们得到2
的得分。然后B
应顺时针到A
,然后我们忽略,等等呢?
让我们将方块编号如下:
+---+---+---+
| 0 | 1 | 2 |
+---+---+---+
| 7 | 8 | 3 |
+---+---+---+
| 6 | 5 | 4 |
+---+---+---+
现在,让N(x)
成为瓦片x
的当前平方数。因此,例如,如果瓷砖A
在方形数3
,那么N(A) = 3
。请注意,“平铺”可以位于这些方块中的任何一个中,并且每个方块的数量保持不变(因此左上方的方格将始终为数字0
)。
序列分数由下式给出:
for each tile x in (A, B, C, ..., H)
score += distance from N(x) to the correct square for tile x
if N(x) == 8 # i.e. the tile is in the center
score += 3*1
else if N(next(x)) != (N(x) + 1) % 8
score += 3*2
其中next(x)
将x
带到下一个字母,即next(A) = B, next(B) = C, ... , next(G) = H, next(H) = A
。
所以回答你的具体问题:
(N(x) + 1) % 8
上的tile,即边缘的下一个方块A
给出的。 C
不应该顺时针到A
,然后我们有2
。接下来我们看看C
,D
应顺时针到A
,所以这没关系。看看D, E, F
和G
所有这些都没问题,但是当我们到达H
它不应该接近0,所以我们有一个4
得分。我们加1,因为B
位于中心以获得5
。然后乘以3
得到15
。然后添加1
将B
移动到正确的位置,并且1
将A
移动到正确的位置以获得17
的最终总数。