回溯算法的每个递归步骤中的操作顺序对特定算法的效率有多重要?
例如
在骑士之旅的问题。
骑士被放在一块空木板的第一块上,然后移动根据国际象棋规则,每个方格必须访问一次。
在每个步骤中,有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
,重复。这将提供一些局部最大化算法,但我不知道它是否会导致全局最大化算法。