对于当前的项目,我想使用遗传算法 - 目前我查看了jenetics库。
我怎样才能强制某些基因相互依赖?我想在基因上映射CSS,例如我有基因指示是否显示图像,如果它也是各自的高度和宽度。所以我想把这些基因作为一个群体,因为在交叉之后,染色体会指示"没有图像"之类的东西是没有意义的 - 高度 100px - 宽度 0px。
有没有办法这样做?或者也许是另一个支持此功能的库(在 java中(?
非常感谢!
您希望将更多知识嵌入到系统中以减少搜索空间。
如果是关于解决方案结构的知识,我建议看看语法演变(GE(。你的知识似乎更多的是关于密码子的有效组合,所以GE不容易应用。
可以将一些特征组合成一个密码子,但这可能是不希望和/或不可行的(例如,由于大量可能的组合(。
但实际上你在这里没有问题:
- 拥有无意义的基因型是可以的——由于选择压力,它们将被移除
- 拥有无意义的密码子序列是可以的——它被称为"膨胀";膨胀在一些进化算法中很常见(通常在遗传编程的上下文中讨论(,严格来说并不坏;过多地与膨胀作斗争会降低搜索性能
如果你知道你的基因组是如何编码的——也就是说,你知道哪些染色体序列形成了群体——那么你就可以扩展(因为你提到了jenetics(io.jenetics.MultiPointCrossover
以避免分裂群体。 (源代码可在 GitHub 上找到。
它可以像存储基因组一样简单,如果其中一个随机切割索引将一个组分开,则形成组,将索引调整到组的最接近的一端。 (当然,这会导致在统计上更高的组末端切割的可能性;最好生成一个新的随机位置,直到它不与组相交。
但正如皮特所指出的(基于其他基因的基因没有意义(被忽略(也是有效的;如果这种组合是反生存的,它将被选中。