- •Министерство образования и науки Российской Федерации
- •Курсовая работа по дисциплине «Моделирование систем» тема: Система хищник-жертва
- •1. Реферат
- •1.1 Система хищник-жертва.
- •1.2 Модель Вальтера-Лотке.
- •1.2 Цель работы
- •3. Моделирование
- •3.1 Формализация задач моделирования
- •3.2 Описание предметной области
- •3.3 Построение математической модели
- •4.3 Результаты работы программы
- •5. Вывод
- •Список использованных источников.
3. Моделирование
3.1 Формализация задач моделирования
Задачей моделирование является построение кривых численности популяции хищника и жертвы в зависимости от времени при различных начальных условиях, таких как: численность популяций, скорость размножения жертвы, питательность жертвы, затраты на поиск жертвы хищником, плодовитость хищника и т.п. После чего необходимо проанализировать полученные данные. При этом в моделировании четко задана площадь, на которой обитают обе популяции она равна 400м 2 и представляет собой остров, из которого ни хищники не жертвы не могут уйти, из чего вытекает что моделируемая система закрытая.
3.2 Описание предметной области
Исследуемой предметной областью является взаимоотношения двух популяций хищник-жертва в закрытой системе. На некотором острове существуют два биологических вида. Среда стационарна и обеспечивает в неограниченном количестве всем необходимым для жизни один из видов, который будем называть жертвой. Другой вид - хищник также находится в стационарных условиях, но питается лишь особями первого вида. При этом жертва постоянно с заданным промежутком времени размножается без ограничений по количеству еды, ограничивает их численность лишь свободное место на острове. Хищники же вынуждены постоянно ловить жертв и съедать, тратя на поиски силы, если долгое время хищник не может найти жертву он умирает от голода. Однако если хищник не может найти жертву, но ему на вид попадается хищник противоположного пола, они производят потомство.
3.3 Построение математической модели
Моделируемая система состоит из двух множеств объектов, и площадью на которой обитают оба вида:
-
Жертвы;
-
Хищники мужского и женского пола.
Обозначим площадь, на которой обитают оба вида как 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.