2011-05-31 18 views
6

簡單的研究: 螞蟻生活模擬Ant仿真:最好爲每個Ant或其他東西創建一個Process/Thread?

我創建一個面向對象的結構,它看到一個類的蟻丘,爲螞蟻一類和整個模擬器類。

現在我就頭腦風暴「如何」讓螞蟻「活」 ...

我知道有這樣的剛剛開始,但我頭腦風暴的項目,我不找一個剛準備好吃的菜

真誠地,我必須做一些測試以理解「什麼是更好的」,Python中的AFAIK線程使用的內存少於進程。

當你開始模擬時,「螞蟻」所要做的只是:如果他們發現食物,隨意移動, - 如果他們發現另一隻螞蟻正在運送食物 - >攻擊 - >收集食物 - >做必須做的事......等等......這意味着我必須在整個環境中「分享」信息。

所以我重寫: 最好爲每個Ant或其他東西創建一個Process/Thread?

編輯: 由於我的問題是「什麼更好」,我提出了所有我收到的智能答案,我也對他們發表了評論。 經過我的測試,我會接受最好的答案。

+2

每個螞蟻一個完整的線程似乎有點矯枉過正。它們比流程便宜,但是它們仍然有*一些*開銷(如果僅僅是上下文切換)並且在CPython中它們甚至不能並行運行(即使/當它們可以時,你仍然受限於沒有核心)。 – delnan 2011-05-31 14:52:43

+1

進程和線程的相對成本也取決於底層操作系統。我同意@delnan:每個螞蟻的線程是矯枉過正的,每個螞蟻的過程都是熱核過度殺傷。 – 2011-05-31 14:54:43

+0

謝謝你們兩位(熱核殺傷力過大),你有什麼建議? – MiPnamic 2011-05-31 14:56:52

回答

1

我同意@delan - 對每個Ant分配一個完整的線程看起來像是矯枉過正,特別是如果你想將這個擴展到整個蟻丘時,數以千計的小動物跑來跑去。

相反,您可能會考慮使用線程在單個「循環」中更新許多螞蟻。根據您的編寫方式 - 您需要仔細考慮需要共享哪些數據 - 您甚至可以使用這些線程池來擴展您的模擬。

另請注意,在CPython中,GIL會阻止多個本機線程同時執行代碼。

+0

One Thread - >許多螞蟻......無論如何,這可能是一個真正的選擇,正如你所說的,我必須考慮共享數據......想象來自不同蟻丘的螞蟻必須爲生存「而戰」...... – MiPnamic 2011-06-01 07:17:33

1

我認爲線程解決方案是最好的。 即使螞蟻是個體,他們也共享環境,正是在使用線程時允許的。過程解決方案符合現實,與環境實施通信系統將是艱鉅的。

另一種解決方案是定義螞蟻只在發生滴答時才起作用。 然後,不需要使用線程或進程。

例如:

import time 
... 
while True: 
    for ant in ants: 
     ant.act() 
    time.sleep(tickwait) 

同時,該解決方案更容易實現。

+0

更容易是一件好事=)在實際中,螞蟻必須持續行動,因此必須「找到」能夠激活觸發器的東西,如食物,像其他螞蟻一樣......所以通常ant.move()將循環直到另一個「事件「被觸發 – MiPnamic 2011-06-01 07:19:19

2

我寫了一個螞蟻模擬(用於找到一個好的TSP解決方案),並且不會推薦一個Thread-Solution。我使用一個循環來計算每一隻螞蟻的下一步,所以我的螞蟻並不真正表現出來(但是在每一步之後同步)。

我沒有看到任何理由來模擬這些螞蟻的線程。它在運行時行爲方面沒有優勢,在代碼優化方面也沒有優勢!

可以肯定的是,使用線程可能更現實一些,因爲真正的螞蟻是併發的,但是爲了模擬的目的,這是恕我直言可以忽略的。

+0

感謝您分享您的經驗,我將從線程模擬10蟻的數量開始,我想了解」多少「可以在系統資源中花費,然後我會看到 – MiPnamic 2011-06-01 07:16:09

4

我建議看看stackless。 Stackless推出了一些微線程的tasklet,它可以獲得線程編程的好處,而不會產生與傳統線程相關的性能和複雜性問題。

無堆棧的一個可能的問題是,就我所知,您需要使用一個修改過的解釋器或pypy使用微螺紋。然而,它可能是值得的,因爲有一些公司使用堆棧取得巨大成功(例如,它用於EVE Online)

也看看greenlet,它也爲您提供了一種微螺紋,沒有取代口譯員。然而,與無堆棧的greenlet相比,僅提供有限的功能。

+0

我會嘗試堆疊爲儘快:)謝謝 – MiPnamic 2011-06-01 07:13:48

+0

我很好奇,它是如何爲你工作的?你有沒有機會看看Stackless? – circus 2011-06-14 08:37:16

+0

我會在這個週末用Stackless進行測試=)(沒有空閒時間對不起)xD – MiPnamic 2011-06-16 10:44:32

3

如果您不介意GPL,我建議您使用Khronos模擬框架,它允許您將每個螞蟻定義爲生成器,因此您不需要創建線程。 Khronos引擎負責調度。

我實際上正在開發一個名爲GarlicSim的競爭項目,您也可以使用它進行仿真,但對於您的情況,Khronos會更好。 (除非你對GPL有問題。)

+0

另一個偉大的觀點來自...我可以在Khronos網站上看到它是「我需要的」...我會嘗試它儘快,謝謝 – MiPnamic 2011-06-01 12:14:07