Egyetlen populációt vizsgálunk, amelyet korcsoportok szerint osztályokra bontunk. Megadjuk minden korcsoport szaporodásának és halálozásának szabályait, majd a populáció növekedését, illetve korcsoporteloszlását vizsgáljuk.
Vizsgáljuk meg, milyen objektumokra és paraméterekre van szükség a modellünk megalkotásához (a generációs keretmodellre építjük modellünket, s benne az exponenciális növekedést használjuk)!
Legyen N a populáció egyedszáma, K pedig korcsoportjainak száma! Egyszerű esetben – és mi ezt vizsgáljuk – a korcsoportok egyenlő időtartamot ölelnek fel, méghozzá 1 évet. T(N) -ben tároljuk a modell objektumainak, az egyes egyedeknek a jellemző tulajdonságát: a kort. E(i) jelenti azt, hogy valaki i éves korában milyen valószínűséggel hal meg, M(i) pedig azt, hogy milyen valószínűséggel van – egyetlen – utódja.
A modell algoritmusa:
Szimulációs lépés:
j:=N [a jelenlegi utolsó egyed]
Ciklus i=1-től N-ig
Ha véletlenszám<E(T(i)) akkor
T(i):=0 [halál]
különben
Ha véletlenszám<M(T(i)) akkor j:=j+1; T(j):=1 [születés]
T(i):=T(i)+1 [öregedés]
Elágazás vége
Ciklus vége
T-táblázat tömörítése
Eljárás vége.
Módosítsuk modellünket úgy, hogy egy évben több utód is születhessen! Ekkor M(i) az évi utódszám várható értékét (átlagos értékét) jelenti. Az algoritmusban ilyen várható értékű, Poisson eloszlású véletlenszámot használunk:
Szimulációs lépés:
j:=N
Ciklus i=1-től N-ig
Ha véletlenszám<E(T(i)) akkor
T(i):=0 [halál]
különben
X:=Poisson( M(T(i)) )
Ciklus y=1-től X-ig [születés]
j:=j+1; T(j):=1
Ciklus vége
T(i):=T(i)+1 [öregedés]
Elágazás vége
Ciklus vége
T-táblázat tömörítése
Eljárás vége.
Modellünk használatakor megfigyelhetjük, hogy a populációban stabil kormegoszlás alakul ki: a különböző korosztályokhoz tartozó egyedek aránya nemzedékről nemzedékre változatlan marad. Az egyensúly elérésének ideje attól függ, hogy kezdetben milyen messze volt a populáció a – dinamikus – egyensúlytól. Ez a stabilitás akkor is fennmarad, ha a populáció egyedszáma nem állandó, hanem csökken vagy növekszik. Olyan paraméter meghatározása, amelyre a populáció létszáma stabil értéket vesz fel, elég nehéz feladat.
Jelöljük Ri -vel az aktuális időegységbeli korcsoporteloszlást, Ui -vel pedig a következő időegységbelit! Ekkor egyensúly esetén a korcsoportok létszámának egyensúlyát a következőképpen fogalmazhatjuk meg ( si születési, hi halálozási rátákkal):
Egyszerű egyensúlyi feltétel tehát az s1=1/(1–h1) , a többi si legyen 0, hi -k pedig tetszőlegesek, vagy a hi=0 eset. Ezek azonban a természetben nem egy gyakori esetek, a valószerűbbek pedig nehezebben számíthatók ki. Ha a fenti, eredményül kapott szumma értéke kisebb 1-nél, akkor a populáció létszáma exponenciálisan csökkenni, ha viszont nagyobb 1-nél, akkor exponenciálisan növekedni fog.
Ebből láthatjuk, hogy modellünk bizony meglehetősen kezdetleges, hiszen a valóságban vég nélkül növekvő populáció nincs. Figyeljünk fel a korlátlan növekedési modellekkel való hasonlatosságra!
Mi történik, ha a szimulációs lépés számára választott időegység nem egy év, hanem kisebb, pl. egy évszak, mit kell másképpen csinálni? Sok állatfajnál a szaporodás csak az év bizonyos időszakában történik, másoknál több évszakban is lehet, de különböző szaporodási rátákkal. A halálozási ráták is sokszor évszakfüggők. Számoljuk, hogy hányadik évszakban tartunk, s mindegyiknél a maga halálozási, illetve szaporodási rátáját használjuk!
Szimulációs lépés:
j:=N
Ciklus i=1-től N-ig
T:=egészrész(T(i))
Ha véletlenszám<E(T,EVS) akkor
T(i):=0 [halál]
különben
X:=Poisson( M(T,EVS) )
Ciklus y=1-től X-ig [születés]
y:=y+1; T(y):=0,25
Ciklus vége
T(i):=T(i)+0,25 [öregedés]
Elágazás vége
Ciklus vége
Ha EVS=4 akkor EVS:=1 különben EVS:=EVS+1
T-táblázat tömörítése
Eljárás vége.
Ha csak egyetlen évszakban lehet szaporodás, akkor az algoritmus egyszerűsödik, s a születési ráták tárolásához elég egyetlen vektort használni. A megoldásban SZAP jelöli a szaporodási évszakot.
Szimulációs lépés:
j:=N
Ciklus i=1-től N-ig
T:=egészrész(T(i))
Ha véletlenszám<E(T,EVS) akkor T(i):=0 [halál]
különben T(i):=T(i)+0,25 [öregedés]
Ciklus vége
Ha EVS=SZAP akkor
Ciklus i=1-től N-ig
T:=egészrész(T(i))
X:=Poisson( M(T) )
Ciklus y=1-től X-ig [születés]
j:=j+1; T(j):=0,25
Ciklus vége
Ciklus vége
Elágazás vége
Ha EVS=4 akkor EVS:=1 különben EVS:=EVS+1
T-táblázat tömörítése
Eljárás vége.
Modellünkön további módosításokat végzünk. Először nézzük meg, hogyan hatnak a populációra a járványok! Legyen JV annak a valószínűsége, hogy egy évben van járvány, s ilyenkor a betegség miatti halálozások relatív gyakorisága JH !
A módosított algoritmus:
Szimulációs lépés:
j:=N
Ciklus i=1-től N-ig
Ha véletlenszám<E(T(i)) akkor
T(i):=0 [halál]
különben
X:=Poisson( M(T(i)) )
Ciklus y=1-től X-ig [születés]
j:=j+1; T(j):=1
Ciklus vége
T(i):=T(i)+1 [öregedés]
Elágazás vége
Ciklus vége
T-táblázat tömörítése
Járvány
Eljárás vége.
Vizsgáljuk meg, hogy ebben az évben van-e járvány, s ha van, akkor végezzük el a járvány miatti vizsgálatokat (halálozás)!
Járvány:
Ha véletlenszám<JV akkor
Ciklus i=1-től N-ig
Ha véletlenszám<JH akkor T(i):=0
Ciklus vége
T-táblázat tömörítése
Elágazás vége
Eljárás vége.
Elképzelhető, hogy járvány esetén az egyes korcsoportokban mások a halálozási ráták. Ebben az esetben JH(K) tárolja a halálozási rátákat, s a járvány algoritmusa:
Járvány:
Ha véletlenszám<JV akkor
Ciklus i=1-től N-ig
Ha véletlenszám<JH(T(i)) akkor T(i):=0
Ciklus vége
T-táblázat tömörítése
Elágazás vége
Eljárás vége.
A halálozási ráták itt is (úgy, mint a populációdinamikai modelleknél) függjenek a létszámtól:
Szimulációs lépés:
j:=N
Ciklus i=1-től N-ig
Ha véletlenszám<E0(T(i))+C1*N akkor
T(i):=0 [halál]
különben
X:=Poisson(M0(T(i))+C2*N)
Ciklus y=1-től X-ig [születés]
j:=j+1; T(j):=1
Ciklus vége
T(i):=T(i)+1 [öregedés]
Elágazás vége
Ciklus vége
Eljárás vége.
Ezzel elérhető, hogy az egyébként exponenciálisan növekedő populációt is egyensúlyban tartsuk.
Ha a populáció egy állattenyésztő telep állataiból áll, akkor van értelme egy másfajta kérdés feltevésének is. Mennyi, s milyen korú állatot célszerű levágni, hogy a létszám állandó maradjon, a szaporodás pedig a lehető legnagyobb ütemű legyen? Módosítsuk az eredeti algoritmust úgy, hogy a programmal kísérletezhessünk, s a program különböző, általunk adott vágási stratégiák alapján mutassa be a változásokat!
Jelölje V(i) az adott évben az i . korcsoportból levágandó egyedek számát!
Szimulációs lépés:
j:=N
Ciklus i=1-től N-ig
Ha véletlenszám<E(T(i)) akkor
T(i):=0 [halál]
különben
X:=Poisson( M(T(i)) )
Ciklus y=1-től X-ig [születés]
j:=j+1; T(j):=1
Ciklus vége
T(i):=T(i)+1 [öregedés]
Elágazás vége
Ciklus vége
T-táblázat tömörítése
Vágás
Eljárás vége.
Vágás:
Ciklus i=1-től N-ig
Ha V(T(i))>0 akkor V(T(i)):=V(T(i))-1; T(i):=0
Ciklus vége
T-táblázat tömörítése
Eljárás vége.
A modell használatakor felmerült probléma a memória. A modellbeli objektumok ilyen ábrázolásával hamar korlátokba ütközünk. Használjunk a T() vektor helyett egy másik értelmezésű vektort ( S(K) )! Ebben azt tároljuk, hogy melyik korcsoportnak mennyi éppen a létszáma. Most nem egyedeket tárolunk, hanem egyes osztályok darabszámát. Ekkor a születés, illetve az öregedés (transzformációk az egyes osztályok között) hatása zavarná a következőkkel való foglalkozást, ezért az egy időegységgel későbbi állapot időleges tárolására egy másik vektorra is szükség van ( U(K) ). A módosított algoritmus:
Szimulációs lépés:
U():=0
Ciklus i=1-től K-ig
Ciklus j=1-től S(i)-ig
Ha véletlenszám≥E(i) akkor
U(1):=U(1)+Poisson(M(i)) [születés]
U(i+1):=U(i+1)+1 [öregedés]
Elágazás vége
Ciklus vége
Ciklus vége
S():=U()
Eljárás vége.
Ez a program most már kevés adatot használ, de még nagyon lassú nagy létszámú populációkra. Meg kell tehát oldani a sebesség kérdését is! Ne kezeljük egyedenként a populációt, hanem foglalkozzunk egyszerre egy korcsoporttal. Számítsuk ki, hogy mennyi a korcsoport utódszámának várható értéke, valamint mennyi a közülük következő korcsoportba lépők számának várható értéke, s ez adja meg a következő évi állapotot!
Szimulációs lépés:
U:=0
Ciklus i=K-tól 2-ig -1-esével
S(i):=S(i-1)*(1-E(i-1))
U:=U+S(i)*M(i-1)
Ciklus vége
S(1):=U
Eljárás vége.
Ez a biológiai probléma az alábbi ún. Leslie-mátrixra vezet.
Ha tudjuk, hogy az egyes korcsoportokba tartozó egyedek milyen szaporák (azaz hány utóddal járulnak a népességhez), és milyen eséllyel léphetnek át a következő korcsoportba, akkor a korcsoportok létszámváltozását egy alábbi alakú mátrixszal való szorzással számíthatjuk ki:
ahol M1, M2, M3, ...Mk az i. korcsoportba tartozók utódainak átlagos száma; á2, á3, ...ák az i. korcsoportba való átlépés valószínűsége (ái = 1 – E(i – 1)).
Ekkor tehát az új korcsoporteloszlást így számíthatjuk ki ( S , U legyen a populáció egyedszám-eloszlása az aktuális és a következő időegységben, L jelölje a Leslie-mátrixot):
Szimulációs lépés:
U:=L*S [ mátrix szorzása vektorral ]
S:=U
Eljárás vége.
Természetesen e szokásos biológiai ábrázolás számítástechnikai szempontból célszerűtlen, ugyanis nagyon hely- és időpazarló megoldást tesz lehetővé: a mátrix elemeinek nagy része 0 értékű, amit felesleges tárolni, valamint az eredmény kiszámításában sem játszik szerepet. Tehát számítástechnikai szempontból az ezt megelőző megoldást kell választanunk.
![]() |
![]() |
![]() |
Készült az "Országos koordinációval a pedagógusképzés megújításáért” című TÁMOP-4.1.2.B.2-13/1-2013-0007 pályázat keretében. (ISBN 978-963-284-631-6) |
A tananyag az ELTESCORM keretrendszerrel készült