用于移位数组的启发式算法

时间:2014-05-22 08:53:12

标签: c a-star heuristics

给定目标状态

int final[3][3]={{1,2,3},
                 {4,5,6},
                 {7,8,9}};

和一个随机的初始状态,我想通过移动我的表的行(向右或向左)和列(向上和向下)来将我的数组排序为final

   7 8 4    by shifting to the right the first row it will become 4 7 8
   2 1 9                                                          2 1 9
   6 5 3                                                          6 5 3

所以我想使用*搜索,我正试图找到一个好的启发式。

我已经尝试过错放的数组元素。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我认为这是一个代数问题。您将获得一组由6个周期(3行和3列)生成的排列,并且您希望找到更多可以帮助您进行任何排列的移动。

第一个建议:并非所有排列都是可能的!由于每个班次都是偶数置换(3个周期是两个换位的组合),因此甚至排列也是可能的。因此,你不会找到任何解决方案,其中所有都已到位,但两个交换的数字,如(2,1,3),(4,5,6),(7,8,9)。

第二条建议。如果r是行移位而c是coumn shift,则计算rcr'c'的动作,其中r'和c'是反向移位。这个“换向器”再次是3个元素的循环,但这次它们不是一行或一列。通过选择不同的r和c,你可以得到很多3个循环,可以在第三个建议中使用。

第三个建议。考虑已经处于最终位置的数字区域。对该组的补码应用3个循环以减少它,直到找到解决方案。