Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 回溯算法中运算顺序的重要性_Algorithm_Recursion_Backtracking - Fatal编程技术网

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

Algorithm 回溯算法中运算顺序的重要性,algorithm,recursion,backtracking,Algorithm,Recursion,Backtracking,回溯算法的每个递归步骤中的操作顺序对该特定算法的效率有多重要 例如 骑士之旅的问题 骑士被放置在一块空木板的第一块上,然后移动 根据国际象棋的规则,你必须准确地访问每个广场一次 在每个步骤中,有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,

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

例如

骑士之旅的问题

骑士被放置在一块空木板的第一块上,然后移动 根据国际象棋的规则,你必须准确地访问每个广场一次

在每个步骤中,有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的角度来看,这是一个有趣的问题。对于给定的
n
,肯定存在一种最有效的置换(或一组置换)。我不知道在所有的
n
中是否有一种排列是最有效的。我想不会。在所有
n
中,可能有一种“平均”更好的排列方式(不管您如何定义)


如果我的任务是找到一种有效的排列方式,我可能会尝试以下操作:我会生成一个固定数量的
x
随机生成的移动指令。衡量他们的效率。对于每一个随机生成的移动集,随机创建一个接近原始移动集的固定数量的排列。计算它们的效率。现在你有了比你开始时更多的排列。取最上面的
x
进行表演并重复。这将提供一些局部最大化算法,但我不知道是否会导致全局最大化算法

听起来你已经有了选择和遗传,现在你只需要变异和交叉就可以有一个遗传算法。正如您所暗示的,这些类型的算法倾向于找到局部最大值。