2

我一直在用编码、优化和解码重新审视遗传算法。我的第一次尝试是带有有序交叉的旅行推销员,效果很好。我发现一篇文章试图在优化 2d 打包问题的同时优化更复杂的基因组。

作者使用有意义的反向波兰符号对问题进行编码。它使用部分组合和 V 或 H 作为操作符。

即34H5V

解码堆栈必须解析为一个堆栈元素,这是我的最终布局。话虽如此,直到某一点的操作员数量必须比直到同一点的零件数量少 1。然后作者指出,他通过在零件上使用有序交叉和对运算符使用二进制交叉来使用混合交叉。

我仔细考虑了这一点,但我不明白他是如何在交叉之前分离零件和操作员,然后在评估性能之前重新组合它们的,而且它们提供的细节很少。如果发生二进制交叉,则用“X”替换零件以保持相对位置,以便它们可以在交叉后重新组合,但操作员和零件之间的关系不成立。

是否有人可能拥有处理过类似情况或成功使用过的资源。

4

1 回答 1

0

这看起来比实际上要困难得多。生成原始总体时,您需要遵守后缀表示法规定的限制。当发生交叉时,您只需构建父级的掩码

即xxxooxoxx

其中 x 是一个对象,o 是一个操作符。一旦你有了保持位置的面具,你就可以创建一个只有操作员和一个对象的刺。运算符可以通过二进制交叉和对象作为部分映射交叉来完成。完成后,按照它们在每个组中出现的顺序,用值填充掩码。由于掩码是有效的,后代也是有效的。

唯一的问题是获得所有可能的安排,因为没有它,一切都将仅限于面具。他通过执行由突变率决定的交换突变来解决这个问题。

  1. 随机选择一个项目。
  2. 如果项目是运算符,则 A. 将运算符切换到另一种类型 B. 选择另一种。如果它是一个对象,则确保满足要求,如果满足则切换。
于 2017-04-22T18:56:58.947 回答