2014-11-15 10 views
5

enter image description hereSimulation auf MATLAB

Ich habe eine Simulation von Ameisen zwischen ihrer Heimat (Blackbox) und Nahrungsmittel (gelber Kasten) bewegt zu machen. Diese dreifarbigen Boxen sind Ameisen. Der Code, den ich geschrieben habe, die Figur zu zeichnen gezeigt folgt:

% background 
background() 

% making ants 
handle = zeros(10,3) 
handle = makingAnts(10) ; 

% moving ants 
movingAnts(hand) 

Funktion Hintergrund:

function background() 

figure 
hold on 
axis equal 
axis([0 100 0 100]) 
pos = rand(1,2).*75 
rectangle('position',[0 0 10 10],'facecolor','k') 
rectangle('position',[pos 25 25],'facecolor','y') 
end 

Funktion machen Ameisen:

function [h] = makingAnts(n) 
    h = zeros(10,3) 
    dia = [2 2] 
    for i = 1:n 
    pos = rand(1,2).* 95 ; 
    h(i,1) = rectangle('position',[pos dia],'facecolor',[0.2 0.6 1]) 
    g1 = get(h(i,1),'position') 
    h(i,2) = rectangle('position',[(g1(1)+2) (g1(2)+2) 2 2],'facecolor',[0.4 1 0.6]) 
    h(i,3) = rectangle('position',[(g1(1)+4) (g1(2)+4) 2 2],'facecolor',[1 0.8 1]) 
    end 
    end 

Jetzt muss ich bewegen die Ameisen. Obwohl ich den Code geschrieben habe, funktioniert es nicht. Ich brauche Hilfe, um die Ameisen zu bewegen.

Der Code, den ich schrieb:

function movingAnts(h) 
% moving 1 ant 
pos = get(h(1),'position') 
m = pos(1) 
n = pos(2) 
    for i = 1:50 
set(h(1),'position',[(m+0.2) (n+0.2) 2 2]) 
pause(0.05) 
end 
    end 
+1

jemand kann erklären, warum Diese Frage hat so viele Upvotes bekommen? – robert

+0

@ franz1 - Wahrscheinlich, weil es ein cooles Problem zu lösen ist, obwohl die Problembeschreibung nicht so ausführlich ist wie die Antworten in diesem Beitrag. – rayryeng

Antwort

2
for i = 1:50 
    set(h(1),'position',[(m+0.2) (n+0.2) 2 2]) 
    pause(0.05) 
end 

Da m, n Konstanten sind, hier können Sie in jeder Iteration die Ameise in die gleiche Position platzieren.

4
figure 
axis([0 100 0 100]) 
rectangle('position',[0 0 5 5],'facecolor','k') 
rectangle('position',[95 95 100 100],'facecolor','y') 
n = 5; 
x = zeros(1,n); 
y = zeros(1,n); 
c = ones(1,n); 
while 1 
    for i = 1 : n 
     h1(i) = rectangle('position',[x(i) y(i) 2 2],'facecolor',[0.2 0.6 1]); 
     g1 = get(h1(i),'position'); 
     h2(i) = rectangle('position',[(g1(1)+2) (g1(2)+2) 2 2],'facecolor',[0.4 1 0.6]); 
     h3(i) = rectangle('position',[(g1(1)+4) (g1(2)+4) 2 2],'facecolor',[1 0.8 1]); 
     x(i) = x(i) + c(i) * randi(4,1); 
     y(i) = y(i) + c(i) * randi(4,1); 
     if x(i) > 100 || y(i) > 100 
      c(i) = -1 * c(i); 
      x(i) = 100; y(i) = 100; 
     end 
     if y(i) < 0 || x(i) < 0 
      c(i) = -1 * c(i); 
      x(i) = 0; y(i) = 0; 
     end 
    end 
    pause(.1) 
    delete(h1,h2,h3); 
end 

enter image description here

4

Wie @ franz1 darauf hingewiesen, das Problem, dass m und n Variablen außerhalb der Schleife sind und daher nicht aktualisiert. Um auf seine/ihre Antwort zu verlängern, hier ist eine mögliche movingAnts.m Funktion:

function movingAnts(h) 
    h = reshape(h,numel(h),[]); 
    for i = 1:50 
     pos = get(h,'position'); 
     % move all ants 
     pos = cellfun(@(x) x+[1,1,0,0], pos, 'UniformOutput', false); 
     set(h,{'position'},pos);   
     drawnow update %display updates 
     pause(0.1); 
    end 
end 

enter image description here

Zusätzlich sollten Sie die Definition von h in makingAnts.m ändern:

h = zeros(n,3);