Проблема алгоритма 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, а затем сделал псевдо-анимацию, показывающую движение рыбы.
Это то, что вы пытаетесь сделать?