%7.gyakorlat
%járványterjedés rácson (sejtautomata)
N = 100; %rács mérete
figure;

itnum=150; %iteráció száma
dieAfter = 10;%200;% %ennyi beteggént töltött iteráció után hal meg az ágens
%ha nem akarunk halott cellákat, tegyük magasabbra, mint az itercáciszám 
initialInfection = 0.001; %kezdeti fertõzöttségi valség
infectionRate=0.9; %1-fertõzési ráta (egy szomszédra) 
% itt a kisebb érték jelent fertõzõbb betegséget! (azért, hogy több szomszéd fertõzési kísérletei összeadhatók legyenek)
healRate=0.1; %felgyógyulás valsége iterációnként
immunityLoss=0.01; %immunitás vesztésének valsége iterációnként
%0.9; 0.1; 0.0: gyenge járvány, immunis marad: járvány hullámfront
%0.9; 0.1; 0.01: gyenge járvány, immunitás lassanként múlik: járvány hullámfront
%0.9; 0.1; 0.1: gyenge járvány, immunitás múlik: járvány hullámfront + hátramaradó járvány gócok
%0.99; 0.1; 0.1: nagyon gyenge járvány, immunitás múlik: járvány hullámfront + immunitás hullámfront, mögötte fertõzhetõk megint
%0.1; 0.1; 0.0: erõs járvány, gyorsan terjed egyenes szögletes frontokban
%0.1; 0.5; 0.0: erõs járvány, gyorsan terjed egyenes szögletes frontokban, de gyorsan fel is gyógyulnak belõle
%0.1; 0.5; 0.1: erõs járvány, gyorsan terjed, gyógyultak immunitást vesztenek, állandóan vannak fertõzöttek
%0.5; 0.1; 0.1: erõs járvány, immunitás elveszhet, a front mögött is van még a betegség
%0.5; 0.1; 0.9: erõs járvány, gyorsan terjed, gyógyultak újra fertõzõdnek, sokat irt ki
%0.5; 0.0; 0.1: nem gyógyulnak, mindenki meghal

%a széleken mindenki immunis -> ez maga a fix határ
pop = zeros(N+2); 
%a pop mátrix maga rács: minden eleme egy-egy ágens
%az elemek értéke mondja meg milyen állapotú az ágens:
%0=immunis
%1=egészséges
%dieAfter=halott
%1<x<dieAfter=beteg különbözõ szintjei (betegség kezdetén 2 aztán iterációnként 1-gyel nõ az értéke)

%colormap készítése a kirajzoláshoz -> kirajzolásnál színek jelzik az egyes állapotokat
map = zeros(dieAfter+2,3);
map(1,:) = [0 1 0]; % 0=immunis -> zöld 
map(2,:) = [1 1 1]; % 1=fertõzhetõ -> fehér 
map(3:end, 1) = flipud(linspace(1,0,size(map(3:end, 1),1))); % piros egyre sötétebb árnyalatai (a feketéig= halott)

%kezdetben mindenki egészséges, -> néhány beteg lesz random helyeken
pop(2:N+1,2:N+1) = ones(N) + (rand(N) < initialInfection); 

%temporary array létrehozása-> 
%mindig egyszerre (az iteráció végén) frissítsük az egész rácsot, ne számítson milyen sorrendben vizsgáljuk a cellákat 
newpop  = pop;

%statisztikák: minden iterációban eltárolom a különbözõ állapotú sejtek számát
s=zeros(1,itnum); %fertõzhetõ
b=zeros(1,itnum); %beteg
r=zeros(1,itnum); %immunis
d=zeros(1,itnum); %halott

for t= 1:itnum %iteráció
    %aktuális állapot kirajzolása (fix színskálán)
    imagesc(pop,[0 dieAfter+2]);
    colormap(map);
    title(['itráció: ',num2str(t)])
    
   %végigmegyünk a cellákon (a peremen kívül)
    for i=2:N+1 
       for j=2:N+1
          guy=pop(i, j); %az egyed állpota, akit vizsgálunk
          newguy=newpop(i, j); %az egyed új állapota: alapból nem változik
          
          %viselkedési szabályok:
          if guy>=dieAfter %ha halott, úgy marad
              
          elseif guy==0 %ha immunis
              %az immunitást itt el is elvesztheti az ágens: 
              %random számot generálunk (0,1 közt), ha <, mint a küszöbérték -> elveszti az immunitást
              if rand<immunityLoss    
                 newguy=1; 
              end
              
          elseif guy==1 %ha fertõzhetõ
              %megszámolom, hogy az 1 sugarú környezetében kik az élõ fertõzöttek
              korny=0;
              for i1=-1:1
                  for j1=-1:1
                      i_korny=i+i1;
                      j_korny=j+j1;
                      if pop(i_korny, j_korny)>1 && pop(i_korny, j_korny)<dieAfter
                          korny=korny+1;
                      end
                  end
              end
              %megfertõzõdhet az õt körbevevõ fertõzöttek számától függõen
              %ha (betegek száma)*(random érték)>infectionRate -> állapot 2-es lesz 
              if korny*rand>infectionRate 
                  newguy=2;
              end
              
          elseif guy>1 % ha beteg
              if rand<healRate % bizonyos valószínûséggel meggyógyul és immunis lesz
                  newguy=0;
              else
                  newguy=guy+1; %ha nem gyógyult meg, még betegebb lesz 1-gyel
              end
          end
          
          newpop(i,j)=newguy; %frissítem a cellát az aktuális értékére
       end
   end
    
    %waitforbuttonpress; %ha kézzel akarunk léptetni
    pause(0.1); %iteráció közt eltelõ idõ (sec), hogy lássuk a folyamatot 
    %az egész populáció frissítése
    pop = newpop;
    
    %statisztikák: minden iterációban megszámolonm és eltárolom a különbözõ állapotú sejtek számát
    s(1,t)=length(find(pop==1));
    b(1,t)=length(find(pop<dieAfter & pop>1));
    r(1,t)=length(find(pop==0));
    d(1,t)=length(find(pop==dieAfter));
end

%a statisztikák kirajzolása: az egyes állapotok arány az össze cellához képest az idõ (iteráció szám) függvényében 
figure;
t=1:itnum;
plot(t, s/(N^2), 'b', t, b/(N^2), 'r', t, r/(N^2), 'g', t, d/(N^2), 'k');
xlabel('lépés');
ylabel('állapot aránya');
legend('fertõzhetõ', 'beteg', 'immunis', 'halott');