简单生态环境的模拟.docx
《简单生态环境的模拟.docx》由会员分享,可在线阅读,更多相关《简单生态环境的模拟.docx(17页珍藏版)》请在冰豆网上搜索。
简单生态环境的模拟
简单生态环境的模拟
一.实验目的:
研究不同光照条件下,不同参数(生命力,成熟期等)的单细胞植物与动物构成的生态环境的运行状况,从中总结规律。
二.实验模拟内容:
环境:
有均匀光线照射的培养皿,光线仿日光,强度可调整。
单细胞植物:
一个细胞占一格,按一定比例接受阳光能量,积蓄到最大值(成熟期)后,会随机分裂到周围的一格中,能量按一定比例消耗并均分。
随时间能量会下降(代谢速度)。
低于最低值时死亡(能量减为零)。
单细胞生物:
摄取能量方式为吸收周围单细胞植物,其余相同。
三.模拟方法:
1.变量说明:
an(100,100)单细胞生物能量
anc(0)单细胞生物初始能量
anc
(1)单细胞生物死亡底限
anc
(2)单细胞生物成熟标准
anc(3)单细胞生物代谢速率
anc(4)单细胞生物吸收率
anc(5)单细胞生物初始个数
pl(100,100)单细胞植物能量
plc(0)单细胞植物初始能量
plc
(1)单细胞植物死亡底限
plc
(2)单细胞植物成熟标准
plc(3)单细胞植物代谢速率
plc(4)单细胞植物吸收率
plc(5)单细胞植物初始个数
light阳光照射量
timelong模拟时间
2.算法:
a.初始化:
定义数组,赋值(orign),清零
b.撒点:
随机撒点(seed),不重复
c.大循环:
(扫描所有点)
植物:
吸收光线,消耗,分裂(ontotwop)
动物:
吃植物(eata),消耗,分裂(ontotwoa),死亡
统计输出
d.结束
3.源程序(关键子程序,VB编写):
撒点子程序:
PrivateSubseeda()
Dimi,j,n,kAsInteger
'撒动物细胞
Forn=1Toanc(5)
k=0
randa:
i=Fix(96*Rnd)+2
j=Fix(96*Rnd)+2
'判断是否重复
Ifan(i,j)=0Andpl(i,j)=0Then
an(i,j)=anc(0)
Calldrawa((i),(j))
Else
k=k+1
Ifk>50Then
anc(5)=n-1
GoToouta
EndIf
GoToranda
EndIf
Nextn
outa:
EndSub
PrivateSubseedp()
Dimi,j,n,kAsInteger
'撒植物细胞
Forn=1Toplc(5)
k=0
randp:
i=Fix(96*Rnd)+2
j=Fix(96*Rnd)+2
'判断是否重复
Ifan(i,j)=0Andpl(i,j)=0Then
pl(i,j)=plc(0)
Calldrawp((i),(j))
Else
k=k+1
Ifk>50Then
plc(5)=n-1
GoTooutp
EndIf
GoTorandp
EndIf
Nextn
outp:
EndSub
分裂子程序:
PrivateSubonetotwoa(XAsInteger,YAsInteger)
Dimxx,yy,kAsInteger
'动物分裂
Ifan(X,Y)>anc
(2)Then
'随机选周围一点
k=Fix(Rnd*8)
'转一周选合适点
Fori=0To7
xx=X+dx((k+i)Mod7)
yy=Y+dy((k+i)Mod7)
Ifxx>0Andyy>0Andxx<101Andyy<101Then
Ifan(xx,yy)=0Andpl(xx,yy)=0Then
'能量均分
an(xx,yy)=Fix(an(X,Y)/2)
an(X,Y)=an(xx,yy)
'绘新细胞
Calldrawa((xx),(yy))
ExitSub
EndIf
EndIf
Nexti
EndIf
EndSub
PrivateSubonetotwop(XAsInteger,YAsInteger)
Dimxx,yy,kAsInteger
'植物分裂
Ifpl(X,Y)>plc
(2)Then
'随机选周围一点
k=Fix(Rnd*8)
'转一周选合适点
Fori=0To7
xx=X+dx((k+i)Mod7)
yy=Y+dy((k+i)Mod7)
Ifxx>0Andyy>0Andxx<101Andyy<101Then
Ifan(xx,yy)=0Andpl(xx,yy)=0Then
'能量均分
pl(xx,yy)=Fix(pl(X,Y)/2)
pl(X,Y)=pl(xx,yy)
'绘新细胞
Calldrawp((xx),(yy))
ExitSub
EndIf
EndIf
Nexti
EndIf
EndSub
图形子程序:
PrivateSubdrawa(XAsInteger,YAsInteger)
Form1.FillColor=RGB(255,0,0)
'画动物细胞(红色圆)
X=X*80+460
Y=Y*80+460
Circle(X,Y),35,RGB(255,0,0)
EndSub
PrivateSubdrawp(XAsInteger,YAsInteger)
Form1.FillColor=RGB(0,255,0)
'画植物细胞(绿方块)
Line(X*80+435,Y*80+435)-(X*80+485,Y*80+485),RGB(0,255,0),B
EndSub
PrivateSubdisappeara(XAsInteger,YAsInteger)
'清动物细胞
Ifan(X,Y)>0Then
an(X,Y)=0
Form1.FillColor=Form1.BackColor
Line(X*80+425,Y*80+425)-(X*80+495,Y*80+495),Form1.BackColor,B
EndIf
EndSub
PrivateSubdisappearp(XAsInteger,YAsInteger)
'清植物细胞
Ifpl(X,Y)>0Then
pl(X,Y)=0
Form1.FillColor=Form1.BackColor
Line(X*80+425,Y*80+425)-(X*80+495,Y*80+495),Form1.BackColor,B
EndIf
EndSub
动物进食子程序:
PrivateSubeata(XAsInteger,YAsInteger)
'动物摄食
Ifan(X,Y)>0Then
IfX>1AndY>1AndX<100AndY<100Then
an(X,Y)=an(X,Y)+(pl(X-1,Y-1)+pl(X,Y-1)+pl(X+1,Y-1)+pl(X-1,Y)+pl(X+1,Y)+pl(X-1,Y+1)+pl(X,Y+1)+pl(X+1,Y+1))/100*anc(4)
Calldisappearp((X-1),(Y-1))
Calldisappearp((X),(Y-1))
Calldisappearp((X+1),(Y-1))
Calldisappearp((X-1),(Y))
Calldisappearp((X+1),(Y))
Calldisappearp((X-1),(Y+1))
Calldisappearp((X),(Y+1))
Calldisappearp((X+1),(Y+1))
ExitSub
EndIf
IfX-1>0AndY-1>0Then
an(X,Y)=an(X,Y)+pl(X-1,Y-1)/100*anc(4)
Calldisappearp((X-1),(Y-1))
EndIf
IfY-1>0Then
an(X,Y)=an(X,Y)+pl(X,Y-1)/100*anc(4)
Calldisappearp((X),(Y-1))
EndIf
IfX+1<101AndY-1>0Then
an(X,Y)=an(X,Y)+pl(X+1,Y-1)/100*anc(4)
Calldisappearp((X+1),(Y-1))
EndIf
IfX-1>0Then
an(X,Y)=an(X,Y)+pl(X-1,Y)/100*anc(4)
Calldisappearp((X-1),(Y))
EndIf
IfX+1<101Then
an(X,Y)=an(X,Y)+pl(X+1,Y)/100*anc(4)
Calldisappearp((X+1),(Y))
EndIf
IfX-1>0AndY+1<101Then
an(X,Y)=an(X,Y)+pl(X-1,Y+1)/100*anc(4)
Calldisappearp((X-1),(Y+1))
EndIf
IfY+1<101Then
an(X,Y)=an(X,Y)+pl(X,Y+1)/100*anc(4)
Calldisappearp((X),(Y+1))
EndIf
IfX+1<101AndY+1<101Then
an(X,Y)=an(X,Y)+pl(X+1,Y+1)/100*anc(4)
Calldisappearp((X+1),(Y+1))
EndIf
EndIf
EndSub
主程序:
PrivateSubTimer1_Timer()
Dimna,npAsInteger
Dimaq,pqAsLong
na=0
np=0
aq=0
pq=0
t=t+1
Fori=1To100
Forj=1To100
'植物摄食
Calleatp((i),(j))
'植物消耗
Callwastep((i),(j))
Nextj
Nexti
Fori=1To100
Forj=1To100
'植物分裂
Callonetotwop((i),(j))
'植物死亡
Calldeadp((i),(j))
Nextj
Nexti
Fori=1To100
Forj=1To100
'动物摄食
Calleata((i),(j))
'动物消耗
Callwastea((i),(j))
Nextj
Nexti
Fori=1To100
Forj=1To100
'动物分裂
Callonetotwoa((i),(j))
'动物死亡
Calldeada((i),(j))
Nextj
Nexti
'统计输出
Fori=1To100
Forj=1To100
Ifan(i,j)>0Then
na=na+1
aq=aq+an(i,j)/100
EndIf
Ifpl(i,j)>0Then
np=np+1
pq=pq+pl(i,j)/100
EndIf
Nextj
Nexti
Label9.Caption=na
Label11.Caption=Str(Fix(aq/10))+"K"
Label13.Caption=np
Label15.Caption=Str(Fix(pq/10))+"K"
Label21.Caption=(np+na)
Label23.Caption=Str(Fix((pq+aq)/10))+"K"
Label19.Caption=Str(t)+"/"+Str(timelong)
Iftimelong>0Then
ProgressBar1.Value=t
Ift>=timelongThen
Timer1.Enabled=False
Command1.Caption="开始"
EndIf
EndIf
EndSub
四.模拟内容:
固定植物的参数:
初始值:
500(个)*100下限:
40成熟:
160消耗:
5%吸收率:
60%
1.固定光照为100,加动物初值,观察平衡时状态:
生存下限=初值*0.6,成熟值=初值*1.6
初值(a)
平衡动物数
平衡植物数
动物能量
植物能量
系统总能量
100
\
\
\
\
达不到平衡
200
\
\
\
\
达不到平衡
300
1262
2475
378K
322K
700K
400
1194
2635
490K
307K
797K
500
1083
3053
554K
403K
958K
600
999
3331
635K
388K
1024K
700
916
3862
675K
699K
1374K
在初值为100和200时,系统始终在较大幅度循环波动,无法达到平衡(如图):
(初值为200的情形)
实验过程中发现:
动物细胞初值越小,模拟进程越快,但是越不易平衡。
动物细胞初值越大,模拟进程越慢,但可以直接达到平衡状态。
最后由实际数据得到,在初值为600时,是系统达平衡最快的。
所以后面固定动物细胞参数的模拟,都将初值定为600。
2.只改变光照条件:
固定植物的参数:
初始值:
500(个)*100下限:
40成熟:
160消耗:
5%吸收率:
60%
固定动物的参数:
初始值:
50(个)*600下限:
360成熟:
960消耗:
10%吸收率:
80%
光照
平衡动物数
平衡植物数
动物能量
植物能量
系统总能量
100
999
3331
635K
388K
1024K
200
1158
2855
722K
618K
1341K
300
1252
2493
775K
439K
1214K
400
1243
2452
764K
584K
1348K
500
1301
2518
804K
630K
1435K
600
1308
2578
806K
727K
1533K
(上图是光照为600时的平衡状态)
3.成熟值的改变:
光照:
100
固定植物的参数:
初始值:
500(个)*100下限:
40成熟:
160消耗:
5%吸收率:
60%
固定动物的参数:
初始值:
50(个)*600下限:
360消耗:
10%吸收率:
80%
成熟期
平衡动物数
平衡植物数
动物能量
植物能量
系统总能量
720
1003
3232
508K
404K
913K
840
1038
3272
588K
419K
1007K
960
999
3331
635K
388K
1024K
1080
883
4158
599K
1047K
1647K
1200
749
5053
558K
1715K
2274K
(动物细胞“吃不动”植物细胞的情况)
实验过程中发现:
当成熟期增加时,系统的运行速度剧烈减慢,需极长时间达到最终平衡。
五.结果分析:
1.随着动物细胞的增大,系统能量逐渐上升;动物数量下降,活动力下降,总能量增大;植物的数量上升,总能量增大。
2.随光线增加,各项指数呈缓慢上升趋势,但不明显。
3.这时随机性占了很大成分,一开始,动物数量急剧下降,在植物遍布后才开始上升。
若存留点较分散则可快速达平衡,若较集中就会有植物过度,而动物缓慢生长的情况。
由于时间有限,未能观察到底。
总体趋势是,能量逐渐向植物流动,系统能量增大。
动物数下降,植物数上升。
六.实验意义:
运用计算机模拟的方法,比较成功的模拟了简单的生态平衡过程,结果有其合理性,从中可以看出一些规律性。
七.有待改进之处:
随着计算机计算能力的不断提高,可以以更高的速度,模拟更大规模,更加复杂的环境。
如果使用C语言,可以用动态分配存储空间的改进算法,动态记录每个细胞的属性,提高程序的运行效率,也便于统计输出,不必再扫描所有点。
用牺牲空间的方法来节约时间。
八.展望:
可进一步扩展,增加生物数量种类,环境复杂程度。
通过对真实,或者接近真实的环境模拟,使人们在行动前做到心中有数,避免不必要的损失,对人的行动有一定指导意义。