【发布时间】:2015-03-13 05:14:33
【问题描述】:
我正在编写一个遗传算法来查找表达目标数字的表达式,即如果目标数字是10,则解决方案将是2*5。现在我使用的是固定大小的染色体,我想将其更改为随机长度,但只有在我找到执行交叉的方法之后。
以下是可能的染色体,遵循数字和运算符交替出现在字符串中的规则,以没有两个数字或两个运算符相邻的方式。合法字符串将以数字或+/- 运算符开头。表达式将按原样从左到右计算(忽略算术运算的顺序):
1/2+3+5-2+4+1+8-7+6*2+8+2/5-1+8 2+1*2-2+2*7*7+3+1/2/2/6 5/5*9*1+3-1+1*8 3-8+7*1
尝试实现交叉我尝试了以下方法(在伪代码中):
crossover(chrom-a, chrom-b):
min_length = min(length(chrom-a), length(chrom-b))
locus = random(1, min_length-1)
while (chrom-a[locus] & chrom-b[locus] aren't both digit or operator)
ocus = random(1, min_length-1)
chrom-a = chrom-a[:locus] + chrom-b[locus:]
chrom-b = chrom-b[:locus] + chrom-a[locus:]
return chrom-a, chrom-b
但该功能没有按预期工作,有时需要花费太多时间才能找到正确的轨迹。我必须找到一种方法使交叉与随机大小的染色体一起工作,但我不知道如何(当然要确保没有被零除)。
【问题讨论】:
标签: algorithm artificial-intelligence genetic-algorithm arithmetic-expressions