Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
дока жертва.doc
Скачиваний:
24
Добавлен:
15.12.2018
Размер:
877.06 Кб
Скачать

3. Моделирование

3.1 Формализация задач моделирования

Задачей моделирование является построение кривых численности популяции хищника и жертвы в зависимости от времени при различных начальных условиях, таких как: численность популяций, скорость размножения жертвы, питательность жертвы, затраты на поиск жертвы хищником, плодовитость хищника и т.п. После чего необходимо проанализировать полученные данные. При этом в моделировании четко задана площадь, на которой обитают обе популяции она равна 400м 2 и представляет собой остров, из которого ни хищники не жертвы не могут уйти, из чего вытекает что моделируемая система закрытая.

3.2 Описание предметной области

Исследуемой предметной областью является взаимоотношения двух популяций хищник-жертва в закрытой системе. На некотором острове существуют два биологических вида. Среда стационарна и обеспечивает в неограниченном количестве всем необходимым для жизни один из видов, который будем называть жертвой. Другой вид - хищник также находится в стационарных условиях, но питается лишь особями первого вида. При этом жертва постоянно с заданным промежутком времени размножается без ограничений по количеству еды, ограничивает их численность лишь свободное место на острове. Хищники же вынуждены постоянно ловить жертв и съедать, тратя на поиски силы, если долгое время хищник не может найти жертву он умирает от голода. Однако если хищник не может найти жертву, но ему на вид попадается хищник противоположного пола, они производят потомство.

3.3 Построение математической модели

Моделируемая система состоит из двух множеств объектов, и площадью на которой обитают оба вида:

  1. Жертвы;

  2. Хищники мужского и женского пола.

Обозначим площадь, на которой обитают оба вида как P

Математическая модель «жертвы»

Поведение жертвы описывает параметром ее плодовитости за промежуток времени и площадью, на которой она находится.

Обозначим численность жертвы как G, а коэффициент размножения жертвы kG (вероятность того что за dt жертва произведет одного потомка) тогда прирост численности жертвы можно определить как:

где K число жертв пойманных хищниками

Из чего следует, что численность жертвы определяется как

G=G+dG если G<P+dG-H и

G=P-H если G>P+dG-H

где H это численность жертвы

Поведение отдельной жертвы определяется как: в каждый момент с одинаковой вероятностью 1/9 передвигаются в один из восьми соседних квадратов (за исключением участков, ограниченных береговой линией) или просто сидят неподвижно. Каждая жертва

Математическую модель «Хищников»

Поведение хищников задаётся правилами: Каждая хищница передвигается случайным образом, пока в одном из соседних восьми квадратов не окажется жертва, за которым она охотится. Если хищница и жертва оказываются в одном квадрате, хищница съедает жертву и получает некоторый бонус заданный как kP. В противном случае она теряет kH бонуса.

Хищник с нулевым количеством очков умирают. В начальный момент времени все хищники имеют 1 очко. Хищник ведет себя подобно хищнице до тех пор, пока в соседних квадратах не исчезнут все жертвы; тогда, если хищница находится в одном из восьми близлежащих квадратов, хищник гонится за ней.

Если хищник и хищница окажутся в одном квадрате, и там нет жертвы, которого можно съесть, они производят потомство случайного пола.

Таблица №1 Расшифровка обозначений и диапазоны значений.

Обозначение

Расшифровка

Диапазон значений

P

Площадь острова

400

G

Численность жертвы

0..400

K

Число жертв пойманных хищниками

0..400

kG

Число потомков, произведённое одной жертвой промежуток времени

0..1

Н

Численность жертвы

0..400

kP

Бонус за съедание одной жертвы хищником

0..100

kH

Бонус, который теряет хищник за промежуток времени

0..100

4. Реализация модели

Программная реализация модели производилась в среде разработки Delphi.

4.1 Алгоритмы

4.1.1 Алгоритм функции вычисления положения объектов на острове

Рисунок 2 Общая схема

Рисунок 3 Поведение кроликов

4.1.2 Алгоритм инициализации

4.2 Листинг программы

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.