我在尝试编写8数码解谜程序,但还没有成功:我使用曼哈顿优先级函数,我在想,如果两个后续棋盘排列的优先级值相同,如何在它们之间做出选择。
例如:
这是初始棋盘排列:
8 1 3 4 2 7 6 5
以及它的后续棋盘排列:
I 8 1 3 4 6 2 7 5
曼哈顿距离 + 移动次数 = 10
II 8 3 4 1 2 7 6 5
曼哈顿距离 + 移动次数 = 12
III 8 1 3 4 2 7 6 5
曼哈顿距离 + 移动次数 = 10
程序应该选择哪个棋盘排列?我还是III?
回答:
你应该对每个数字分别计算曼哈顿距离(将1移到位的曼哈顿距离加上将2移到位的曼哈顿距离…再加上将8移到位的曼哈顿距离)。如果你使用某种启发式算法(如A*),你应该首先扩展总和最低的棋盘。如果两个棋盘的总和值相同,选择哪个先扩展并不重要。你之前访问过的状态应该被保存为已关闭的状态(以避免进入重复循环),并且完全不予考虑。