阅读 128

大自然的启发带来遗传算法(1)

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

种群

  • 居住在一个地方的一群特定种类的人或动物
  • 种群是解决问题的一组潜在的方法(解)
  • 从中抽取样本进行统计测量的一组个体、物体或物品(统计数据)

初始种群

种群的规模通常不会随着演化算法而改变。通常在迭代过程中始终保持一定数量。按照成员之间关系划分为合作种群和竞争种群

  • 合作种群通常以固定规模开始,不会添加或者删除新成员
  • 竞争种群通过不断迭代也就是产生后代方式,但还是保持种群数量不变

种群成员之间关系

种群成员之间的竞争

  • 遗传算法和遗传编程

通过评估,得分高的个体参与交配繁衍下一代,处理共同繁衍下一代成员之间没有直接合作。也有可能随机选取评分高直接选择到到下一代。

种群成员之间的合作

  • 粒子种群优化和蚁群优化是合作算法的两个例子

合作迭代并不是用新的一代来取代先前的种群,每次迭代结束,所有潜在的解都会进行协作并调整参数

对种群计分

也就是设计一个函数用于评估个体对环境的适应度。

从种群中选择

截断选择

def truncate_select(breeding_ratio,sorted_population):
    sort(sorted_population)
    # 确定繁殖种群的大小 
    count = len(sorted_population) * breeding_ratio
    # 获得一个均匀分布的(所有数字都有相同的概率)0和计数之间的单个随机数
    index = uniform_random(0,count)
    return sorted_population[index]

# 为了提高效率,应该把排序移到选择功能之外,对你要执行的每一批选择进行一次排序。
复制代码

联赛选择

由于算法执行的效率以及易实现的的特点,联赛赛选择算法是遗传算法中最流行的选择策略。实际应用中的确此策略比基本的轮盘赌效果要好些。这个策略也很直观,就是我们再整个种群中抽取 n 个个体,让他们进行竞争(联赛标赛),抽取其中的最优的个体。参加锦标赛的个体个数成为 tournament size。通常当 n= 2 便是最常使用的大小,也称作Binary Tournament Selection.

# 以指定的轮数进行锦标赛选择。高分被认为是理想的(最大化)
def tourname_select(rounds,population):
    # 没有被选中的
    champ = null
    for x from 0 to rounds:
        contender = uniform_random(population)
        if champ is null:
            champ = contender
        # 适应评估高分胜出更新 champ
        else if contender.score > champ.sorce
            champ = contender
    return champ
复制代码
文章分类
人工智能