我正在编写一个遗传算法来查找表达目标数的表达式,即如果目标数是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,因此我认为适应度更接近于0。
我认为选择算法存在问题,在轮盘赌方法中选择最低拟合染色体。
答案 0 :(得分:3)
我在计算机科学堆栈交换here上回答了类似的问题,它以最佳方式解释了如何找出适合您问题的选择方法。
然而,它看起来并不像是认为你已经实施了突变,这种突变负责维持人口的多样性;所以你可以考虑以某种方式实现它。可以找到几种方法here。
@TomDalton在你的问题的评论中也提出了一些公平的观点。如果您的池中有几个相同的解决方案导致问题,请不要允许它。此外,随机选择很少是一个好主意,并且通常会使评估功能无用。您的评估功能会对池中的解决方案进行排名。用它!有些方法说采取最好的解决方案并配合它们以使其变得更好;和其他人说采取最糟糕的解决方案来保持所有解决方案相当最重要的是,您可以选择许多其他可能的选择方法。
我的最后一点是(虽然它可能不适用于你的直接,它可能会帮助那些最终进入这个主题的人)在查看GA时经常会低估微调的初始种群大小。请确保您尝试了一些变体。
阅读材料:
Miller,B.L。& Goldberg,D.E。(1995)。遗传算法,锦标赛选择和噪音的影响。复杂系统,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。