我正在开展一个项目,我正在尝试实施由Karl Sims撰写的“不断发展的虚拟生物”理念。
问题在于,在我读过的每个教程中,他们都是用整数或布尔值来构建个体,如下所示:
pop.subpop.0.species = ec.vector.BitVectorSpecies
pop.subpop.0.species.ind = ec.vector.BitVectorIndividual
但是,如果我有一个名为“Node”的类,这比这些更复杂呢?没有这样的ec.vector.BitVectorNode。 在ECJ Tutorial页面(http://cs.gmu.edu/~eclab/projects/ecj/docs/)中,有一个名为“Post-Tutorial Discussion”的教程,其中包含以下内容:
任意表示使用ECJ进行任意表示相当容易。只需将Individual子类化并添加到您自己的表示中。您可能需要制作自己的BreedingPipelines,它们知道如何跨越或改变您的表示形式。
我的类Node扩展Individual,但我不知道如何继续或者我需要对公共代码应用哪些更改来创建填充(例如,教程1和2中的代码)
这是其属性的声明:
public class Node extends Individual
{
/** Properties */
private static final long serialVersionUID = -4771047292470201612L;
private double length;
private double width;
private double height;
private int recLimit;
private Joint joint;
private Set<Sensor> setSensors = new HashSet<Sensor>();
private Set<Neuron> setNeurons = new HashSet<Neuron>();
private Set<Effector> setEffectors = new HashSet<Effector>();
private Set<Connection> setConnections = new HashSet<Connection>();
//And then the methods
非常感谢任何帮助。
答案 0 :(得分:1)
教程1和2是如何使用ECJ包来定义和解决遗传算法问题的示例,而不是遗传编程(针对两者之间的差异see here)。
在遗传算法中,你必须&#34;编码&#34;你的问题进入某种基因组,比特或整数是教程1和2所示的常见编码表示,所以你必须找到一种方法从你的Node
类(你的人口)的实例中提取这个基因组编码问题。换句话说,您的节点类必须具有getGenome
方法,或者您需要一些其他对象来封装编码逻辑,并且可以查看您的Node
实例并知道如何提取基因组中。
如果你试图改进类本身(从你的问题中不完全清楚),教程4展示了如何使用遗传编程包。如果你真正想要做的是&#34;进化代码&#34; (遗传编程)这个包是你应该参考的教程。