Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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_Sorting_Genetic Programming - Fatal编程技术网

Algorithm 遗传规划与搜索算法

Algorithm 遗传规划与搜索算法,algorithm,sorting,genetic-programming,Algorithm,Sorting,Genetic Programming,遗传编程目前是否能够将一种搜索算法进化为另一种?例如,是否有任何实验从QuickSort中培育/变异出泡泡排序(请参见)我不知道其中一个,并且您在示例中建议的特定方向似乎不太可能;这需要一种反常的适应度函数,因为冒泡排序在大多数情况下比快速排序更糟糕。这并不是不可想象的,但一般来说,一旦你有了一个很好理解的算法,它已经非常适合了——去另一个可能需要通过一些更糟糕的选择 陷入局部极小对于大多数搜索策略来说都不是一个未知问题。没有理由GP不能进化,例如,任何一种算法。我不确定把一个进化成另一个是否真

遗传编程目前是否能够将一种搜索算法进化为另一种?例如,是否有任何实验从QuickSort中培育/变异出泡泡排序(请参见)

我不知道其中一个,并且您在示例中建议的特定方向似乎不太可能;这需要一种反常的适应度函数,因为冒泡排序在大多数情况下比快速排序更糟糕。这并不是不可想象的,但一般来说,一旦你有了一个很好理解的算法,它已经非常适合了——去另一个可能需要通过一些更糟糕的选择


陷入局部极小对于大多数搜索策略来说都不是一个未知问题。

没有理由GP不能进化,例如,任何一种算法。我不确定把一个进化成另一个是否真的有意义。GP将简单地发展一个程序,使其更接近您定义的适应度函数

如果你的适应度函数只关注排序正确性(并且假设你有合适的构建块供你的GP使用),那么它可以很好地发展BubbleSort和QuickSort。如果您还将效率作为适合度的衡量标准,那么这可能会影响其中哪一个将被确定为更好的解决方案

您可以使用快速排序等方法为GP添加种子,如果您有适当的适应功能,它最终肯定会提出BubbleSort,但它也可以提出任何比快速排序更合适的方法


现在GP引擎需要多长时间来完成这一进化是另一个问题…

你可能想看看W.Daniel Hillis在80年代的作品。他花了大量时间通过遗传编程创建排序网络。虽然他更感兴趣的是解决对恒定数量的对象进行排序的问题(16个对象排序网络是近十年来的一个主要学术问题),但如果你真的对遗传排序算法感兴趣,熟悉他的工作将是一个好主意

在对任意长度的列表进行排序的算法进化过程中,您可能还希望熟悉协同进化的概念。我以前建立过一个协同进化系统,重点是让一个遗传算法进化排序算法,而另一个遗传算法开发未排序的数字列表。分拣机的适用性是其准确性(如果100%准确,加上较少比较的奖励),列表生成器的适用性是排序算法在对列表进行排序时产生的错误数

为了回答你关于bubble是否从quick进化而来的具体问题,我不得不说我会严重怀疑它,除非程序员的适应度函数非常具体,而且不明智。是的,bubble非常简单,所以可能一个适应度函数为精度加上程序大小的GP最终会找到bubble。然而,当由比较数决定运行时间时,程序员为什么选择大小而不是比较数作为适应度函数


通过询问GP是否可以将一种算法演化为另一种算法,我想知道您是否完全清楚GP是什么。理想情况下,每个唯一的染色体都定义了一个唯一的排序。200条染色体的群体代表200种不同的算法。是的,quick and bubble可能在那里的某个地方,但还有198种可能未命名的方法。

Charlie,我只是好奇,你将如何培育下一代?我似乎无法理解交叉排序和排序来创建新算法的事实。排序算法的不同之处在于其处理任务的整个方法,而不仅仅是您可以使用的参数。这确实是一个关键问题。记住,在核心部分,遗传算法通过进行大量随机更改并通过适应度函数寻找“更好”的更改来取得进展。同样的问题也发生在生物进化中——你可能从鱼进化成鸟,但任何让你更接近鸟的东西都会在它繁殖之前淹死。另一个很好的例子是熊猫:它非常适合做两件事——吃竹子和可爱。安静的竹林生态位正在消失,因此它们濒临灭绝。另一方面,可能只是“可爱”是确保持续生存的特征。是的,但是遗传算法如何在排序算法中进行随机更改?实际上,可以设置的属性并不多,而且不同算法的属性也有很大差异,因此不可能有一种统一的方法,即采用两个随机算法,并使用第一个算法的属性“a”和第二个算法的属性“B”创建一个新算法。你可以有一个池,并根据性能评级函数从中进行选择,但你如何将它们组合成一个新品种,不仅在语义上,而且在纯粹的语法上?啊,但我是一个理论专家,这是一个实现问题。说真的,您可以随意更改程序字符串作为指令,甚至作为ASCII文本;要成为一个什么都干的一代人是非常缓慢的。不用想太多,我会考虑使用排序网络作为底层的“密码子”。至少你每次都会有一个“排序算法”,即使它不是特别有效,甚至不是很有用。你可能想看看这个问题,讨论一下遗传编程能做什么或不能做什么-->