我目前正在做一个项目,我正在使用一个基本的细胞自动机和一个遗传算法来创建类似地牢的地图。目前,当我的输出只能是两种状态时,我很难理解交叉是如何工作的:死或活(1或0)。
我从概念上理解交叉--你在种群中找到两个合适的成员,他们交换遗传物质,希望能产生更合适的后代。我也知道这通常是通过对比特串执行k点交叉来完成的(但也可以用实数来完成)。
然而,即使我将我的死/活单元编码成比特并将它们交叉...我最终会得到什么呢?细胞只能是死的或活的。Crossover会给我一些超出这个范围的随机值,对吧?即使我要处理浮点数,我不会以1或0结束吗?在这种情况下,将死亡细胞随机突变为活细胞似乎会更好,反之亦然。
我已经读了几篇关于这个主题的论文,但似乎没有一篇解释这个特定的问题(用我能理解的语言)。直觉上,我想也许我可以在单元的邻域上执行交叉操作--所以我找到了两个合适的邻域,然后他们交换成员(例如,邻域A将其4个邻域分配给邻域B)。然而,我在任何地方都没有看到这个想法,这让我相信它肯定是根本错误的。
任何帮助都将不胜感激,我真的被困在这个问题上了。
发布于 2020-04-30 23:37:01
这里是一个地下城游戏和遗传编程的爱好者:)
我想你误解了交叉的概念。在你的细胞自动机上,你必须有遗传信息(染色体),这样你的系统才能决定匹配的细胞是死的还是活的。单元格的状态是系统的输出。
您可以通过混合它们的遗传信息来执行两个父染色体之间的交叉遗传算子。结果,你获得了一个新的染色体,它以一种类似于双亲的方式对地图进行编码。你的细胞的新状态是通过运行新的染色体来重新绘制你的风景来获得的。
交叉会给你一个新的染色体来描绘你的地牢,它不会给你细胞的新状态。要获得新的状态,只需运行您的新染色体。
你的细胞的状态将是表型,你的染色体的表现方式。你的染色体是决定细胞是死是活的模型。我不关心你正在使用的模型。例如,您正在使用具有两个输入节点的神经网络。一个输入节点接收网格中单元格的X坐标,另一个节点接收Y坐标。输出节点是一个二进制值:死的或活的。这个神经网络有一定数量的隐藏层和权重,它们编码在您的染色体中。通过执行交叉运算符,您可以创建一种新的方法来连接位于双亲之间的神经元。但是,为了了解每个单元的新状态,您需要再次将坐标传递给神经网络。也许由斯坦利检查的整洁算法澄清了交叉过程:http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf
如果你没有任何模型来编码地图中每个细胞的状态,那么你的遗传信息直接就是每个细胞的状态。在这种情况下,您可以将父网格拆分为较小的网格,例如10x10网格。然后以10x10的瓦片运行地图,并随机选择是否从parent1或parent2中选取匹配的瓦片。
我希望这能帮到你!
阿尔贝托
https://stackoverflow.com/questions/61524053
复制相似问题