遗传算法

一、遗传算法定义

遗传算法借鉴达尔文的进化论“物竞天择,适者生存”,模仿自然界生物进化的随机全局搜索和优化方法。它是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程以求得最优解。

二、相关术语

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值