解決するのが難しい最適化問題があるときはいつでも、遺伝的アルゴリズムについて考えます。以下の私のソリューションは、あなたが GA に精通していることを前提としています (自分で実装するのはそれほど難しくありません
) 、次のスキームを検討してください。
00101 00100 11010 11110 11000
A B C D E
ここで、各部分はノードのグリッド内の位置を (バイナリで) (その順序で) エンコードします。各部分の長さは、グリッドのサイズ ( length=ceil(log2(N*N)) ) によって異なります。
グリッドには、行ごとに左から右に番号が付けられます。
例として、4 つのノード (A、B、C、D) と 3x3 グリッドを持つ完全なグラフの場合、文字列は次のようになります。
0011 0001 0101 1000 = 3 1 5 8
A B C D A B C D
次のレイアウトを表します。
. B . 00 01 02
A . C 03 04 05
. . D 06 07 08
次に、交差演算子を通常どおり (1 点または 2 点の交差)設計し、突然変異も同様に設計します (ランダムに 1 ビットを反転)。いつでも、グリッド内に有効な位置しかないことを確認する必要があります。
最後に、適合度関数は、パス上のノード間の距離 (複数のパスの合計) の関数になり、長いパスにペナルティを課します (最小化問題として)。例として、ノード間の市区町村の距離を取得します。
メソッドの残りの部分は、標準的な遺伝的アルゴリズム (初期化、評価、選択、複製、終了) です。
例 例A D C Bを示すために、次の 2 つ の
パスが与えられた場合に、街区の距離を含む前のレイアウトを考えてみましょう。 C B D A
A -> D -> C -> B
3 + 1 + 2 = 6 therefore
C -> B -> D -> A fitness(0011 0001 0101 1000) = 6 + 8 = 14
2 + 3 + 3 = 8
明らかに、目標はフィットネス関数を最小化するレイアウトを見つけることです。