机器学习基础(四十六)—— 遗传算法(GA)

遗传算法(Genetic Algorithms)也是受自然科学的启发。该类算法的运行过程是先随机生成一组解,称之为种群(population)。在优化过程中的每一步,算法会计算整个种群的成本函数,从而得到一个有关题解的有序列表

其三个主要特性在于:

  • selection,crossover,mutation

在对题解进行排序之后,一个新的种群——我们称之为下一代——被创建出来了。首先,我们将当前种群中位于最顶端的题解加入其所在的新种群中。我们称这一过程为精英选拔(elitism)。新种群的余下部分是由修改最优解后形成的全新解所组成的。

有两种修改题解的方法。

  • (1)较为简单的一种称为变异(mutation),其通常的做法是对一个既有解进行微小的、简单的、随机的改变。

  • (2)另一种方法称为交叉(crossover)或配对(breeding)。这种方法是选取最优解中的两个解,然后将它们按照方式结合。

算法设计中可能涉及的参数主要有,

  • (1)popsize:种群大小
  • (2)mutprob:种群的新成员由变异而非交叉得来的概率
  • (3)elite:种群中被认为是最优解且被允许传递到下一代的比例
  • (4)maxiter:需要运行多少代

遗传算法的程序还是比较好写的,因为流程非常固定;

def geneticalgo(domains, costf, popsize=100, 
        mutprob=.2, elite=.2, maxiter=100):

    def mutable(c):
        i = random.randint(0, len(domains)-1)
        if random.random() < 0.5 and c[i] > domains[i][0]:
            c[i] -= 1
        elif c[i] < domains[i][1]:
            c[i] += 1
        return c
    def crossover(r1, r2):
        i = random.randint(1, len(domains)-2)
        return r1[:i] + r2[i:]

    pop = []
    for i in range(popsize):
        r = [random.randint(domains[i][0], domains[i][1]) for i range(len(domains))]
        pop.append(r)

    topelite = int(popsize*elite)

    for i in range(maxiter):

        scores = [(costf(r), r) for r in pop]
        scores.sort()
        randked = [v for c, v in scores]
        pop = ranked[:topelite]

        while (len(pop) < popsize):
            if random.random() < mutprob:
                r = random.randint(0, topelite-1)
                pop.append(mutable(pop[r]))
            else:
                c1 = random.randint(0, topelite-1)
                c2 = random.randint(0, topelite-1)
                pop.append(crossover(pop[c1], pop[c2]))
        print(scores[0][1])
    return scores[0][0]
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值