蝗災,是的,4000億蝗蟲大軍,蝗蟲軍團需要多長時間組建呢?看不懂新聞中那麼多數據,對數據無感,怎麼辦?今天,我們就用Python,給大家展示一場動畫,有數據,有模型的蝗蟲繁殖過程。
片尾有計算機模擬動畫,密集恐懼症者慎看
最近蝗災席捲了從東非到印度,還攻入巴基斯坦......
小小的蝗蟲是怎麼做到所向披靡的呢?是的,靠的是超強的繁殖能力。
我們今天就用python來模擬一下蝗蟲的孵化和成長過程,看看蝗蟲的繁殖究竟有多強?模擬一下一對蝗蟲夫妻,2個月能產出多少子孫後代?
素材
- 背景圖片:土壤,草叢,樹林,蟲卵,幼蟲,成蟲。
- 計算機語言:Python及Pygame包(一個2D遊戲引擎)。
- 數學知識:高中數學, 好吧,初中其實也夠了,再不然小學也可以。
- 建模思想:解決問題的思想,這個才是最重要的,思想才是指揮知識的靈魂。
模擬結果
說實話,在結果出現以前,我自己也沒有想到這個速度是如此驚人,開始我們估算,以我的電腦性能至少可以模擬90天的繁殖仿真。實際是,到65天的時候,電腦就崩潰了。
我以為是一個仿真實驗,最後成了一個電腦的性能實驗!
看一下電腦崩潰前的畫面:
是的,就是65天的時候,蟲卵的數量達到了24萬,幼蟲2.2萬,成蟲5531只。
這可是一對蝗蟲在2個月內的繁殖能力,而且,有大約一半的雄性是不繁殖的。這個畫面看的我全身發麻啊!試想一下,如果成蟲是4000億,那麼底下的蟲卵有多少?
我們將成蟲數量和100的(天數/30) 的指數進行對比,基本是一個量級。其實會更快,因為這是指數的指數非常恐怖。用這個指數來預測,假設有1000只成蟲發展到4000億,只要120天。
這是怎樣的速度啊,當然我們這裡做了很多的簡化,但是即使簡化了,蝗蟲從1000只的基數經過120天的繁殖,達到4000億這個量級也是很恐怖的。
那麼,我們現在就開始我們的仿真,為了更好的建立模型,我們需要對問題進行一些基本的假設。
基本假設
我們假設在一個小生態裡,有一對蝗蟲夫婦,他們沒有任何天敵,食物充足,並且成熟雌性蝗蟲所產出的每一隻卵都能存活,並健康經過幼蟲階段,長成成蟲。繁殖過程滿足如下的假設條件:
- 只有雌性蝗蟲可以產卵
- 雌性蝗蟲一次產卵60-120只,一生只能產卵三次,並且只在剛成熟的那一個月可以產卵,每10天產卵一次。
- 每次產卵過程中,只有一半是雌性蟲卵,長大後是磁性,也就是有一半是雄性,不具備繁殖能力。
- 蝗蟲分為蟲卵,幼蟲,成蟲,三個時期。
- 一隻蟲卵從產下,10天后長成為幼蟲期,30天后成為成蟲。
在這五個假設條件下,我們開始我們的建模過程,也就是下面的這個模擬問題。
【問題】在如上假設條件下,一對蝗蟲,隨著時間的發展,模擬出蝗蟲繁殖過程,計算蝗蟲在每個時間點的三個狀態的數量,並用可視化方式展現出來,形成繁殖過程動畫。
仿真背景
為了可視化的方便,我們用圖形將樹林環境,土壤,草地表現出來。同時,蝗蟲的三個階段也用不同的圖形呈現。也就是下面的仿真背景:
可視化界面上,有三個區域,土壤下面是蟲卵,草叢部分是幼蟲的活動區,上部是成蟲的活動區域。這三個區域的劃分,一方面滿足實際的自然現象,另一方面剖面圖上,也可以更直觀的觀察到蝗蟲三種形態的數量變化過程。
基本分析
兩隻蝗蟲,只有那隻雌性可以產卵,開始的每10天產卵一次,共三次。其實我們基本的分析可以判斷,這個是一個指數發展的數量。最簡單的參考的例子是,比如,1-2-4-8-16 這個就是一個2的指數。上面的基本假設的蝗蟲的繁殖量級也是指數級別的。
將成蟲的數量和100的(天數/30)次方做了對比,計算顯示基本是一個量級,只有兩倍的差別。其實隨著數量和時間的增長,成蟲的數量會是指數的指數模型增長。
蝗蟲繁殖數量的變化可以用一句話說出來,就是:
蝗蟲的數量變化=當前雌性成蟲的數量*產卵量
當然這裡有一個時間上的差異。在數學上是一個帶遲滯的非線性動力系統 。
程序設計
用計算機來編寫這樣一個生態仿真程序會不會很複雜呢?
就計算機語言來說,Python可以做到很簡單。難點,在於模型和對數學的理解。
我們基於Python包PyGame的程序只有300行!這是目前任何語言都無法做到的。
這裡我們簡單對程序結構做一下介紹。
(1) 整體類結構
整體的代碼組織結構按下圖的類來組織。
整個程序使用了8個類。最大的代碼是在後面四個類。前面四個:
- State 定義狀態
- StateMachine 讓蝗蟲思考
- StayingState 讓蝗蟲在它自己的形態規定的區域活動
- LayingState 產卵
這是有限狀態機的內容。下面兩個類描述了蟲和蟲群,
- Bug定義了蝗蟲
- BugGroup定義了蝗蟲群的行為
然後是環境和遊戲控制類,
- World類定義了一個環境就是樹啊現實啊什麼的,還有和蝗蟲群的關係
- Game類是整體控制和運行
以下的思維導圖描述了我們程序設計思路:
(2) 代碼部分
這裡大概列一下Bug類的主要變量。
主要定義了:
- 位置 location-- 記錄了當前蝗蟲的位置,包括不同形態下的生活區域
- 有限狀態機 -- brain 狀態機是每一隻蝗蟲的大腦,為每一隻蝗蟲提供智力
- 成蟲狀態的圖形 image -- 用於在界面中顯示
- 性別 sex -- 蝗蟲的性別,只有雌性蝗蟲可以產卵
- 生產次數 lay_state -- 設定第幾次產卵,每一隻成熟雌性蝗蟲只能生產3次
- 生存時間 survive_time -- 每一隻蝗蟲的年齡,也就是存活的時間等。
下面的截圖是有限狀態機的代碼:
有限狀態機提供了一個當前狀態保持或者改變時的行為語言,為蝗蟲提供智力支持。有興趣的同學可以瞭解相關有限狀態機的內容。
如果大家需要完整的源代碼,可以私信我,很樂意分享給有興趣的朋友。
最後,上視頻
播放
暫停
進入全屏
退出全屏
00:00
00:00
重播請
刷新
試試在我們生活中有很多的現象,都可以用數學建模來進行模擬和仿真,而計算機程序本身就是為了模擬我們人類的行為和思想,幫助人類工作,判斷和思考。這個過程中,最為重要的,就是數學思維。
另外,語言作為描述數學思維的工具也是極為重要。python的仿真能力極強,而且,從我們最後奔潰的數據來看,PyGame的性能還是很值得信賴的。
輕鬆編程,快樂生活,感謝大家的關注!