我正在写一个遗传算法来找到一个表达目标数的表达式,即如果目标数是 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
选择():
def selection(population):
total_finesses = Decimal(0.0)
# Roulette selection:
for chromosome in population:
total_finesses += chromosome .fitness
# Generate random number (spin the roulette).
pick = Decimal(random.uniform(0, float(total_finesses)))
current = Decimal(0.0)
for i, chrom in enumerate(population):
current += chrom.fitness
if current > pick:
return population[i]
健身():
def fitness_calculator(chromosome):
current_value = get_value(chromosome) # Returns the decimal value of the chromosome.
return Decimal(-1 * (abs(target - current_value), 5))
正如你所看到的那样,因为我正在寻找表达数字的表达式,因此我认为适应度更接近0,因为我正在寻找表达自身与目标数量之间的最小增量的数字 .
我认为选择算法存在问题,在轮盘赌方法中选择最低拟合染色体 .
1 回答
我在计算机科学堆栈交换here上回答了我一个类似的问题,它以最好的方式解释了如何找出哪个是一个很好的选择方法来解决你的问题 .
然而,它看起来并不像你认为你已经实施了突变,而突变是维持人口多样性的原因;所以你可以考虑以某种方式实现它 . 可以找到几种方法here .
@TomDalton也在你的问题的评论中提出了一些公平的观点 . 如果池中有多个相同的解决方案导致问题,请不要允许 . 此外,随机选择很少是一个好主意,并且通常会使评估功能无用 . 您的评估功能会对池中的解决方案进行排名 . 用它!有些方法说采取最好的解决方案并配对它们以使其变得更好;和其他人说,采取最糟糕的解决方案,以保持所有解最重要的是,您可以选择许多其他可能的选择方法 .
我的最后一点是这个(虽然它可能不适用于你的直接,它可能会帮助那些最终进入这个主题的人)在查看GA时经常会低估微调的初始种群大小 . 确保你也尝试了一些变化 .
阅读材料:
Miller,B.L . ,&Goldberg,D.E . (1995) . 遗传算法,锦标赛选择和噪音的影响 . Complex Systems,9(3),193-212 .
Goldberg,D.E . ,&Deb,K . (1991) . 遗传算法选择方案的比较分析 . Urbana,51,61801-2996 .
Poon,P . W.,&Carter,J . N.(1995) . 用于订购应用的遗传算法交叉算子 . 计算机与运筹学,22(1),135-147 .