进化算法:执行dna(命令列表)而不事先编译

时间:2014-12-18 15:10:04

标签: performance parsing compilation artificial-intelligence

我已经开始编写进化算法了。它由一个二维世界(如一个大棋盘)的细胞组成,最多可以包含一种药剂和一定量的食物。代理人可以在这个世界中四处走动,相互攻击,请求有关他们自己的细胞或其相邻细胞的信息,并创造后代等。

代理本身由每个回合执行的程序和DNA组成。该程序包含大约30种不同命令(MoveTo,SaveDate,GetData,Atack等)的组合。一个非常简单的例子可能是:

MoveTo(RandomByte());

或者稍微复杂一点:

SaveDate(Number(50),Number(2));
MoveTo(GetData(Number(2)));

该程序是通过在创建代理时读取DNA构建的,DNA元素可能如下所示:

DNAElement(8, Instructions.SaveData, new List<int> { 9, 13 }));

8是此元素/指令的唯一ID,然后SaveData是指令类型,9和13是参数(它是指令的唯一ID),所以基本上这些是一种引用。 特殊情况是start元素,它定义了从哪里开始读取dna,以及Number元素,其参数不是唯一ID而是实际数字。 dna元素存储在列表中,所以如果我想在DNA中说这个:

MoveTo(RandomByte());

它可能看起来像:

dna.Add(new DNAElement(5, Instructions.MoveTo, new List<int> { 2 }));
dna.Add(new DNAElement(0, Instructions.Start, new List<int> { 5 }));
dna.Add(new DNAElement(2, Instructions.RandomByte, new List<int> { }));

然后读取这个dna(使用resursive方法)和字符串:“MoveTo(RandomByte());”是构建的,然后将这个字符串添加到一个描述整个类的大字符串中,这个大字符串就是在运行时编译,转换为接口,结果对象看起来像常规代理对象。

然而问题是在运行时编译字符串会花费很多时间并且经常会创建子代,因此我需要另一种方法来“执行”DNA。我正在阅读有关代表的内容,但无法弄清楚我是否可以使用这些(还没有完全理解它们)。你们知道一种既能有效地阅读dna的方法(可能只是在出生时就像现在这样做),并且它产生了一种可以在每个回合中有效执行的程序?

编辑:任何关于例如不同的DNA结构的建议&#34;可能更好的工作当然更受欢迎

0 个答案:

没有答案