Мой написанный генетический алгоритм не работает должным образом

Я написал следующую максимизацию 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);

0 ответов

Другие вопросы по тегам