2

私は、遺伝的アルゴリズム (GA) を使用して巡回セールスマン問題 (TSP) を解決するための小さな学術課題に取り組んでいます。私は、都市とツアーを配列に格納する非常に単純な古典的な表現に従っています。たとえば、10 都市のツアーは 9-1-0-4-3-8-6-5-2-7 のように表すことができます。GA のかなり基本的な知識があるので、TSP にさまざまなタイプのミューテーションを適用するためにどのようなアプローチに従うかについて、少し混乱しています。ルートが route として表され、突然変異率が変数 m_rate で表されているとしましょう。

[1] 単純挿入変異

1-2-3-4-5-6-7-8-9 があるとします。次に、たとえばインデックス 5 のランダムな都市を選択し、2 などのランダムな挿入インデックスを選択すると、突然変異した染色体は 1-2-6-3-4-5-7-8-9 になります。

ここで、突然変異を適用するために私がやっていることは次のとおりです。

for (int i=0; i<route.length; i++) {
 if (m_rate<Math.random()) {
 // Pick a random city
 int randomCity =  0 + (int)(Math.random() * ( ((route.length-1) - 0) + 1));
 // Do the insertion and shift the array where appropriate
 }
}

つまり、ルート内のすべての都市をループして、突然変異条件 (m_rate>Math.random()) が成立するかどうかを確認します。成立する場合は、そのインデックスで停止し、次を使用せずに挿入ポイントをランダムに選択します。突然変異確率変数。配列の最後に到達しない限り、残りのすべての都市またはインデックスに同じことを適用し続けます。これは正しいアプローチですか?最初のミューテーションを適用したら、ループを停止または中断する必要がありますか? 挿入点の選択に突然変異確率を何らかの形で関与させる必要がありますか? それは私にはあまり意味がないように思えますが。染色体やルートに複数の都市が変異している可能性がある場合、染色体が再変異している可能性はありますか? 言い換えれば、2 番目または 3 番目の突然変異を行って、染色体を最初の形に反転させた場合 (突然変異前) はどうなるでしょうか?

[2] 相互交換突然変異。

染色体のランダムな都市を選択してから、2 つ目のランダムな都市を選択し、2 つを交換します。たとえば、ルート 1-5-2-8-0-9-3-7-4-6。最終的にインデックス 2 とインデックス 7 を選択すると、突然変異した染色体は 1-5-7-8-0-9-3-2-4-6 になります。

上記の挿入突然変異と同様のアプローチに従っています。ルート内のすべての都市をトラバースし、確率条件を確認してから、突然変異率を適用せずに交換するランダムな都市を直接選択します。上記と同じ種類の質問がここに適用されます..

[3] 反転突然変異。

これは最もトリッキーなものです。1-2-3-4-5-6-7-8-9 のような染色体が与えられた場合、インデックス 2 からインデックス 5 への突然変異カットを選択し、そのサブルートを逆にします ==> 1-2-6-5- 4-3-7-8-9。

しかし、これをどのように適用しますか?ルートをループしてから、突然変異率に基づいて都市を選択し、サブルートの長さを決定するために別のインデックスを直接選択しますか? 一度変更して終了しますか?この種の実装では、変異カットが 0-9 または 0-(length-1) になる場合、染色体全体またはルート全体を変異させて全体を反転させることはできますか? この場合、実際の突然変異率の値は? 私はここでちょっと迷っています...

これが長すぎることを前もってお詫びします..しかし、これらの問題に関するコメントをいただければ幸いです. 私は数多くの研究論文を見てきましたが、この種の詳細や詳細にアプローチしたものは多くありません。

ありがとうございました。

4

3 に答える 3

1

ミューテーションを選択する場合、いくつかのオプションがあります。

  • 突然変異によって無効/違法な染色体が生成され、スコアが低くなる可能性があります。これは、GAが正確性(違法な結果を排除する)と最適な結果の両方を検索することを意味します。
  • 有効な/合法的な出力のみを生成するミューテーション関数を記述できます。

最初のオプションでは、染色体のより単純でより自然な突然変異を書くことができます。ただし、おそらく表現を拡張する必要があり(たとえば、10都市ツアーに12または15スロットを許可)、アルゴリズムの収束に時間がかかります。スコア関数は、正しさを評価する必要がある場合、より高価になる可能性があります。染色体がどのように解釈されるか(たとえば、宛先の2番目の出現を無視する)に柔軟に対応できます。

最初のオプションは、同じ種類の理由でクロスオーバーの実装を簡素化する場合もあります。

2番目のオプションは通常、より速く収束しますが、結果に影響を与える突然変異関数の微妙なバイアスを回避するのは難しい場合があります。

提案された表現と突然変異は、TSPの非GA近似に似ており、交換とそれに続く改善のテストに依存しています。シミュレーテッドアニーリングは、受け入れる転位を決定する1つの方法です。

GAの実装では、クロスオーバーと突然変異を自然にするために、まったく異なる種類の染色体が必要になる場合があります。

于 2012-09-13T19:45:04.960 に答える
1

最適な選択は、突然変異には反転を使用し、クロスオーバーには OX (順序付き) を使用することだと思います。TSP を解決するための GA を作成しましたが、非常にうまく機能します。私の場合、反転を適用するときに、2 つのランダムなポイント (文字列全体である可能性があります) を選択しますが、同じポイントではありません。突然変異の場合は 0.2/0.3、クロスオーバーの場合は 0.8 のレートで最良の結果が得られますが、これは選択メカニズムによって異なります。 .

于 2012-09-26T05:18:22.957 に答える
0

反転は、通常、TSP を解決するための最適なミューテーション オペレーターです。このようなミューテーション オペレータやクロスオーバーがさらに含まれているHeuristicLabをダウンロードして試すことができます。これにより、各オペレーターで GA を数回実行し、どれが最も効果的かを確認できる実験を定義できます。開始するのに役立ついくつかのビデオ チュートリアルがあります。オープンソースなので、実装を見ることもできます。

于 2012-09-13T22:46:42.863 に答える