0

私は、遺伝的アルゴリズムを使用して最適解を表示する多目的最適化問題に 1 年以上取り組んできました。

問題は、いくつかの基準に従って人々をさまざまなチームに割り当てることです。私はすでに初期化段階を完了しており、フィットネス関数のコーディングも完了しています。ただし、生成された (2 次元配列) ソリューションをオブジェクトとして保存し、一時的にメモリに保持して、GA の後の段階である選択、クロスオーバー、突然変異で使用できるようにするのに問題があります。

ルーレット ホイールの選択と、わずかに異なるクロスオーバーおよびミューテーション アルゴリズムを使用しています。私はこれらに問題はありません。生成された1つのソリューション(この場合は完全なチーム割り当て)を一時的にメモリに保存し、別のソリューションを生成してそれをメモリに保持し、次に別のソリューションを保持する方法を見つけることができなかっただけです。

私が思いつくことができる非常に多くの異なることを試しました。そのうちの2つは次のとおりです。(i) 2次元配列タイプをintからObjectに変更しましたが、チームを作成する2次元配列が別の配列を使用するため、エラーが発生しましたリスト内の人物 ID のインデックス位置を見つけるための int 配列。(ii) 初期集団生成クラスが実行された後、毎回インクリメントされる静的クラス フィールド変数を使用します。

私はこれを何ヶ月も研究し、考えられることはすべて試しました. 誰かが私に指示したり、GAの後の段階で使用できるように2次元配列を保存する方法についてヒントをくれたりすると、非常に役立ちます。

ありがとう

編集: これは、チームを作成する 2 次元配列ビットを持つ初期集団クラスです: 各行はチーム番号を表し、列はメンバー ID です (他のクラスを参照する一部のコードを除外し、代わりにそれを言葉で表現しました):

4

1 に答える 1

0

ここでのあなたの問題はアーキテクチャの1つです。どこにも送信せずに、別のクラスで母集団を作成しています。初期化を別のクラスでラップしたいとします。私が新しいGAを書いているとき、私は通常このようなことをします。

class GeneticAlgorithm {

  public static int[][] population;
  public static double mutationRate;
  public static double crossoverRate;

  public int[][] initializePopulation //this is where your createTeams method would go
  public int[][] mutation 
  public int[][] crossover

  public void runGA

}

これが私のGAの基本構造です。runGAメソッドでは、終了基準または静的な数値に基づいて、好きなだけ世代をループできます。世代ごとに、現在の母集団を突然変異およびクロスオーバー関数に渡すだけで、結果の母集団が返されます。これらすべてを実行している間、人口はGAの終了時に保存または出力できる変数に安全に保存されます。

それがお役に立てば幸いです。

于 2012-07-25T01:04:13.410 に答える