例如,如果您有以下状态:
6 3 9
8 7 5
1 2 4
如果你将左上方的2x2正方形向顺时针方向旋转,你会得到
8 6 9
7 3 5
1 2 4
我正在使用A*搜索算法寻找最优解。我的f()函数只是需要进行的旋转次数。我的启发式函数已经能够得出最优解(如果我进行修改,请参见结尾的提示),但我认为这不是可以找到的最好的启发式函数。我的当前启发式函数对于每个角落,查看角落处的数字并计算它与在解决状态下此数字将拥有的位置之间的曼哈顿距离(这告诉我旋转该数字以使其到达此位置所需的次数),然后将所有这些值相加。例如,您可以考虑上面的例子:
6 3 9
8 7 5
1 2 4
并且这是最终状态。
1 2 3
4 5 6
7 8 9
然后启发式算法执行以下操作
6 is currently at index 0 and should by at index 5: 3 rotations needed
9 is currently at index 2 and should by at index 8: 2 rotations needed
1 is currently at index 6 and should by at index 0: 2 rotations needed
4 is currently at index 8 and should by at index 3: 3 rotations needed
h = 3 + 2 + 2 + 3 = 10
此外,如果 h 为0,但状态并非完全有序,则 h=1。
但是有一个问题,你每次会旋转4个元素。因此,有些情况下,你可以在一次移动中进行两个(或更多)估计旋转。这意味着这些启发式方法会高估到达解决方案的距离。
我的当前解决方式是,从计算中简单地排除一个角落,这至少解决了我的测试用例中的问题。我没有研究过是否真正解决了问题,或者这个启发式方法在某些边缘情况下仍然会高估。
因此,我的问题是:你能想出最好的启发式方法吗?
(免责声明:这是为大学项目而做的作业。但是,如果我能得到任何资源,我可以自由使用它们,所以向你们提问是可以的。此外,我将感谢 Stackoverflow 帮助我 ;) )