Evolutionary algorithm (遗传算法)介绍

Evolutionary algorithm (遗传算法)介绍

Evolutionary algorithm 遗传算法, 实际上也是机器学习里面一个很重要的分支。为什么呢,因为他在之前几十年也是和深度学习一样非常火热流行。现在也有很多人在利用遗传算法做相关研究,还是比较流行的算法之一。

Evolutionary algorithm 算法是受到自然界的一些启发,通过种群优化去解决一些相关的任务,比如做数独,解决一些实际的规划问题,组合优化问题。这里 附上一个非常好玩的链接: 小摩托车 这个demo就是不断地去做遗传优化,搜出一个比较完美的小摩托的结构。实际上就是把一个圆中,对8条半径和角度进行随机,以及对应的轮子的半径的随机,找到最有的小摩托模型。

Evolutionary algorithm (遗传算法)介绍_第1张图片

作为类比,你可以把问题(problem)比作环境(environment),然后你可以把解决方案(candidate solution)比种群中的某一个体(individual),然后你也可以把单个解决方案的的质量(quality)比作这个个体(individual)的适应程度(fitness),就是它对这个环境的适应程度。

这个整套算法比较简单,他的总体伪代码如下:

//初始化, 对所所有中群中的个体
Initialize population with random individuals
//没到终止条件
While  (it is not termination condition) do
	//评估每个个体的质量
	Evalute population / individual fitness
	//选择部分 父母,用于 繁衍后代 
	Select parents with high fitness 
	//通过父母的基因构造新的后代
	Combine parents  to form offspring
	//基因变异 
	Mutate resulting offspring
	//得到新一轮的种群
	Get net population = offspring

上述代码的种群,就表示解决方案,每次都是随机出一堆解决方案,最重要的就是评估的指标,通过指标来筛选出优秀的个体。这里需要注意的是,优秀的个体不代表就一定有机会能够生育(考虑现实世界),不优秀的个体也是有机会繁衍的,只是概率更低而已。所以这里的选择出来的父母呢,就是通过这个评估的分数来作为占比,分数越高的个体,繁衍的机会越大。对于繁衍呢,实际上就是说把两个父母的这个基因呢进行一个交换,这个交换呢可以自己设计,交换完之后呢,就是说还有一个变异变异,有可能是它改变这个解决方案里面的一个某个值,或者说是交换其中的两物两个数值,然后让他这个种群有更多的diversity,这样子就能使得新一轮的种群,其中可能就有一些更优秀的一些解决方案会出来。

上面说到,如何选择优秀的总群,实际上,就是说每个个体因为经过评估之后,都有对应的一个分数,这个分数呢,大家就可以都一起算一算比值。比值越高的个体月有机会繁衍,就像是幸运大转盘一样,代码如下:

// Select a parent individual from a population based on roulette wheel selection
function RouletteWheelSelection(population, fitnessSum) {
    // max number
    let max_num = fitnessSum;
    // target
    let pick_idx = Math.random()*max_num;
    let count = 0;
    for (let i=0;i< population.length;i++){
        count += population[i].fitness;
        if (count >= pick_idx) return population[i];
    }
    return population[population.length-1];
}
   

这里 population = 种群, population[i]就是每个个体, fitnessSum 就是所有种群都已经把 fitness value 进行了求和。

那说了这么多,example 有没有呢?有数独就是一个很好的例子,这里如果我们想要解数独问题,实际上就是genetical Algorithm的一个问题, 如下所示:

Evolutionary algorithm (遗传算法)介绍_第2张图片
为了解决这个方法,数独的所有框框里面的数字,实际上都可以拿出来,拼成一个大向量,然后我们就把每个个体 都当成一个解决方案(大向量)如: [1,3,4,5,6,4,8,8,9,5,5,…,4,9,5,6,4,3,4,3] ∈ R 81 × 1 \in \mathbb{R}^{81 \times 1} R81×1
目的就是找到最有的解决方案,就套用上面的优化方法就行了。
注意,这里的 个体,或者说染色体(chromosomes)可以是上面说的向量,也可以是integer strings, permutations. 等等

这里再讲讲繁衍,对于这个例子,繁衍就是把两个父母的基因进行交换,就得到了新的个体,然后我们还要对新的个体进行变异,比如交换这个向量里面的两个值,或者随机该几个,这个就取决于设计了。

Evolutionary algorithm (遗传算法)介绍_第3张图片

上面讲的 GA算法是 EA的一个子分之,实际上还有Evolution Strategies,Evolutionary Programming,
Genetic Programming。 但是都逃不过上面的伪代码,只是表示形式变了一下。最大的差异就是:

  1. 选择适合问题的表示形式
  2. 选择变量操作符以适应表示

除此之外,我觉得很重要的一点就是,评估函数要选得恰当!!

你可能感兴趣的:(机器学习,算法,数据挖掘,人工智能)