巡回セールスマン問題(Traveling Salesman Problem, TSP)
最適化問題の一例として、「巡回セールスマン問題(Traveling Salesman Problem, TSP)」を挙げます。
TSPは、いくつかの都市を訪問する最短経路を求める問題で、非常に計算困難です。
今回は、Pythonを使ってTSPを解き、結果をグラフ化します。
巡回セールスマン問題の説明
巡回セールスマン問題は、以下のように定義されます:
- あるセールスマンが$N$個の都市を訪れ、それぞれの都市を一度だけ訪問し、出発地点に戻る必要がある。
- すべての都市間の距離が与えられている。
- セールスマンが移動する総距離を最小化する経路を見つけることが目的。
解法
TSPはNP困難問題であり、大規模な問題を厳密に解くのは現実的ではありません。
ここでは、近似解法の一つである遺伝的アルゴリズム(Genetic Algorithm)を用いて解を求めます。
実装
まず、必要なライブラリをインストールします。
1 | pip install deap matplotlib numpy |
次に、Pythonコードを以下に示します:
1 | import numpy as np |
コードの説明
都市の生成:
num_cities
を設定し、ランダムな都市の座標を生成します。- 都市間の距離行列を計算します。
遺伝的アルゴリズムの設定:
DEAPライブラリ
を使用して遺伝的アルゴリズムを設定します。creator
で個体(経路)とその適合度を定義します。toolbox
で個体の生成、交叉、突然変異、選択、および評価関数を登録します。
適合度関数:
evalTSP
関数で個体(経路)の総距離を計算します。
主関数:
- 遺伝的アルゴリズムの主要なパラメータを設定し、
eaSimple
関数を使用して進化を実行します。 - 最良の経路を選択し、結果を返します。
- 遺伝的アルゴリズムの主要なパラメータを設定し、
結果のプロット:
- 最良の経路をプロットし、都市の座標と経路を視覚化します。
結果
このコードを実行すると、TSPの最良の経路がプロットされます。
[実行結果]
都市間の最短経路が青線で表示され、各都市の座標が赤点で示されます。