Кто-нибудь может объяснить, насколько этот гибрид PSOGA отличается от обычного GA? - PullRequest
0 голосов
/ 22 октября 2019

Имеет ли этот код мутацию, выделение и кроссовер, точно так же, как оригинальный генетический алгоритм.

После этого гибридный алгоритм (т. Е. PSO с GA) использует все этапы исходного GA или пропускает некоторые

из них. Пожалуйста, скажите мне. Я просто новичок в этом и все еще пытаюсь понять. Спасибо.

%%% Гибридный GA и код PSO

function [gbest, gBestScore, all_scores] = QAP_PSO_GA(CreatePopFcn, FitnessFcn, UpdatePosition, ...
                                        nCity, nPlant, nPopSize, nIters)
    % Set algorithm parameters
    constant = 0.95;
    c1 = 1.5;       %1.4944;    %2;
    c2 = 1.5;       %1.4944;    %2;
    w = 0.792 * constant;
    % Allocate memory and initialize
    gBestScore = inf;
    all_scores = inf * ones(nPopSize, nIters);
    x = CreatePopFcn(nPopSize, nCity);
    v = zeros(nPopSize, nCity);
    pbest = x;
    % update lbest
    cost_p = inf * ones(1, nPopSize);  %feval(FUN, pbest');
    for i=1:nPopSize
        cost_p(i) = FitnessFcn(pbest(i, 1:nPlant));
    end
    lbest = update_lbest(cost_p, pbest, nPopSize);
    for iter = 1 : nIters    
        if mod(iter,1000) == 0
            parents = randperm(nPopSize);
            for i = 1:nPopSize
                x(i,:) = (pbest(i,:) + pbest(parents(i),:))/2;
%                v(i,:) = pbest(parents(i),:) - x(i,:);
%                v(i,:) = (v(i,:) + v(parents(i),:))/2;
            end

        else
            % Update velocity
            v = w*v + c1*rand(nPopSize,nCity).*(pbest-x) + c2*rand(nPopSize,nCity).*(lbest-x);
            % Update position
            x = x + v;
            x = UpdatePosition(x);
        end
        % Update pbest
        cost_x = inf * ones(1, nPopSize);
        for i=1:nPopSize
            cost_x(i) = FitnessFcn(x(i, 1:nPlant));
        end

        s = cost_x<cost_p;
        cost_p = (1-s).*cost_p + s.*cost_x;
        s = repmat(s',1,nCity);
        pbest = (1-s).*pbest + s.*x;
        % update lbest
        lbest = update_lbest(cost_p, pbest, nPopSize);
        % update global best
        all_scores(:, iter) = cost_x;
        [cost,index] = min(cost_p);
        if (cost < gBestScore) 
            gbest = pbest(index, :);
            gBestScore = cost;
        end

        % draw current fitness
        figure(1);
        plot(iter,min(cost_x),'cp','MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',8)
        hold on

        str=strcat('Best fitness: ', num2str(min(cost_x)));
        disp(str);

    end
end
% Function to update lbest
function lbest = update_lbest(cost_p, x, nPopSize)
    sm(1, 1)= cost_p(1, nPopSize);
    sm(1, 2:3)= cost_p(1, 1:2);
    [cost, index] = min(sm);
    if index==1
        lbest(1, :) = x(nPopSize, :);
    else
        lbest(1, :) = x(index-1, :);
    end
    for i = 2:nPopSize-1
        sm(1, 1:3)= cost_p(1, i-1:i+1);
        [cost, index] = min(sm);
        lbest(i, :) = x(i+index-2, :);
    end
    sm(1, 1:2)= cost_p(1, nPopSize-1:nPopSize);
    sm(1, 3)= cost_p(1, 1);
    [cost, index] = min(sm);
    if index==3
        lbest(nPopSize, :) = x(1, :);
    else
        lbest(nPopSize, :) = x(nPopSize-2+index, :);
    end    
end

1 Ответ

0 голосов
/ 22 октября 2019

Если вы новичок в Оптимизации, я рекомендую вам сначала изучить каждый алгоритм по отдельности, затем вы можете изучить, как можно объединить GA и PSO, хотя вы должны обладать базовыми математическими навыками, чтобы понимать операторы этих двух алгоритмов и вДля того чтобы проверить эффективность этих алгоритмов (это то, что действительно имеет значение).

Этот фрагмент кода отвечает за родительский выбор и кроссовер:

            parents = randperm(nPopSize);
            for i = 1:nPopSize
                x(i,:) = (pbest(i,:) + pbest(parents(i),:))/2;
%                v(i,:) = pbest(parents(i),:) - x(i,:);
%                v(i,:) = (v(i,:) + v(parents(i),:))/2;
            end 

Не совсем очевидно, как выполняется выбор randperm (у меня нет опыта работы с Matlab).

И этот код отвечает за обновление скорости и положения каждой частицы:

        % Update velocity
        v = w*v + c1*rand(nPopSize,nCity).*(pbest-x) + c2*rand(nPopSize,nCity).*(lbest-x);
        % Update position
        x = x + v;
        x = UpdatePosition(x); 

В этой версии стратегии обновления скорости используется так называемый Interia-Weight W, что в основном означает, что мы сохраняем историю скорости каждой частицы (не полностью пересчитывая ее).

Стоит отметить, что обновление скорости выполняется чаще, чем кроссовер (каждая 1000 итераций).

...