我正在编写一个遗传算法来找到一个表达目标数的表达式,也就是说,如果目标数是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时,适应度被认为是更好的,因为我正在寻找一个表达式,它用最小的增量来表示它本身和目标数之间的值。
我认为我有一个选择算法的问题,选择最适合的染色体在轮盘赌的方法。
发布于 2015-01-17 20:27:18
我在计算机科学stackexchange 这里上回答了一个类似的问题,它以最好的方式解释了如何找出哪种方法是解决问题的好方法。
然而,它看上去不像你已经实现了突变,这是负责保持多样性的群体;所以你可能会考虑以某种方式实施。有几种方法可以找到这里。
@TomDalton在对你的问题的评论中也提出了一些合理的观点。如果您的池中有几个相同的解决方案会导致问题,请不要允许它。此外,随机选择很少是一个好主意,往往会使评估功能失效。您的评估函数对池中的解决方案进行排序。用它!有些方法说采取最好的解决方案,并将它们配对,以使最好的解决方案更好;而另一些方法则说,采取最坏的解决方案,以保持所有解决方案都相当体面。除此之外,还有许多其他可能的选择方法可供您选择。
我的最后一点是(虽然它可能不直接适用于您,但它可能会帮助那些在这个线程中结束的人),当查看GAs时,微调的初始种群大小常常被低估。确保你也尝试了几种不同的方法。
阅读材料:
Miller,B.L.,& Goldberg,D.E.(1995年)。遗传算法,比赛选择,以及噪声的影响。复杂系统,9(3),193-212。
Goldberg,D.E.& Deb,K. (1991)。遗传算法中选择方案的比较分析。乌尔巴纳,51,61801-2996。
Poon,P.W.,& Carter,J.N. (1995)。用于排序应用的遗传算法交叉算子。“计算机与运筹学”,22(1),135-147。
https://stackoverflow.com/questions/27982858
复制相似问题