私は Java でタイム テーブル ジェネレーターを作成しています。AI アプローチを使用してハードな制約を満たし、最適なソリューションを見つけるのに役立ちます。これまでのところ、反復構築 (最も制約のある最初のヒューリスティック) とシミュレーテッド アニーリングを実装しており、遺伝的アルゴリズムを実装している最中です。
問題に関するいくつかの情報と、それをどのように表現するか: イベント、部屋、機能 (イベントが必要とし、部屋が満たす)、学生、およびスロットのセットがあります。問題は、各イベントにスロットと部屋を割り当てることです。学生が 1 つのスロットで 2 つのイベントに参加する必要がないこと、割り当てられたすべての部屋が必要な要件を満たしていること。
割り当てがソフト制約違反を評価する場合、セットごとに評価機能があるため、ポイントはこれを最小限に抑えることです。
私が GA を実装する方法は、反復構築 (イベントを未割り当てのままにすることができます) によって生成された母集団から始めて、通常の手順を実行することです。すすいで繰り返します。
私の問題は、私のソリューションがほとんど改善されないように見えることです。私が何をしても、個体群はランダムな適合度になる傾向があり、そこにとどまります。この適合度は常に異なりますが、下限が表示されることに注意してください。
問題はクロスオーバー関数にあると思われます。その背後にあるロジックは次のとおりです。
交差する 2 つの割り当てがランダムに選択されます。それらを割り当て A および B と呼びましょう。B のすべてのイベントに対して、次の手順を実行します (B のイベントが選択される順序はランダムです)。
A で対応するイベントを取得し、割り当てを比較します。3 つの異なる状況が発生する可能性があります。
- それらの 1 つだけが未割り当てで、子で他の割り当てを複製できる場合は、この割り当てが選択されます。
- 両方が割り当てられていて、一方だけが
子への割り当て時に競合を作成しない場合は、その方が選択されます。 - 両方が割り当てられていて競合が発生しない場合は、どちらかがランダムに選択されます。
それ以外の場合、イベントは割り当てられません。
これにより、親の割り当ての一部と母親の割り当ての一部を持つ子が作成されるため、有効な関数のように思えます。さらに、ハード制約を破ることはありません。
突然変異に関しては、SA の隣接関数を使用して、子に基づいて別の割り当てを与え、その子を置き換えています。
もう一度。このセットアップでは、初期集団が 100 で、GA が実行され、常にランダムな (高い) フィットネス値で安定する傾向があります。私が間違っている可能性があることについて、誰かが私にポインタを与えることができますか?
ありがとう
編集:いくつかのものをフォーマットしてクリアする