Проблема алгоритма Fish Swarm

У меня есть проект, чтобы создать очень простой PSO (рыбный рой) на matlab.

Что я сделал до сих пор:

1) Я установил размеры оси,

2) Я создаю рой рыб из 50 рыб со случайными координатами x,y и строю их (координаты роя сохраняются в массиве),

3) Я нажимаю где-нибудь на рисунке и получаю координаты щелчка, которые представляют акулу.

4) Я вычисляю лучшую x,y позицию рыбы, которая является самой отдаленной рыбой.

Теперь я должен заставить остальных рыб приблизиться к лучшему положению рыбы.

Вот код:

Dx=100;
Dy=100;
axis([0 Dx 0 Dy]);
N=50;
K=4;
d=min(Dx,Dy)/K;
click=ginput(1);
fish=zeros(50,4);
i=1;
while i<=N
    x= rand * Dx;
    y= rand * Dy;
    if d>=sqrt((click(1)-x)^2+(click(2)-y)^2)
         fish(i,1)=x;
         fish(i,2)=y;
         hold on;
         plot(x,y,'o'); % fishes
         i=i+1;
    end;
end;

click1=ginput(1);
bestposition=1;
i=1;
while i<=N
    position=sqrt((click1(1)-fish(i,1))^2+(click1(2)-fish(i,2))^2);
    if i==1
        max=position;
    else
        if max<position
            max=position;
            bestposition=i;
        end
    end
    i=i+1;
end

hold on;
plot(click1(1), click1(2), 'r*'); %shark

1 ответ

Я взял ваш код, изменил последнюю половину и добавил к нему:

Dx=100;
Dy=100;
axis([0 Dx 0 Dy]);
N=50;
K=4;
d=min(Dx,Dy)/K;
click=ginput(1);
fish=zeros(50,4);
i=1;
while i<=N
    x= rand * Dx;
    y= rand * Dy;
    if d>=sqrt((click(1)-x)^2+(click(2)-y)^2)
         fish(i,1)=x;
         fish(i,2)=y;
         hold on;
         plot(x,y,'o'); % fishes
         i=i+1;
    end;
end;

click1=ginput(1);
distances = pdist2(click1, fish(:,1:2));
[bestPosition, bestFish] = max(distances);

fish(:,3) = fish(bestFish,1) - fish(:,1);
fish(:,4) = fish(bestFish,2) - fish(:,2);
% I'm assuming this is what the other columns are for
fish(:,3:4) = normr(fish(:,3:4));
% The best fish is going away from the shark
fish(bestFish,3:4) = normr(fish(bestFish,1:2) - click1);

% Let's say the smarm moves 1 +/- .5 each move, and not exactly towards
for i0 = 1:100
    % Towards the best fish
    pause(0.05);
    fish(:,1:2) = fish(:,1:2) + (fish(:,3:4).*(rand(size(fish(:,3:4))) + 1)/10);

    fish(:,3) = fish(bestFish,1) - fish(:,1);
    fish(:,4) = fish(bestFish,2) - fish(:,2);
    % I'm assuming this is what the other columns are for
    fish(:,3:4) = normr(fish(:,3:4));
    fish(bestFish,3:4) = normr(fish(bestFish,1:2) - click1);

    cla;
    plot(fish(:,1), fish(:,2), 'o')
    plot(fish(bestFish,1), fish(bestFish,2), 'rO');
    plot(click1(1), click1(2), 'kO');
end

Я выполнил ваши шаги 1-4, а затем сделал псевдо-анимацию, показывающую движение рыбы.

Это то, что вы пытаетесь сделать?

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