0

liontype のオブジェクトとtype のオブジェクトを作成する場合は、次のpreyようにします。

lion.eat(prey)

その間に

lion.energy=energy+10,as an example.
prey=null

でも、論理的な生態系から獲物を完全に滅ぼしたい。

私はガベージ コレクターなどについて知っています。ガベージ コレクターについてあなたが言うすべてのことは、オブジェクトが何も指されないとすぐにオブジェクトを破棄します。

しかし、仮想エコシステムで数百万のライオンとシカのインスタンスを使用して遺伝的アルゴリズムを実装しています。では、どうすれば死んだ動物を排除できますか?

こっけいな冗談はやめてください。ガベージ コレクターとオブジェクトの殺人の同じ答えにいつも出くわすのにうんざりしています。ライオン メソッドから獲物のオブジェクトを論理的に逆参照する解決策の説明が必要です。

public class prey
{
  int energy=10;
}

public class lion
{
  int energy=0;

  public void eat(prey aDeer)
  {
    this.energy=aDeer.energy+this.energy; ///acumulate energy values from prey
    aDeer=null;//destroys the object from ecosystem, which seems impossible to do in java
  }
}
4

3 に答える 3

1

あなたはすでに何百万もの獲物を持っており、おそらくそれらをコレクションに保存しています。たとえば、ArrayList. からアイテムを削除するのは非常に簡単ArrayListです。.remove()その関数を呼び出します。

于 2012-08-27T23:36:11.927 に答える
0

すでに述べたように、Java では明示的なメモリ管理を実行できません。あなたができることは、死んだオブジェクトを生きたままにしておく参照がないことを確認し(しゃれが意図されています!)、ガベージコレクターにその仕事をさせることです。これは、特に多数の小さなオブジェクトが破棄される場合に、明示的なメモリ管理よりも効率的である可能性が高いことに注意してください。

人口の全体的なサイズが、そのメンバーが生まれて死ぬ速度よりもはるかにゆっくりと変化する場合、@veer が提案したように、動物のプールを維持することを検討し、新しいオブジェクトを作成するのではなく、動物がプールからそれらを抽出するときにそれらを抽出します。生まれて、死んだらそこに返す。

于 2012-08-28T10:53:30.437 に答える
0

オブジェクトの作成と破棄がボトルネックである場合 (推測ではなくプロファイリングで確認)、すべての動物を配列 (または、最大個体数が不明な場合は配列リスト) に配置し、各動物に現在のインデックスを格納し、動物を殺し、最後に生きた動物と交換し、生きている動物のカウンターを減らします。より少ない言葉で、以前に提案されたように動物のプールを作ります。少数の動物だけが次の世代に引き継がれる場合は、2 つの配列を検討し、前の段階をたどって新しい世代に生きていく過程を経て、それらの配列を切り替えます。

しかし、それを便利にするためには、(与えられた配列内の) すべての動物を構造的に同じにする必要があります。そのため、クラス Animal のみを使用するか、種ごとに 1 つの配列を使用します。

PS。オブジェクトを手動で破棄する方法を見つけようとしないでください。オブジェクトの作成と破棄を回避する方法を見つけるか (特に世代サイズがあまり変わらない場合は、全員が再び必要になる場合)、GC に依存します。

于 2012-08-28T12:00:50.323 に答える