% BULLIES & DWEEBS
% copyright by R.J. Marks II "My software ain't purdy but she works".
%
% There are bullies and dweebs. Bullies (red diamonds) try to kill the Dweebs (blue squares).
% White +'s correspond to dead Dweebs.
% There are two simple rules and an option.
% RULE 1: Each Dweeb determines the closest bully and takes a step away.
% RULE 2: Each Bully determines the closest Dweeb and takes a step towards.
% Both Bullies and Dweebs can have "twiddle" (or jitter). At a specified probabability
% Many emerging features occur:
% 1. Dweeb flocking
% 2a. Bully stacking (occurs with no Bully twiddle. This makes the bullies less effective).
% 2b. Bully Mobs (occurs with Bully twiddle).
% 3. Team Work - two or more Bullies work effectively when closing in on a flock of Dweebs from differenct sides.
% 4. Cornering - Bullies get Dweebs by cornering them - or backing them against a wall.
% 5. Voronoi Partitioning emerges naturally. Set the variable "vor" to 1 to keep the Bullies stationary.
% The Dweebs then line up on the Voronoi partitioning boundaries.
% 6. Corner massacres (especially if there is no Dweeb twiddle.) Mid field massacres nomally require "cooperating"
% Bullies.
%
% PARAMETERS (must be changed in m-file)
% NX, NY = dimensions of the playground.
% bullies = number of Bullies;
% dweebs = number of Dweebs
% ann = probability of a Dweeb random step up, down, left and right. If =1/2, there is always a random step.
% btwidle = probability of a Bully random step up, down, left and right
% bcorx & bcory = if either is >0 all bullies start at one point at percentage of field.
% Example: Setting both = 0.5 stacks all the Bullies in the field middle.
% Otherwise, the bully spacing is random.
% dcorx & dcory = same for Dweebs.
% flicks = if greater than zero, a movie is made and played "flicks" times. 1/2 makes a movie that doesn't play
% generations = number of steps in the bullies-dweeb game.
% mpeg = 1 makes an MPG of the movie. Requires the Matlab software mpgwrite.m
% vor = a zero flag, when set to one, paralyzes the bullies. Voronoi partitioning results.
% bins = number of bins in a log-log histogram of Dweeb deaths. If set to zero, no histogram is made.
% dweebplots = 1 gives plots of Dweeb count (in 'dweebcount') and Dweeb deaths (in 'D').
close all
clear all
%
% PARAMETERS
NX=50; NY=50; % This is the size of the matrix where the Bullies & Dweebs game takes place.
generations=75; % The number of steps each Dweeb and each Bully take.
double=0; % Leave at 0. If double =1, then each dweeb and each bully update is viewed.
bullies=25; % Number of Bullies
dweebs=1500; % Number of Dweebs
ann=1/6; % dweeb twiddle (< 0.5)
btwidle=1/6; % bully twiddle (<0.5)
bcorx=0;bcory=0; % if >0 starts all bullies at one point at percentage of field. Otherwise, randomly spacing.
% Example: Setting both = 0.5 stacks all the Bullies in the middle.
dcorx=0;dcory=0; % if >0 starts all dweebs at one point at percentage of field. Otherwise, they are random.
flicks=3; % when the program is over, this is how many times the movie is played.
mpeg=0; % generates and mpg file when done. Requires the code mpgwrite.m
bins=0;
vor=0; % set to 1 to immobilize the bullies. Voronoi Partitioning results.
dweebplots=1; % gives dreeplots at the end
%
% INITIALIZE
Playground=ones(NX+5,NY);
frame=1;
dweebstatus=ones(dweebs,1);
deaddweebx=zeros(dweebs,1);
deaddweeby=zeros(dweebs,1);
if(bcorx+bcory==0); bullyx=ceil(NX*rand(bullies,1)); bullyy=ceil(NY*rand(bullies,1));
else
bullyx=(floor(bcory*NX)+1)*ones(bullies,1); bullyy=floor((bcory*NY)+1)*ones(bullies,1);
end
if(dcorx+dcory==0);dweebx=ceil(NX*rand(dweebs,1)); dweeby=ceil(NY*rand(dweebs,1));
else
dweebx=floor((dcorx*NX)+1)*ones(dweebs,1); dweeby=floor((dcory*NY)+1)*ones(dweebs,1);
end
dweeprepx=repmat(dweebx,1,bullies);dweeprepy=repmat(dweeby,1,bullies);
dweebcount=zeros(generations,1);
%
% GENERATIONS
for g=1:generations
bullrepx=repmat(bullyx,1,dweebs);bullrepy=repmat(bullyy,1,dweebs);
ddx=bullrepx-dweeprepx'; ddy=bullrepy-dweeprepy';
distMAT=ddx.*ddx+ddy.*ddy;
[y,j]=min(distMAT);% j is index vector of closest bully
for i=1:dweebs %dweebs running
if(dweebstatus(i)==1)
for n=1:bullies % Checking for new capture
if(bullyx(n)==dweebx(i))
if(bullyy(n)==dweeby(i))
dweebstatus(i)=0;
deaddweebx(i)=dweebx(i);deaddweeby(i)=dweeby(i);
dweebx(i)=10*NX; dweeby(i)==10*NY;
break
end
if(dweebstatus(i)==0); break; end
end
end
if(dweebstatus(i)==1)
vecx=sign(dweebx(i)-bullyx(j(i)));vecy=sign(dweeby(i)-bullyy(j(i)));
rr=rand;dweebx(i)=dweebx(i)+vecx+ceil(ann-rr)-ceil(rr-1+ann);
rr=rand; dweeby(i)=dweeby(i)+vecy+ceil(ann-rr)-ceil(rr-1+ann);
if(dweebx(i)>NX);dweebx(i)=NX; end; if(dweebx(i)<1);dweebx(i)=1; end
if(dweeby(i)>NY);dweeby(i)=NY; end; if(dweeby(i)<1);dweeby(i)=1; end
end
end
end
%display
if(double==1)
imagesc(Playground);
hold on
for n=1:dweebs;
if(dweebstatus(n)==1);
plot(dweebx(n),dweeby(n),'bs');hold on;
else
plot(deaddweebx(n), deaddweeby(n),'w+');hold on;
end;
end
for n=1:bullies; plot(bullyx(n),bullyy(n),'rd');hold on; end
title(g);
if(flicks==0)
M=getframe;
else
M(frame)=getframe;
end
hold off;
frame=frame+1;
end
dweeprepx=repmat(dweebx,1,bullies);dweeprepy=repmat(dweeby,1,bullies);
ddx=bullrepx-dweeprepx'; ddy=bullrepy-dweeprepy';
distMAT=ddx.*ddx+ddy.*ddy;
[y,jj]=min(distMAT');% jj is index vector of closest dweeb
if(vor==0)
for i=1:bullies
vecx=sign(dweebx(jj(i))-bullyx(i));vecy=sign(dweeby(jj(i))-bullyy(i));
rr=rand;bullyx(i)=bullyx(i)+vecx+ceil(btwidle-rr)-ceil(rr-1+btwidle);
rr=rand;bullyy(i)=bullyy(i)+vecy+ceil(btwidle-rr)-ceil(rr-1+btwidle);
if(bullyx(i)>NX);bullyx(i)=NX; end; if(bullyx(i)<1);bullyx(i)=1; end
if(bullyy(i)>NY);dweeby(i)=NY; end; if(bullyy(i)<1);dweeby(i)=1; end
end
end
imagesc(Playground);
hold on
for n=1:dweebs;
if(dweebstatus(n)==1);
plot(dweebx(n),dweeby(n),'bs');hold on;
else
plot(deaddweebx(n), deaddweeby(n),'w+');hold on;
end;
end
for n=1:bullies; plot(bullyx(n),bullyy(n),'rd');hold on; end
title(g);
M(frame)=getframe;
hold off
frame=frame+1;
% Checking for captures
if(min(jj)==0)
for n=1:dweebs
if(jj(n)==0)
dweebstatus(n)=0;
end
end
end
dweebcount(g)=sum(dweebstatus);
if(dweebcount(g)==0); break; end
end %generations
figure
title('Bullies & Dweebs')
if(flicks>=1)
movie(M,flicks)
end
if(mpeg==1)
mpgwrite(M,colormap,'Dweebs & Bullies')
end
if(dweebplots==1)
figure
plot(dweebcount);titie('Dweeb Count')
figure
D=-diff(dweebcount)
plot(D);titie('Dweeb Deaths Each Generation')
end
% Generating log-log histogram
if(bins>5)
fell=-diff(dweebcount);
histlow=min(fell)+3; % Low Point of log-log histogram
histhi=max(fell)+1; % High Point of log-log histogram
rati=histhi/histlow;
histog=ones(bins+1,1);
for g=1:generations-1
for b=1:bins+1
if(and(histlow*(rati^((b-1)/bins))<fell(g),fell(g)<=histlow*(rati^(b/bins))))
histog(b)=histog(b)+1;
break
end
end
end
figure
semilogy(histog);title('Log-Log Dead Dweeb Histogram');
end