目标函数:曼哈顿距离为0,k最小
约束函数:0<=i<m, 0<=j<n
限界函数:newNode!=oldNode,newNode.distance<=oldNode.distance
算法思想:
使用分支限界法求解该问题。构建一颗解空间树,解空间树的每个结点都是一种棋盘状态。使用广度优先搜索策略进行搜索,并在搜索过程中使用约束函数和限界函数进行剪枝。当搜索到满足目标函数的棋盘状态时,此时搜索空间树的高度就是空格移动的步数。
目标函数是distance=0且k最小。distance是所有数字的当前位置与目标位置间的距离之和(使用曼哈顿距离),k是空格的移动步数。
约束函数是0<=i<m, 0<=j<n。(i,j)是空格位置,m和n是空间大小。
限界函数是newNode!=oldNode,newNode.distance<=oldNode.distance。设newNode为要入堆的棋盘状态,oldNode为堆中的棋盘状态。
求解过程:
(1)初始化一个空的优先队列(最小堆),并将初始棋盘状态添加到队列中。
(2)当优先队列不为空时,从队列中取出具有最小曼哈顿距离的棋盘状态。
(3)对于当前棋盘状态,检查是否已经到达目标状态。如果是,则返回移动序列;否则,继续进行下一步。
(4)计算当前棋盘状态下所有可能的合法移动,将这些移动生成的新的棋盘状态添加到优先队列中。
(5)返回步骤(2),重复上述过程,直到找到目标状态或优先队列为空。