% Simulate sharks and fish
% Inputs (run sfinit to get a sample set of inputs)
% d = size of square, toroidally connected ocean
% n = number of time steps to simulate
% ofish(d,d) = initial distribution of fish (1 for fish, 0 for no fish)
% oshark(d,d) = initial distribution of sharks (1 for shark, 0 for no shark)
%
% Output
% plot of shark ('+') and fish ('o') at the end of every time step
% (computation pauses after every plot; hit return to continue)
%
% Other routines used:
% UpdateBoundaries
% GetSharkDirection
% StarveAgeSharks
% UpdateBoundaries
% MoveSharkRight
% MoveSharkLeft
% MoveSharkUp
% MoveSharkDown
% GetFishDirection
% AgeFish
% UpdateBoundaries
% MoveFishRight
% MoveFishLeft
% MoveFishUp
% MoveFishDown
% PlotSharkFish
%
% Main data structures:
%
% shark(i,j) = 1 if shark present at (i,j), 0 otherwise
% sharkage(i,j) = age of shark at (i,j), 0 if none present
% sharkeat(i,j) = time since shark's last meal, 0 if none present
% fish(i,j) = 1 if fish present at (i,j), 0 otherwise
% fishage(i,j) = age of fish at (i,j), 0 if none present
%
% All these are of dimension d+2 by d+2, with an extra row and column
% on all edges to accomodate toroidal connection
%
% Rules of the system
%
% At each time step, first the sharks are updated and then the fish.
%
% For each shark, a direction is computed, which includes
% a random vector
% an "electrostatic" attraction (proportional to SHARKATTRACT) to all
% the fish
% an attraction to any fish who are nearest neighbors (proportional
% to EATNOW)
% If the shark can't move in the desired direction, it stays put.
% If the age of the shark exceeds SBREED, and it moves, it leaves a new shark behind.
% If a shark has not eaten for STARVE time steps, it dies.
%
% For each fish, a direction is computed, which includes
% a random vector
% an "electrostatic" repulsion (proportional to FISHREPEL) away from all
% the shark
% If the fish can't move in the desired direction, it stays put.
% If the age of the fish exceeds FBREED, and it moves, it leaves a new fish behind.
%
% Initialize fish and shark data
fish=[zeros(1,d+2);[zeros(d,1),ofish,zeros(d,1)];zeros(1,d+2)];
shark=[zeros(1,d+2);[zeros(d,1),oshark,zeros(d,1)];zeros(1,d+2)];
fishage=zeros(d+2,d+2);
sharkage=zeros(d+2,d+2);
sharkeat=zeros(d+2,d+2);
sharkdir=zeros(d+2,d+2);
fishdir=zeros(d+2,d+2);
UpdateBoundaries
%
% Assign constants
rand('normal')
II = sqrt(-1);
% Age at which Sharks breed (sharks breed if they are old enough and can move)
SBREED = 7;
% Age at which Fish breed (fish breed if they are old enough and can move)
FBREED = 0;
% Degree to which fish are ``electrostatically'' repelled by sharks
FISHREPEL = 1;
% Degree to which sharks are ``electrostatically'' attracted by fish
SHARKATTRACT = 2;
% Degree to which a shark wants to each a neighboring fish
EATNOW = 100;
% Length of time a shark can go without eating and without starving
STARVE = 1;
% ZZ stores locations of each cell in ocean as complex number
[XX,YY]=meshgrid(1:d,1:d);
ZZ=XX+II*YY;
% Turn debugging output off; set dbug=1 to turn it on
dbug=0;
%
% Loop over time steps
for i=1:n,
disp(['Computing time step i= ',num2str(i)])
%
UpdateBoundaries
GetSharkDirection
StarveAgeSharks
UpdateBoundaries
MoveSharkRight
MoveSharkLeft
MoveSharkUp
MoveSharkDown
%
GetFishDirection
AgeFish
UpdateBoundaries
MoveFishRight
MoveFishLeft
MoveFishUp
MoveFishDown
%
% Plot output
PlotSharkFish
end