6

簡単な研究は次のとおりです。 アリの人生シミュレーション

Anthillのクラス、Antのクラス、およびシミュレーター全体のクラスを表示するOO構造を作成しています。

今、私は「アリを「生きる」方法」についてブレインストーミングしています...

このようなプロジェクトが始まったばかりであることは知っていますが、ブレインストーミングを行っています。すぐに食べられる料理を探しているわけではありません。

心から私は「何が良いか」を理解するためにいくつかのテストを行う必要があります。PythonのAFAIKスレッドは、プロセスよりも少ないメモリを使用します。

シミュレーションを開始するときに「アリ」がしなければならないことは、ランダムな方向に動き回る、食べ物を見つけた場合->アリの巣に食べる/持ってくる、食べ物を運んでいる別のアリの巣から別のアリを見つけた場合->攻撃- >食べ物を集める->やらなければならないことをする....など...つまり、アリや環境全体で情報を「共有」する必要があるということです。

だから私は書き直します:各Antまたは何か他のもののためにプロセス/スレッドを作成する方が良いですか?

編集:「何が良いか」という私の質問のために、私は受け取ったすべての賢い答えに賛成し、それらにもコメントを付けました。テストの後、私はベストアンサーを受け入れます。

4

5 に答える 5

4

stacklessをご覧になることをお勧めします。スタックレスは、従来のスレッドに関連するパフォーマンスと複雑さの問題なしに、スレッドベースのプログラミングの利点を得ることができる一種のマイクロスレッドであるタスクレットを導入します

スタックレスで考えられる問題は、私が知る限り、マイクロスレッドを使用するには変更されたインタープリターまたは pypy を使用する必要があることです。ただし、スタックレスを使用して大きな成功を収めている企業がいくつかあるため、それだけの価値があるかもしれません (たとえば、EVE Online で使用されているため)。

また、インタプリタを置き換えることなく、一種のマイクロスレッドを提供するgreenletも見てください。ただし、スタックレスの greenlet と比較すると、提供される機能セットは限られています。

于 2011-05-31T17:42:21.820 に答える
3

GPL を気にしない場合は、Khronosシミュレーション フレームワークを使用することをお勧めします。これにより、各アリをジェネレーターとして定義できるため、スレッドを作成する必要がなくなります。Khronos エンジンがスケジューリングを処理します。

私は実際に、シミュレーションにも使用できるGarlicSimという競合プロジェクトを開発していますが、あなたの場合は Khronos の方が優れています。(GPL に問題がある場合を除きます。)

于 2011-06-01T09:37:57.857 に答える
2

私は (良い TSP ソリューションを見つけるための) アリ シミュレーションを書きましたが、スレッド ソリューションはお勧めしません。ループを使用して各アリの次のステップを計算するため、アリは実際には同時に動作しません (ただし、各ステップの後に同期します)。

これらのアリをスレッドでモデル化する理由がわかりません。実行時の動作に関しては何の利点もありませんし、(コードの) 優雅さに関しても利点ではありません!

確かに、実際のアリは並行しているため、スレッドを使用する方が少し現実的かもしれませんが、シミュレーションの目的では、これは私見では無視できます。

于 2011-05-31T15:17:48.637 に答える
1

スレッドソリューションが最適だと思います。アリが個人であっても、スレッドを使用するときに許可されている環境を共有します。プロセスソリューションは現実に対応しており、環境との通信システムを実装するのは難しいでしょう。

別の解決策は、ダニが発生したときにのみアリが行動することを定義することです。そうすれば、スレッドやプロセスを使用する必要はありません。

例えば ​​:

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

一方、このソリューションは実装が簡単です。

于 2011-05-31T15:02:43.727 に答える
1

私は@delanに同意します-特に、何千もの生き物が走り回っている蟻塚全体にこれをスケーリングしようとしている場合は、Antごとにスレッド全体を割り当てるのはやり過ぎのようです。

代わりに、スレッドを使用して、単一の「サイクル」で多くのアリを更新することを検討してください。書き方によっては (どのデータを共有する必要があるかを慎重に検討する必要があります)、これらのスレッドのプールを使用してシミュレーションをスケールアップすることもできます。

また、CPython では、GIL が複数のネイティブ スレッドによるコードの同時実行を防止していることにも注意してください。

于 2011-05-31T14:59:36.857 に答える