轮盘赌算法中的一行超人写法
假设有如下适应度概率密度:
>>> fitness = [5, 6, 7, 1, 2, 3]
>>> fitness_sum = sum(fitness)
>>> fitness_proportion = [fitness[i] / fitness_sum for i in range(len(fitness))]
>>> fitness_proportion
[0.20833333333333334, 0.25, 0.2916666666666667, 0.041666666666666664, 0.08333333333333333, 0.125]
我们需要创建一个轮盘,将 fitness_proportion 累加起来生成一个新的列表,逻辑如下:
首先将 fitness_proportion 的第一项作为新列表的第一项,前两项的和作为新列表的第二项,前三项的和作为新列表的第三项,以此类推。
一般写法如下:
pie_fitness = []
cumsum = 0.0
for i in range(len(fitness_proportion)):
pie_fitness.append(cumsum + fitness_proportion[i])
cumsum += fitness_proportion[i]
输出 pie_fitness 看看:
>>> pie_fitness
[0.20833333333333334, 0.45833333333333337, 0.75, 0.7916666666666666, 0.875, 1.0]
>>>
一行超人写法如下:
from functools import reduce
pie_fitness = [reduce(lambda x, y: x + y, fitness_proportion[:i]) for i in range(1, len(fitness_proportion) + 1)]
比较暴力,能看懂的就看看吧,不解释了。
如果没有性能要求的情况下,尽量按照一般写法来,一行的可读性毕竟还是差了点。