|
遗传算法与深度学习实战(3)——生命模拟与进化论0.前言1.模拟进化1.1代码实现1.2代码改进2.达尔文进化论3.自然选择和适者生存3.1适者生存3.2进化计算中的生物学小结系列链接0.前言生命模拟通过计算机模拟生物体的基本特征、遗传机制、环境互动等,试图模拟和理解生物的演化过程。我们已经学习了如何实现简单的生命模型,为了进一步提升生命模拟需要模拟进化,接下来,通过借鉴达尔文的进化论,构建升级版的生命模拟。1.模拟进化在本节中,我们重用了简单生命模型的大部分代码,并对其进行修改,以模拟进化或细胞传递遗传特征的能力。在本节中,我们不再使用单一特征strength,而是分配了三个新特征,标记为a、b和c。除此之外,我们还将健康特征替换为更通用的术语——适应度(fitness)。1.1代码实现(1)更新create_cell函数,该函数需要接受两个输入细胞来生成一个后代。例如,在模拟开始时,没有父代细胞,则为细胞的特征设置随机值;而在有父代细胞时,子代细胞的每个特征为父代双亲特征的平均值,这种平均机制只是创建子代特征值的一种方式:importrandomimporttimeimportmatplotlib.pyplotaspltfromlivelossplotimportPlotLossesMUTATE_RNG=5MUTATE_RATE=10defclamp(num,min_value,max_value):returnmax(min(num,max_value),min_value)defcreate_cell(parent1,parent2):ifparent1isNoneorparent2isNone:returndict(fitness=0,a=random.randint(1,100),b=random.randint(1,100),c=random.randint(1,100))else:returndict(fitness=0,a=(parent1["a"]+parent2["a"])/2,b=(parent1["b"]+parent2["b"])/2,c=(parent1["c"]+parent2["c"])/2,)1234567891011121314151617181920212223242526(2)更新reproduce函数,首先,按适应度对父代细胞进行排序,然后选择前一半作为父代(选择过程),然后循环遍历所选择的父代两次(假设每个父代双亲有两个孩子),随机选择两个父代双亲进行繁殖,然后将这两个父母传递给create_cell函数,使用两个父母的特征获得一个新的子代。最后,通过mutate函数对细胞执行突变(有多种选择父代的方式,我们将在后续的学习中看到更多选择方式):defreproduce(cells):parents=sorted(cells,key=lambdad:d['fitness'])[int(len(cells)/2):]children=[]foriinrange(len(parents)*2):mates=random.sample(parents,2)children.append(create_cell(mates[0],mates[1]))returnmutate(children)1234567(3)mutate函数能够随机修改子代特征,通过使用此函数来模拟物理世界中生物体(细胞)可能发生的突变,以获取超越父母的特征。突变是进化的关键因素,也是地球上所有高级生命形式的根源:defmutate(cells):forcellincells:ifrandom.randint(1,100)
|
|