焼きなまし法とは
焼きなまし法は最適化問題を解くための、メタヒューリスティックアルゴリズムのひとつです。金属の焼きなまし過程にヒントを得た手法で、局所解に陥るリスクを軽減しながら大域的最適解を探索できます。英名では「Simulated Annealing」と呼ばれており、複雑な組み合わせ最適化問題に適しています。
このアルゴリズムは高温状態から、徐々に温度を下げていく過程をシミュレートします。初期段階では大きな変化を許容し、温度が下がるにつれて変化の幅を狭めていきます。これにより局所解から脱出する可能性を保ちつつ、最終的に良質な解に収束することが期待できるのです。
焼きなまし法は確率的な要素を導入しているのが特徴です。解の評価が悪化する変更でも一定の確率で受け入れることで、局所解から抜け出す機会を作ります。この確率は温度パラメータに依存し、温度が下がるにつれて悪化を許容する確率も低下します。
焼きなまし法の実装と応用例
焼きなまし法の実装と応用例について、以下3つを簡単に解説します。
- Pythonによる基本実装
- 温度スケジュールの設計
- 巡回セールスマン問題への適用
Pythonによる基本実装
焼きなまし法のPythonによる基本的な実装例を見ていきましょう。この実装ではランダムな初期解から始め、温度を徐々に下げながら解を改善していきます。アルゴリズムの核心部分はエネルギー差と、現在の温度に基づいて解の更新を決定することです。
import math
import random
def simulated_annealing(initial_state, energy_func, neighbor_func, temperature, cooling_rate, max_iterations):
current_state = initial_state
current_energy = energy_func(current_state)
for i in range(max_iterations):
T = temperature / (1 + i * cooling_rate)
new_state = neighbor_func(current_state)
new_energy = energy_func(new_state)
if new_energy < current_energy or random.random() < math.exp((current_energy - new_energy) / T):
current_state = new_state
current_energy = new_energy
return current_state, current_energy
上記はではenergy_func
で解の評価を行い、neighbor_func
で近傍解を生成するコード例です。温度T
は徐々に下がり、エネルギーが悪化する変更も確率的に受け入れます。これにより局所解から脱出する機会を保ちながら、良質な解への収束を図ることができます。
焼きなまし法の効果的な実装には問題に応じたエネルギー関数と、近傍生成関数の設計が重要です。また、初期温度や冷却率などのパラメータ調整も性能に大きく影響するため、対象問題の特性を考慮しながら慎重に設定する必要があるでしょう。
温度スケジュールの設計
焼きなまし法において温度スケジュールの設計は、解の質と収束速度に大きな影響を与えます。一般的には指数関数的な冷却スケジュールが用いられますが、問題の特性に応じて線形や対数的なスケジュールを採用することもあります。適切な初期温度と冷却率の選択が重要です。
def exponential_cooling(initial_temp, cooling_rate, iteration):
return initial_temp * (cooling_rate ** iteration)
def linear_cooling(initial_temp, cooling_rate, iteration):
return initial_temp - cooling_rate * iteration
def logarithmic_cooling(initial_temp, iteration):
return initial_temp / math.log(iteration + 2)
上記は3種類の冷却スケジュールを実装しているコード例です。指数関数的冷却は初期段階で急速に温度を下げ、後半でゆっくりと冷却します。線形冷却は一定のペースで温度を下げ、対数的冷却は初期に緩やかで後半に急速に冷却するのが特徴です。
温度スケジュールの選択は問題の複雑さや、局所解の分布などを考慮して行います。たとえば局所解が多い問題では初期温度を高く設定し、緩やかな冷却を行うことでより広範囲の探索が可能になるでしょう。実際の適用では複数のスケジュールを試し、最適なものを選択することが推奨されます。
巡回セールスマン問題への適用
巡回セールスマン問題(TSP)はよく知られた組み合わせ最適化問題のひとつです。この問題では複数の都市があり、セールスマンが全ての都市を一度だけ訪問して最初の出発地点に戻るまでの最短ルートを見つけることが目標です。
TSPはとても難しい問題で、最適な解決方法を見つけるには時間がかかる場合があります。そのため厳密な解を求めるのではなく、近似的な解を得るための方法がよく使われます。焼きなまし法はそういった方法のひとつで、効率的に良い解を見つける手法としてTSPで頻繁に使用されるのです。
import random
def tsp_energy(route, distances):
return sum(distances[route[i]][route[i+1]] for i in range(len(route)-1)) + distances[route[-1]][route[0]]
def tsp_neighbor(route):
a, b = random.sample(range(len(route)), 2)
new_route = route[:]
new_route[a], new_route[b] = new_route[b], new_route[a]
return new_route
# 焼きなまし法の実行
best_route, best_distance = simulated_annealing(
initial_state=list(range(len(distances))),
energy_func=lambda x: tsp_energy(x, distances),
neighbor_func=tsp_neighbor,
temperature=1000,
cooling_rate=0.003,
max_iterations=10000
)
上記はTSPに対する焼きなまし法の実装例です。tsp_energy
関数は総移動距離を計算し、tsp_neighbor
関数は2つの都市を入れ替えて新しい経路を生成します。この方法で局所的な経路の改善を試みながら全体の最適化を図ります。
TSPへの焼きなまし法の適用では、初期温度や冷却率の調整が重要です。都市数が多い場合はより高い初期温度と、緩やかな冷却が効果的です。また、近傍生成の方法を工夫することでより効率的な探索が可能。たとえば2-opt法や3-opt法などの局所探索手法を組み合わせることで、解の質を向上させることができるでしょう。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
- AI漫画のメリット・デメリットと実際の活用事例を解説
- 【最新VRヘッドセット】MeganeX superlight 8K登場!特徴やMeta Quest 3との違いを詳しく解説
- DX人材のスキルマップには何が必要?信頼性の高いスキル標準も併せて紹介
- Stable Diffusionで好みの画像生成モデルをインストールする方法
- DX時代におけるセキュリティ課題と対策方法。情報漏洩の事例や利用できる補助金も紹介