回溯算法中运算顺序的重要性



回溯算法的每个递归步骤中的操作顺序对特定算法的效率有多重要?

例如

在骑士之旅的问题。

骑士被放在一块空木板的第一块上,然后移动根据国际象棋规则,每个方格必须访问一次。

在每个步骤中,有8种可能的(一般)移动方式。

int xMove[8] = {  2, 1, -1, -2, -2, -1,  1,  2 };
int yMove[8] = {  1, 2,  2,  1, -1, -2, -2, -1 };

如果我把这个订单改成。。。

int xmove[8] = {  -2, -2, 2, 2, -1, -1,  1,  1};
int ymove[8] = {  -1,  1,-1, 1, -2,  2, -2,  2};

现在,对于n*n板最多n=6两种操作顺序都不会影响执行时间的任何可见变化,

但如果它是n>=7

第一个操作(移动)命令的执行时间比后一个要短得多。在这种情况下,生成所有的O(m!)运算顺序并测试算法是不可行的。那么,我如何确定这些算法在特定移动顺序上的性能,或者更确切地说,如何可能达到一个(或一组)操作顺序,从而使算法在执行时间方面更高效。

从数学/CS的角度来看,这是一个有趣的问题。对于给定的CCD_ 1,肯定存在最有效的排列(或排列集)。我不知道在所有的CCD_ 2中是否有一个置换是最有效的。我想不会。在所有n中,可能存在一个"平均"更好的排列(无论您如何定义)。

如果我的任务是找到一个有效的排列,我可能会尝试做以下事情:我会生成一个固定数量的随机生成的移动顺序x。衡量他们的效率。对于每一个随机生成的移动集,随机创建固定数量的靠近原始移动集的排列。计算它们的效率。现在你有了比一开始更多的排列。取表现最好的x,重复。这将提供一些局部最大化算法,但我不知道它是否会导致全局最大化算法。

最新更新