Мой написанный генетический алгоритм не работает должным образом
Я написал следующую максимизацию GA в Matlab, но когда я запускаю код для минимизации [Beale function]: https://en.wikipedia.org/wiki/Test_functions_for_optimization он не может найти правильный ответ (3, 0.5). Так как мой код работает для максимизации, я попытался минимизировать 1/(1+f(x)) вместо f(x).
Битовая мутация
function Genes = BitMutation(Genes, Pm)
% Mutation on each bit
[row, col] = size(Genes);
for i=1:row*col
if rand < Pm
Genes(i) = ~Genes(i);
end
end
end
Выбор рулетки:
% Roulette Wheel Selection Operator
function NewGenes = RouletteSelection(Genes, Fits, PopSize)
% Cumulative Probability
CumuProb = zeros(1,PopSize);
for i=1:PopSize
CumuProb(i) = sum(Fits(1:i));
end
MaxProb = CumuProb(PopSize);
% New Genes
NewGenes = Genes;
for j=1:PopSize
P = rand * MaxProb;
Ind = find(CumuProb > P,1); % return only the first index
NewGenes(j,:) = Genes(Ind,:);
end
end
выбор одной точки
function Genes = CrossOver(Genes, Pc)
[row, col] = size(Genes);
for i=1:ceil(row/2)
if rand > Pc
continue
end
row1 = randi([1 row]);
row2 = randi([1 row]);
p1 = randi([1 col]);
p2 = randi([1 col]);
if p1 <= p2
TempGene = Genes(row1,p1:p2);
Genes(row1,p1:p2) = Genes(row2,p1:p2);
Genes(row2,p1:p2) = TempGene(1,:);
else
TempGene = Genes(row1,1:p2);
Genes(row1,1:p2) = Genes(row2,1:p2);
Genes(row2,1:p2) = TempGene(1,:);
TempGene = Genes(row1,p1:col);
Genes(row1,p1:col) = Genes(row2,p1:col);
Genes(row2,p1:col) = TempGene(1,:);
end
end
end
основной код:
function [BestFitEver,xmin,GenEver] = ga1(nVar,nBits,lb,ub,ff)
Gen = 200; % Maximum number of generations.
popsize = 1000;
Pc = 0.25; % crossover probability
Pm = 0.05; % Mutation probability
nChrom = nVar*nBits;
Genes = logical(randi([0 1], popsize, nChrom));
BestGenes = zeros(Gen, nChrom);
BestGenesEver = zeros(Gen, nChrom);
BestGene = Genes(1,:);
BestGeneEver = Genes(1,:);
Fits = zeros(popsize,1);
BestFits = zeros(Gen,1);
BestFitsEver = zeros(Gen, 1);
BestFit =0;
BestFitEver =0;
GenEver =0;
for i=1:Gen
x = Decoding(Genes,lb,ub,nVar,nBits);
Fits = ff(x);
BestFit = max(Fits);
GeneRow = find(Fits==BestFit,1); % save only the first index
BestGene = Genes(GeneRow,:);
BestFits(i) = BestFit;
BestGenes(i,:) = BestGene(1,:);
if BestFit > BestFitEver
BestFitEver = BestFit;
BestFitsEver(i) = BestFit;
BestGeneEver(1,:) = BestGene(1,:);
BestGenesEver(i,:) = BestGene(1,:);
GenEver = i;
else
BestFitsEver(i) = BestFitEver;
BestGenesEver(i,:) = BestGeneEver(1,:);
end
Genes = RouletteSelection(Genes, Fits, popsize);
Genes = CrossOver(Genes, Pc); %
Genes = BitMutation(Genes, Pm);
end
xmin = Decoding(BestGeneEver,lb,ub,nVar,nBits);