遗传操作:
遗传操作是优选,强势个体的“选择”,个体间交换基因产生新个体的“交叉”,个体基因信息突变产新个体的“变异”;遗传算法中的搜索最优解过程就是模仿生物的这个进化过程,使用遗传算子来实现的;
即有选择算子,交换算子,变异算子。
有空再写‘’‘’‘’‘’‘’‘’‘’
初始化:
% %%初始化
% %输入:chromes_size,dim维数,lb下界,ub上界
% %输出 chromes
function chromes = init_chromes(chromes_size,dim,lb,ub)
chromes = rand(chromes_size,dim)*(ub-lb)+lb;
end
选择:
function [newchromes,newfitness] = selection(chromes,fitness)
weights = 1./fitness;
totalfit = sum(weights);
totalf = weights./totalfit;
index = [];
for i = 1:size(chromes,1)
pick = rand;
while pick == 0
pick = rand;
end
for j = 1:size(chromes,1)
pick = pick - totalf(j);
if pick < 0
index = [index j];
break
end
end
end
newchromes = chromes(index,:);
newfitness = fitness(index);
end
变异
function newchromes = muatation(chromes,pm,lb,ub)
for i = 1:size(chromes,1)
newchromes(i,:) = chromes(i,:);
if (rand < pm)
pos = ceil(rand * size(chromes,2));
newchromes(i,pos) = rand*(ub-lb)+lb;
end
end
end
交换
function newchromes = crossover(chromes, pc)
newchromes = ones(size(chromes));
for i = 1 : size(chromes, 1)
parents = randperm(10,2);
pos = round(rand*size(chromes,2));
if (rand < pc)
newchromes(i,:) = [chromes(parents(1),1:pos),chromes(parents(2),pos+1:size(chromes,2))];
else
newchromes(i,:) = chromes(i,:);
end
end
end
主函数
clear
clc
chromes_size = 20;
dim = 2;
pc = 0.9;
pm = 0.2;
lb = -1;
ub = 1;
maxiter = 1000;
%目标方程
namefunc = 'sphere';
fd = str2func(namefunc);
chromes = init_chromes(chromes_size,dim,lb,ub);
for i = 1:chromes_size
% fitness(i) = feval(fd,chromes);
x = chromes(i, 1);
y = chromes(i, 2);
fitness(i) = sin(x)+cos(y)+0.1*x+0.1*y;
end
[bestfitness,bestindex] = min(fitness);
bestchrome = chromes(bestindex,:);
for iter = 1:maxiter
[chromes,newfitness] = selection(chromes,fitness);
chromes = crossover(chromes,pc);
chromes = muatation(chromes,pm,lb,ub);
for i = 1:chromes_size
x = chromes(i, 1);
y = chromes(i, 2);
fitness(i) = sin(x)+cos(y)+0.1*x+0.1*y;
if bestfitness >fitness(i)
bestfitness = fitness(i);
bestchrome = chromes(i,:);
end
end
trace(iter) = bestfitness;
end
plot(trace)
title('fitness curve')