我正在研究VB.NET中对称TSP的遗传算法。我想知道执行选择程序的正确方法是什么。似乎至少有两种不同的可能性:
1)
-create a "reproduction pool" of size R by using SELECTION(pop) function
-do offspring creation cycle
-randomly (uniformly) select two parents from that pool for each offspring
that needs to be created in each iteration
2)
-do offspring creation cycle
-use modified SELECTION(pop) function that will return two different parents from pop
-perform crossover to produce a child
奖金问题:选择两个父母之后,可以产生两个不同的后代(如果交叉算子是mot交换):CROSS(p1,p2)和CROSS(p2,p1)。 我应该立即插入两个后代还是一个一个地生产它们?这会有所作为吗?
目前我正在逐一制作它们,因为我认为它会给人口带来更大的差异。
答案 0 :(得分:1)
这取决于编纂。
您可以考虑当前人口中最适合的两个人。
或者您可以使用轮盘赌选择(Google it)将每个人与复制率相关联,这是常用的方法。
答案 1 :(得分:1)
在遗传算法中,您不使用单独的复制池,而是使用来自群体的样本(| N |,直到您有2 * | N |父项,其中您创建| N |子项)。如果您的复制池R的大小为2 * | N |并且你从该池中随机抽样它本质上是相同的行为,但你需要更多的随机数,而且计算成本更高(取决于你的RNG)。请注意,没有必要关心让两个不同的父母。由父母交配的父母将产生一个与父母相同的孩子(如果交叉是幂等的)。它类似于使用交叉概率。如果你在结构上比较它们,检查两个父母是否不同可能是相当昂贵的。您也可以通过健身来比较它们,但通常您可以使用相同质量的非常不同的解决方案。
关于你的第二个问题:我会说它并不重要。出于简单原因,我会选择只返回一个子进程:一个采用两个解决方案并返回一个解决方案的方法比返回一组解决方案更容易处理。我想说,返回两者只会在你可以创建两个不同解决方案的情况下很有意思。这是二进制或实值编码的情况。但是,根据排列,你不能保证这个属性,并且无论如何都会在交叉中丢失一些遗传信息。