千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

蝗災,是的,4000億蝗蟲大軍,蝗蟲軍團需要多長時間組建呢?看不懂新聞中那麼多數據,對數據無感,怎麼辦?今天,我們就用Python,給大家展示一場動畫,有數據,有模型的蝗蟲繁殖過程。

片尾有計算機模擬動畫,密集恐懼症者慎看

最近蝗災席捲了從東非到印度,還攻入巴基斯坦......

小小的蝗蟲是怎麼做到所向披靡的呢?是的,靠的是超強的繁殖能力。

千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

我們今天就用python來模擬一下蝗蟲的孵化和成長過程,看看蝗蟲的繁殖究竟有多強?模擬一下一對蝗蟲夫妻,2個月能產出多少子孫後代?

素材

  • 背景圖片:土壤,草叢,樹林,蟲卵,幼蟲,成蟲。
  • 計算機語言:Python及Pygame包(一個2D遊戲引擎)。
  • 數學知識:高中數學, 好吧,初中其實也夠了,再不然小學也可以。
  • 建模思想:解決問題的思想,這個才是最重要的,思想才是指揮知識的靈魂。

模擬結果

說實話,在結果出現以前,我自己也沒有想到這個速度是如此驚人,開始我們估算,以我的電腦性能至少可以模擬90天的繁殖仿真。實際是,到65天的時候,電腦就崩潰了。

我以為是一個仿真實驗,最後成了一個電腦的性能實驗!

看一下電腦崩潰前的畫面:

千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

是的,就是65天的時候,蟲卵的數量達到了24萬,幼蟲2.2萬,成蟲5531只。

這可是一對蝗蟲在2個月內的繁殖能力,而且,有大約一半的雄性是不繁殖的。這個畫面看的我全身發麻啊!試想一下,如果成蟲是4000億,那麼底下的蟲卵有多少?

我們將成蟲數量和100的(天數/30) 的指數進行對比,基本是一個量級。其實會更快,因為這是指數的指數非常恐怖。用這個指數來預測,假設有1000只成蟲發展到4000億,只要120天。

這是怎樣的速度啊,當然我們這裡做了很多的簡化,但是即使簡化了,蝗蟲從1000只的基數經過120天的繁殖,達到4000億這個量級也是很恐怖的。

千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

那麼,我們現在就開始我們的仿真,為了更好的建立模型,我們需要對問題進行一些基本的假設。

基本假設

我們假設在一個小生態裡,有一對蝗蟲夫婦,他們沒有任何天敵,食物充足,並且成熟雌性蝗蟲所產出的每一隻卵都能存活,並健康經過幼蟲階段,長成成蟲。繁殖過程滿足如下的假設條件:

  1. 只有雌性蝗蟲可以產卵
  2. 雌性蝗蟲一次產卵60-120只,一生只能產卵三次,並且只在剛成熟的那一個月可以產卵,每10天產卵一次。
  3. 每次產卵過程中,只有一半是雌性蟲卵,長大後是磁性,也就是有一半是雄性,不具備繁殖能力。
  4. 蝗蟲分為蟲卵,幼蟲,成蟲,三個時期。
  5. 一隻蟲卵從產下,10天后長成為幼蟲期,30天后成為成蟲。
千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

在這五個假設條件下,我們開始我們的建模過程,也就是下面的這個模擬問題。

【問題】在如上假設條件下,一對蝗蟲,隨著時間的發展,模擬出蝗蟲繁殖過程,計算蝗蟲在每個時間點的三個狀態的數量,並用可視化方式展現出來,形成繁殖過程動畫。

仿真背景

為了可視化的方便,我們用圖形將樹林環境,土壤,草地表現出來。同時,蝗蟲的三個階段也用不同的圖形呈現。也就是下面的仿真背景:

千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

可視化界面上,有三個區域,土壤下面是蟲卵,草叢部分是幼蟲的活動區,上部是成蟲的活動區域。這三個區域的劃分,一方面滿足實際的自然現象,另一方面剖面圖上,也可以更直觀的觀察到蝗蟲三種形態的數量變化過程。

基本分析

兩隻蝗蟲,只有那隻雌性可以產卵,開始的每10天產卵一次,共三次。其實我們基本的分析可以判斷,這個是一個指數發展的數量。最簡單的參考的例子是,比如,1-2-4-8-16 這個就是一個2的指數。上面的基本假設的蝗蟲的繁殖量級也是指數級別的。

將成蟲的數量和100的(天數/30)次方做了對比,計算顯示基本是一個量級,只有兩倍的差別。其實隨著數量和時間的增長,成蟲的數量會是指數的指數模型增長。

蝗蟲繁殖數量的變化可以用一句話說出來,就是:

蝗蟲的數量變化=當前雌性成蟲的數量*產卵量

當然這裡有一個時間上的差異。在數學上是一個帶遲滯的非線性動力系統

程序設計

用計算機來編寫這樣一個生態仿真程序會不會很複雜呢?

就計算機語言來說,Python可以做到很簡單。難點,在於模型和對數學的理解。

我們基於Python包PyGame的程序只有300行!這是目前任何語言都無法做到的。

這裡我們簡單對程序結構做一下介紹。

(1) 整體類結構

整體的代碼組織結構按下圖的類來組織

千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

整個程序使用了8個類。最大的代碼是在後面四個類。前面四個:

  • State 定義狀態
  • StateMachine 讓蝗蟲思考
  • StayingState 讓蝗蟲在它自己的形態規定的區域活動
  • LayingState 產卵

這是有限狀態機的內容。下面兩個類描述了蟲和蟲群,

  • Bug定義了蝗蟲
  • BugGroup定義了蝗蟲群的行為

然後是環境和遊戲控制類,

  • World類定義了一個環境就是樹啊現實啊什麼的,還有和蝗蟲群的關係
  • Game類是整體控制和運行

以下的思維導圖描述了我們程序設計思路:


千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

(2) 代碼部分

這裡大概列一下Bug類的主要變量。


千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

主要定義了:

  • 位置 location-- 記錄了當前蝗蟲的位置,包括不同形態下的生活區域
  • 有限狀態機 -- brain 狀態機是每一隻蝗蟲的大腦,為每一隻蝗蟲提供智力
  • 成蟲狀態的圖形 image -- 用於在界面中顯示
  • 性別 sex -- 蝗蟲的性別,只有雌性蝗蟲可以產卵
  • 生產次數 lay_state -- 設定第幾次產卵,每一隻成熟雌性蝗蟲只能生產3次
  • 生存時間 survive_time -- 每一隻蝗蟲的年齡,也就是存活的時間等。

下面的截圖是有限狀態機的代碼:

千億蝗蟲席捲巴鐵,從何而來?專家用python演示2只變20000過程

有限狀態機提供了一個當前狀態保持或者改變時的行為語言,為蝗蟲提供智力支持。有興趣的同學可以瞭解相關有限狀態機的內容。

如果大家需要完整的源代碼,可以私信我,很樂意分享給有興趣的朋友。

最後,上視頻

播放

暫停

進入全屏

退出全屏

00:00

00:00

重播

刷新

試試

在我們生活中有很多的現象,都可以用數學建模來進行模擬和仿真,而計算機程序本身就是為了模擬我們人類的行為和思想,幫助人類工作,判斷和思考。這個過程中,最為重要的,就是數學思維。

另外,語言作為描述數學思維的工具也是極為重要。python的仿真能力極強,而且,從我們最後奔潰的數據來看,PyGame的性能還是很值得信賴的。

輕鬆編程,快樂生活,感謝大家的關注!


分享到:


相關文章: