一、遗传算法定义
遗传算法借鉴达尔文的进化论“物竞天择,适者生存”,模仿自然界生物进化的随机全局搜索和优化方法。它是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程以求得最优解。
二、相关术语
1、种群:生物的进化以群体的形式进行,这样的一个群体称为种群。
2、个体:组成种群的单个生物
3、基因:一个遗传因子
4、染色体:包含一组的基因
5、进化:种群逐渐适应生存环境,品质不断得到改良。生物的进化是以种群的形式进行的。
6、适应度:度量某个物种对于生存环境的适应程度。
7、选择:以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程。
8、交叉:两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;
9、变异:新产生的染色体中的基因会以很小的概率发生改变。如:以二进制编码的基因某些位由0变1
10、编码:需要将问题的解编码成字符串的形式才能用遗传算法解。最简单的编码方式是二进制编码。
11、选择:选择一些染色体来产生下一代。一种常用的选择策略是“比例选择”,也就是个体被选中的概率与其适应度函数值成正比。例:轮盘赌算法。
三、遗传算法流程图
四、算法实现
1、matlab
编码
function [bin_gen,bits] = encoding(min_var, max_var, scale_var, popsize)
bits = ceil(log2((max_var - min_var)./scale_var));
bin_gen = randi([0,1],popsize, sum(bits));
解码
function [var_gen,fitness] = decoding(bin_gen, bits, min_var, max_var)
num_var = length(bits);
popsize = size(bin_gen, 1);
scale_dec = (max_var - min_var)./(2.^bits - 1);
bits = cumsum(bits);
bits = [0 bits];
for i = 1:num_var
bin_var{i} = bin_gen(:,bits(i) + 1:bits(i + 1));
var{i} = sum(ones(popsize,1)*2.^(size(bin_var{i}, 2) - 1:-1:0).*bin_var{i},2).*scale_dec(i) + min_var(i);
end
var_gen = [var{1,:}];
fitness = [];
for i = 1:popsize
fitness = [fitness;f(var_gen(i,:))];
end
交叉
function new_gen = crossover(old_gen,pc)
[nouse,mating] = sort(rand(size(old_gen,1),1));
mat_gen = old_gen(mating,:);
pairs = size(mat_gen,1)/2;
bits = size(mat_gen,2);
cpairs = rand(pairs,1) < pc;
cpoints = randi([1,bits],pairs,1);
cpoints = cpairs.*cpoints;
for i = 1:pairs
new_gen([2 * i - 1 2 * i], :) = [mat_gen([2 * i - 1 2 * i],1:cpoints(i)) mat_gen([2 * i 2 * i - 1],cpoints(i) + 1:bits)];
end
变异
function new_gen = mutation(old_gen,pm)
mpoints = find(rand(size(old_gen)) < pm);
new_gen = old_gen;
new_gen(mpoints) = 1-old_gen(mpoints);
选择
function [evo_gen, best_indiv, max_fitness, index1] = selection(old_gen,fitness)
popsize = length(fitness);
[max_fitness,index1] = max(fitness);[min_fintness,index2] = min(fitness);
best_indiv = old_gen(index1,:);
index = [1:popsize];index(index1) = 0;index(index2) = 0;
index = nonzeros(index);
evo_gen = old_gen(index,:);
evo_fitness = fitness(index,:);
evo_popsize = popsize-2;
ps = evo_fitness/sum(evo_fitness);
pscum = cumsum(ps);
r = rand(1,evo_popsize);
selected = sum(pscum*ones(1,evo_popsize) < ones(evo_popsize,1)*r) + 1;
evo_gen = evo_gen(selected,:);
目标函数
function y = f(x)
y = 21.5 + x(1) * sin(4 * pi * x(1)) + x(2) * sin(20 * pi * x(2));
主函数
function ans = main()
min_var = [-3.0,4.1];
max_var = [12.1,5.8];
scale_var = 0.0001;
popsize = 50;
pc = 0.8;
pm = 0.15;
gen = 500;
ans = [];
[bin_gen,bits] = encoding(min_var, max_var, scale_var, popsize);
for g = 1:gen
[var_gen,fitness] = decoding(bin_gen, bits, min_var, max_var);
[evo_gen, best_indiv, max_fitness, maxindex] = selection(bin_gen,fitness);
ans = [ans;var_gen(maxindex,:), max_fitness];
new_gen = crossover(evo_gen,pc);
new_gen = mutation(new_gen,pm);
bin_gen = [best_indiv;new_gen;best_indiv];
end
2、c++
https://github.com/chasedreaming/genetic-algorithm