Алгоритм функции вычисления положения объектов на острове
Рисунок 2 Общая схема Рисунок 3 Поведение кроликов
Алгоритм инициализации
Листинг программы unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, jpeg, ImgList, TeEngine, Series, TeeProcs, Chart;
type TForm1 = class(TForm) Image1: TImage; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; Timer1: TTimer; ImageList1: TImageList; Label3: TLabel; Edit1: TEdit; Label4: TLabel; Label5: TLabel; Image3: TImage; Edit2: TEdit; Image4: TImage; Label6: TLabel; Edit3: TEdit; Label7: TLabel; Edit4: TEdit; Label8: TLabel; Edit5: TEdit; Label9: TLabel; Edit6: TEdit; Edit7: TEdit; Image2: TImage; Image5: TImage; Image6: TImage; Image7: TImage; Label11: TLabel; Label12: TLabel; Label13: TLabel; Button3: TButton; Label14: TLabel; Edit8: TEdit; Timer2: TTimer; Label10: TLabel; Chart1: TChart; Series1: TFastLineSeries; Series2: TFastLineSeries; Button4: TButton; procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure print; procedure logic; procedure Timer2Timer(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; vis: boolean; ks,ms,fs,dt:integer; //стартовое число кроликов, волков, волчиц kk,gk, pk,lk:real; //любвеобильность кроликов,нажористость кроликов, потери на переход по клеткам, выносливость волков
im:array[1..20,1..20] of TImage; sm:array[0..21,0..21] of real; ha:array[1..20,1..20] of boolean; sa:array[1..20,1..20] of real;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin vis:=true; timer1.Enabled:=true; end;
procedure tform1.logic; var i,j,ii,jj,t,s,t1,t2,i1,j1,l:integer; begin randomize; for I:= 1 to 20 do for j:= 1 to 20 do ha[i,j]:=true; for I:= 1 to 20 do for j:= 1 to 20 do if ha[i,j] then begin case round(sm[i,j]) of 1: begin if random(1000)<round(1000*kk) then begin s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1 end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]=0) or (s>20); if s<19 then begin sm[ii,jj]:=1; sm[i,j]:=1; ha[ii,jj]:=false; end; end else begin s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1 end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]=0) or (s>20); if s<19 then begin if random(9000)>1000 then begin sm[i,j]:=0; ha[ii,jj]:=false; sm[ii,jj]:=1; end; end; end; end; 4: begin if random(1000)>-500 then begin s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1 end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]<4) or (s>20); if s<20 then
if sm[ii,jj]=1 then sm[ii,jj]:=200+sa[i,j]/3+gk-pk else sm[ii,jj]:=200+sa[i,j]/3-pk;
ha[ii,jj]:=false; s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1; end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]<4) or (s>20); if s<20 then
if sm[ii,jj]=1 then sm[ii,jj]:=100+sa[i,j]/3+gk-pk else sm[ii,jj]:=100+sa[i,j]/3-pk; ha[ii,jj]:=false;
end else begin s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1 end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]<4) or (s>20); if s<20 then
if sm[ii,jj]=1 then sm[ii,jj]:=100+sa[i,j]/3+gk-pk else sm[ii,jj]:=100+sa[i,j]/3-pk; ha[ii,jj]:=false; s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1 end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]<4) or (s>20); if s<20 then
if sm[ii,jj]=1 then sm[ii,jj]:=200+sa[i,j]/3+gk-pk else
sm[ii,jj]:=200+sa[i,j]/3-pk; ha[ii,jj]:=false end;
if random(1000)>500 then sm[i,j]:=100+ +sa[i,j]/3 else sm[i,j]:=200+sa[i,j]/3;
end;
else
begin if (sm[i,j]>100+lk) and (sm[i,j]<190) then sm[i,j]:=100+lk; if (sm[i,j]>200+lk) and (sm[i,j]<290) then sm[i,j]:=200+lk; if sm[i,j]>99 then begin if (sm[i,j]>99.9) and (sm[i,j]<100.1) then sm[i,j]:=0; if (sm[i,j]>199.9) and (sm[i,j]<200.1) then sm[i,j]:=0; end; if (sm[i,j]>100) and (sm[i,j]<200) then begin t1:=0; t2:=0; l:=0; repeat i1:=round((-1000+random(2000))/1000); j1:=round((-1000+random(2000))/1000); if sm[i+i1,j+j1]=1 then begin t1:=i1; t2:=j1; end; l:=l+1; until ((t1<>0) and (t2<>0)) or (l>20); if l<20 then begin sm[i+t1,j+t2]:=sm[i,j]+gk; ha[i+t1,j+t2]:=false; sm[i,j]:=0; end else begin t1:=0; t2:=0; l:=0; repeat i1:=round((-1000+random(2000))/1000); j1:=round((-1000+random(2000))/1000); if sm[i+i1,j+j1]>200 then begin t1:=i1; t2:=j1; end; l:=l+1; until ((t1<>0) and (t2<>0)) or (l>20); if l<20 then begin sa[i+t1,j+t2]:=sm[i,j]+sm[i+t1,j+t2]-300; sm[i+t1,j+t2]:=4; ha[i+t1,j+t2]:=false; sm[i,j]:=0; end else begin s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1 end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]=0) or (s>20); if s<20 then begin sm[ii,jj]:=sm[i,j]-pk; ha[ii,jj]:=false; sm[i,j]:=0; end; end; end; end else begin if (sm[i,j]>200) and (sm[i,j]<300) then begin t1:=0; t2:=0; l:=0; repeat i1:=round((-1000+random(2000))/1000); j1:=round((-1000+random(2000))/1000); if sm[i+i1,j+j1]=1 then begin t1:=i1; t2:=j1; end; l:=l+1; until ((t1<>0) and (t2<>0)) or (l>20); if l<20 then begin sm[i+t1,j+t2]:=sm[i,j]+gk; sm[i,j]:=0; ha[i+t1,j+t2]:=false; end else begin t1:=0; t2:=0; l:=0; repeat i1:=round((-1000+random(2000))/1000); j1:=round((-1000+random(2000))/1000); if (sm[i+i1,j+j1]>100) and (sm[i+i1,j+j1]<200) then begin t1:=i1; t2:=j1; end; l:=l+1; until ((t1<>0) and (t2<>0)) or (l>20); if l<20 then begin sa[i+t1,j+t2]:=sm[i,j]+sm[i+t1,j+t2]-300; sm[i+t1,j+t2]:=4; ha[i+t1,j+t2]:=false; sm[i,j]:=0; end else begin s:=0; repeat s:=s+1; ii:=i; jj:=j; case ii of 1: ii:=ii+1; 20: ii:=ii-1; else begin if random(1000)>500 then ii:=ii+1 else ii:=ii-1 end; end; case jj of 1: jj:=jj+1; 20: jj:=jj-1; else begin if random(1000)>500 then jj:=jj+1 else jj:=jj-1 end; end; until (sm[ii,jj]=0) or (s>20); if s<20 then begin sm[ii,jj]:=sm[i,j]-pk; ha[ii,jj]:=false; sm[i,j]:=0; end; end; end; end end; end; end; end; label11.Caption:='0'; label12.Caption:='0'; label13.Caption:='0';
for i:= 1 to 20 do for j:= 1 to 20 do begin if sm[i,j]=1 then label11.Caption:=inttostr(strtoint(label11.Caption)+1); if (sm[i,j]>100) and (sm[i,j]<190) then label12.Caption:=inttostr(strtoint(label12.Caption)+1); if (sm[i,j]>200) and (sm[i,j]<290) then label13.Caption:=inttostr(strtoint(label13.Caption)+1); if sm[i,j]=4 then label12.Caption:=inttostr(strtoint(label12.Caption)+1); if sm[i,j]=4 then label13.Caption:=inttostr(strtoint(label13.Caption)+1); end; series1.AddY(strtoint(label11.Caption)); series2.AddY(strtoint(label12.Caption)+strtoint(label13.Caption)); end;
procedure tform1.print; var i,j:byte; begin for I:= 1 to 20 do for j:= 1 to 20 do begin case round(sm[i,j]) of 0: im[i,j].Picture.Bitmap.LoadFromResourceName(0,'Bitmap_5'); 1: im[i,j].Picture.Bitmap.LoadFromResourceName(0,'Bitmap_4');
4: im[i,j].Picture.Bitmap.LoadFromResourceName(0,'Bitmap_1'); end; if sm[i,j]>100 then im[i,j].Picture.Bitmap.LoadFromResourceName(0,'Bitmap_3'); if sm[i,j]>200 then im[i,j].Picture.Bitmap.LoadFromResourceName(0,'Bitmap_2');
end; end;
procedure TForm1.Button2Click(Sender: TObject); begin vis:=false; timer1.Enabled:=true; button2.Visible:=false; end;
procedure TForm1.Button3Click(Sender: TObject); var i,j,t,tt:integer; begin series1.Clear; series2.Clear; if not timer2.Enabled then begin for I:= 1 to 20 do for j:= 1 to 20 do sm[i,j]:=0; randomize; ks:=strtoint(edit1.Text); ms:=strtoint(edit2.Text); fs:=strtoint(edit3.Text); kk:=strtofloat(edit4.Text); gk:=strtofloat(edit5.Text); pk:=strtofloat(edit6.Text); lk:=strtofloat(edit7.Text); if lk>80 then begin lk:=80; showmessage('Не бывает таких пузатых волков'); end; dt:=strtoint(edit8.Text);
for i:= 1 to ms do begin t:=random(19)+1; tt:=random(19)+1; while sm[t,tt]<>0 do begin t:=random(19)+1; tt:=random(19)+1; end; sm[t,tt]:=101; end; for i:= 1 to fs do begin t:=random(19)+1; tt:=random(19)+1; while sm[t,tt]<>0 do begin t:=random(19)+1; tt:=random(19)+1; end; sm[t,tt]:=201; end; for i:= 1 to ks do begin t:=random(19)+1; tt:=random(19)+1; while sm[t,tt]<>0 do begin t:=random(19)+1; tt:=random(19)+1; end; sm[t,tt]:=1; end; timer2.Interval:=dt; timer2.Enabled:=true; end
else timer2.Enabled:=false;
end;
procedure TForm1.Button4Click(Sender: TObject); begin chart1.Visible:=not chart1.Visible; end;
procedure TForm1.FormShow(Sender: TObject); var i,j:byte; begin vis:=false; for I:= 1 to 20 do for j:= 1 to 20 do begin im[i,j]:=timage.Create(self); im[i,j].Top:=(i-1)*32; im[i,j].left:=(j-1)*32; im[i,j].Width:=32; im[i,j].Height:=32; im[i,j].Transparent:=true; im[i,j].Parent:=form1; im[i,j].Stretch:=true; end;
end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if vis then begin if panel1.Top<639 then panel1.Top:= panel1.Top+3 else begin vis:=false; timer1.Enabled:=false; button2.Visible:=true; end; end else begin if panel1.Top>522 then panel1.Top:= panel1.Top-3 else begin vis:=true; timer1.Enabled:=false;
end; end;
end;
procedure TForm1.Timer2Timer(Sender: TObject); begin logic; print; end;
end. Рисунок 4 Результат моделирования Вывод Выполнив данную курсовую работу я построила модель поведения популяций хищник-жертва в замкнутой среде а также реализовала построенную модель в виде программы для ПК в среде Delphi. Результаты моделирование Показали результаты схоже с аналитическими решениями однако с некоторыми неустойчивостями вызванными дискретизацией среды. По результатам выпаленной работы я приобрела опыт в моделировании систем а также закрепила навык в проектировании разработки ПО.
|