1、遗传算法的概念最早是由 Bagley J.D 于 1967 年提出的。后来 Michigan 大学的J.H.Holland 教授于 1975 年开始对遗传算法(Genetic Algorithm, GA)的机理进行系统化的研究。遗传算法是对达尔文生物进化理论的简单模拟,其遵循“适者生存”、“优胜略汰”的原理。遗传算法模拟一个人工种群的进化过程,并且通过选择、杂交以及变异等机制,种群经过若干代以后,总是达到最优(或近最优)的状态。自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法更是发挥了重大的作用,大大提高了问题求解的效率。遗
2、传算法也是当前“软计算” 领域的重要研究课题。本文首先结合 MATLAB 对遗传算法实现过程进行详细的分析,然后通过 1 个实际的函数优化案例对其应用进行探讨。1. 遗传算法实现过程现实生活中很多问题都可以转换为函数优化问题,所以本文将以函数优化问题作为背景,对GA 的实现过程进行探讨。大部分函数优化问题都可以写成求最大值或者最小值的形式,为了不是一般性,我们可以将所有求最优值的情况都转换成求最大值的形式,例如,求函数 f(x)的最大值,若是求函数 f(x)的最小值,可以将其转换成 g(x)=-f(x),然后求 g(x)的最大值,这里 x 可以是一个变量,也可是是一个由 k 个变量组成的向量,
3、 x=(x1, x2, , xk)。每个xi, i=1,2,k, 其定义域为 Di,D i=ai, bi。一般规定 f(x)在其定义域内只取正值,若不满足,可以将其转换成以下形式,其中 C 是一个正常数。1.1 编码与解码要实现遗传算法首先需要弄清楚如何对求解问题进行编码和解码。对于函数优化问题,一般来说,有两种编码方式,一是实数编码,一是二进制编码,两者各有优缺点,二进制编码具有稳定性高、种群多样性大等优点,但是需要的存储空间大,需要解码过程并且难以理解;而实数编码直接用实数表示基因,容易理解并且不要解码过程,但是容易过早收敛,从而陷入局部最优。本文以最常用的二进制编码为例,说明遗传编码的过
4、程。从遗传算法求解的过程来看,需要处理好两个空间的问题,一个是编码空间,另一个是解空间,如下图所示从解空间到编码空间的映射过程成为编码过程;从编码空间到解空间的映射过程成为解码过程。下面就以求解一个简单的一维函数 f(x) = -(x-1)2+4, x 的取值范围为-1,3 最大值为例,来说明编码及解码过程。编码:在编码之前需要确定求解的精度,在这里,我们设定求解的精度为小数点后四位,即 1e-4。这样可以将每个自变量 xi 的解空间划分为 个等分。以上面这个函数为例,即可以将 x 的解空间划分为(3-(-1)*1e+4=40000 个等分。使 ni 满足,这里 ni 表示使上式成立的最小整数
5、,即表示自变量 xi 的基因串的长度。因为 215 fitness_table(mid)first = mid;elseif r pop(i+1,j);/*交换*/end forend ifend for1.4 变异操作变异操作是对单个个体进行的。首先生成一个随机实数 0 best_fitnessbest_fitness = fitness_value(pop_size);best_generation = G;for j=1:chromo_sizebest_individual(j) = pop(pop_size,j);endendclear i;clear j;clear k;clear
6、min;clear temp;clear temp1;选择操作:%轮盘赌选择操作%pop_size: 种群大小%chromo_size: 染色体长度%cross_rate: 是否精英选择function selection(pop_size, chromo_size, elitism)global pop;global fitness_table;for i=1:pop_sizer = rand * fitness_table(pop_size);first = 1;last = pop_size;mid = round(last+first)/2);idx = -1;while (first
7、 fitness_table(mid)first = mid;elseif r fitness_table(mid)last = mid; elseidx = mid;break;endmid = round(last+first)/2);if (last - first) = 1idx = last;break;endendfor j=1:chromo_sizepop_new(i,j)=pop(idx,j);endendif elitismp = pop_size-1;elsep = pop_size;endfor i=1:pfor j=1:chromo_sizepop(i,j) = pop
8、_new(i,j);endendclear i;clear j;clear pop_new;clear first;clear last;clear idx;clear mid;交叉操作:%单点交叉操作%pop_size: 种群大小%chromo_size: 染色体长度%cross_rate: 交叉概率function crossover(pop_size, chromo_size, cross_rate)global pop;for i=1:2:pop_sizeif(rand cross_rate)cross_pos = round(rand * chromo_size);if or (cr
9、oss_pos = 0, cross_pos = 1)continue;endfor j=cross_pos:chromo_sizetemp = pop(i,j);pop(i,j) = pop(i+1,j);pop(i+1,j) = temp;endendendclear i;clear j;clear temp;clear cross_pos;变异操作:%单点变异操作%pop_size: 种群大小%chromo_size: 染色体长度%cross_rate: 变异概率function mutation(pop_size, chromo_size, mutate_rate)global pop
10、;for i=1:pop_sizeif rand mutate_ratemutate_pos = round(rand*chromo_size);if mutate_pos = 0continue;endpop(i,mutate_pos) = 1 - pop(i, mutate_pos);endendclear i;clear mutate_pos;打印算法迭代过程:%打印算法迭代过程%generation_size: 迭代次数function plotGA(generation_size)global fitness_avg;x = 1:1:generation_size;y = fitne
11、ss_avg;plot(x,y)算法主函数:%遗传算法主函数%pop_size: 输入种群大小%chromo_size: 输入染色体长度%generation_size: 输入迭代次数%cross_rate: 输入交叉概率%cross_rate: 输入变异概率%elitism: 输入是否精英选择%m: 输出最佳个体%n: 输出最佳适应度%p: 输出最佳个体出现代%q: 输出最佳个体自变量值function m,n,p,q = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate, eli
12、tism)global G ; %当前代global fitness_value;%当前代适应度矩阵global best_fitness;%历代最佳适应值global fitness_avg;%历代平均适应值矩阵global best_individual;%历代最佳个体global best_generation;%最佳个体出现代fitness_avg = zeros(generation_size,1);disp “hhee“fitness_value(pop_size) = 0.;best_fitness = 0.;best_generation = 0;initilize(pop_s
13、ize, chromo_size);%初始化for G=1:generation_size fitness(pop_size, chromo_size); %计算适应度 rank(pop_size, chromo_size); %对个体按适应度大小进行排序selection(pop_size, chromo_size, elitism);%选择操作crossover(pop_size, chromo_size, cross_rate);%交叉操作mutation(pop_size, chromo_size, mutate_rate);%变异操作endplotGA(generation_size
14、);%打印算法迭代过程m = best_individual;%获得最佳个体n = best_fitness;%获得最佳适应度p = best_generation;%获得最佳个体出现代%获得最佳个体变量值,对不同的优化目标,此处需要改写q = 0.;for j=1:chromo_sizeif best_individual(j) = 1q = q+2(j-1);end endq = -1+q*(3.-(-1.)/(2chromo_size-1);clear i;clear j;2. 案例研究对上一节中的函数进行优化,设置遗传算法相关参数,程序如下function run_ga()elitis
15、m = true;%选择精英操作pop_size = 20;%种群大小chromo_size = 16;%染色体大小generation_size = 200;%迭代次数cross_rate = 0.6;%交叉概率mutate_rate = 0.01;%变异概率m,n,p,q = GeneticAlgorithm(pop_size, chromo_size, generation_size, cross_rate, mutate_rate,elitism);disp “最优个体“mdisp “最优适应度“ndisp “最优个体对应自变量值“qdisp “得到最优结果的代数“pclear;结果如下:“最优个体“m =1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0“最优适应度“n =4.0000“最优个体对应自变量值“q =1.0000“得到最优结果的代数“p =74此结果非常准确。算法迭代过程图形:从上图中可以看出,随着迭代次数的增加,算法逐渐收敛。3. 总结本文详细的介绍了简单遗传算法的实现过程,并以一个简单的函数优化作为案例说明了其应用。但是由于该测试函数过于简单,在实际的应用过程中,还需要对相关参数进行调整,使其效率得到更大的提高。