0

私は、捕食者、被食者、および食物 (状況に応じて地形に成長する植物と、クリーチャーが死ぬときに放つ肉) の進化シミュレーションに取り組んでいます。それぞれが (x,y) の位置を占めます。

現時点では、各クリーチャーには赤、緑、青のカラー チャンネルを感知するいくつかの「目」があり、クリーチャーまたは食べ物が視認距離内にある場合、目は反応してニューラル ネットワークに入力を送信します。彼らが見ているオブジェクトの色に応じて、それは相対的な角度であり、クリーチャーからの距離です.

私が今行っていることは、すべての植物、肉片、生き物を反復処理し、それらが生き物の視距離内にあるかどうかを確認することです. その条件が真の場合、ネットワークの入力が計算されます。

問題は、通常 150 から 300 "ユニット" の間であるクリーチャーの表示距離と比較して、世界が巨大 (約 10,000*10,000 "ユニット") であることです。その上、植物の数は、他のすべての生き物や肉片と一緒に、地形の状態に応じて非常に高くなる可能性があります (最大で数千にもなります)。

そのため、通常、各クリーチャーに対して大規模なループが実行され、シミュレーションが非常に遅くなります。これは、チェックされたクリーチャーと食べ物のほとんどが完全に無関係である (離れすぎている) 場合です。

私が求めているのは、各ループで距離をチェックするポイントの数を減らしたり、チェックするポイントの距離を制限したり、その他の技術を使用したりする方法またはアルゴリズムです。

PS: シミュレーションをさまざまな「ゾーン」に分割することを考えたので、クリーチャーがゾーンにいる場合、その特定のゾーンの他のポイント (食べ物や他のクリーチャー) のみをチェックします。しかし、彼らは絶え間なく移動しているため、ゾーンの端にいると視界が非常に不正確になります。また、distance^2 をチェックして (sqrt を実行しない)、viewing_distance^2 より小さい場合にのみ計算することで、速度をわずかに改善しました。

4

2 に答える 2

1

世界をゾーンに分割します。ゾーン幅が最大表示距離よりもわずかに大きい場合は、最大 4 つのゾーンのみを確認する必要があります。

quad-tree または kd-tree を使用すると、構造を常に更新する必要があるという欠点があります。しかし、プロファイリングを行ってください。

于 2013-08-04T21:26:26.477 に答える
0

四分木構造は、幾何学的表現に使用される場合があります: http://en.wikipedia.org/wiki/Quadtree

それはすべて、必要な効率に依存します。ゾーンの回答には、クリーチャーがゾーンの境界に近い場合、4 つのゾーンをスキャンしてしまう可能性があるという問題もあります。

于 2013-08-05T08:50:47.620 に答える