0

我目前正在从事一个项目,我正在使用基本的元胞自动机和遗传算法来创建类似地牢的地图。目前,当我的输出只能是两种状态时,我很难理解交叉究竟是如何工作的:DEAD 或 ALIVE(1 或 0)。

我从概念上理解交叉——你找到两个合适的种群成员,他们交换遗传物质,希望产生更合适的后代。我也明白这通常是通过对位串执行 k 点交叉来完成的(但也可以用实数完成)。

然而,即使我将我的死/活细胞编码成比特并将它们交叉......我最终会得到什么?细胞只能是死的或活着的。交叉会给我一些超出这个范围的随机值,对吧?即使我要处理浮点数,我最终不会得到 1 或 0 吗?在这种情况下,似乎最好将死细胞随机突变为活细胞,反之亦然。

我已经阅读了几篇关于该主题的论文,但似乎没有一篇能解释这个特定问题(无论如何,用我能理解的语言)。直觉上,我想也许我可以对单元格的邻居进行交叉 - 所以我找到了 2 个合适的邻居,然后他们交换成员(例如,邻居 A 将它的 4 个邻居提供给邻居 B)。但是,我在任何地方都没有看到这个想法,这让我相信它一定是根本错误的。

任何帮助将不胜感激,我真的坚持这一点。

4

1 回答 1

0

这里是地下城游戏和基因编程的爱好者 :)

我认为您误解了交叉的概念。在您的元胞自动机上,您必须拥有遗传信息(染色体),以便您的系统决定匹配的细胞是死的还是活的。单元的状​​态是系统的输出。

您通过混合它们的遗传信息来执行双亲染色体之间的交叉遗传算子。结果,您获得了一个新的染色体,该染色体以类似于父母双方的方式对图谱进行编码。你的细胞的新状态是通过运行新的染色体来重新绘制你的风景而获得的。

交叉为您提供了一个新的染色体来映射您的地牢,它不会为您提供细胞的新状态。要获得新状态,只需运行您的新染色体。

您的细胞状态将是表型,即您的染色体的表现方式。你的染色体是决定你的细胞是死是活的模型。我不关心您使用的模型。例如,您正在使用具有两个输入节点的神经网络。一个输入节点接收网格中单元格的 X 坐标,另一个节点接收 Y 坐标。输出节点是一个二进制值:DEAD 或 ALIVE。这个神经网络有一定数量的隐藏层和权重,它们编码在你的染色体中。通过执行交叉算子,您可以创建一种连接神经元的新方法,该方法位于双亲之间。但是为了知道每个细胞的新状态,您需要再次将坐标传递给神经网络。也许检查 Stanley 的 NEAT 算法可以阐明交叉过程:http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf

如果您没有任何模型来编码地图中每个细胞的状态,那么您的遗传信息直接就是每个细胞的状态。在这种情况下,您可以将父网格拆分为较小的网格,例如 10x10 网格。然后在 10x10 的图块中运行地图,如果从 parent1 或 parent2 中选择匹配的图块,则随机选择。

我希望这有帮助!

阿尔贝托

于 2020-04-30T15:37:01.063 回答