焼きなまし法とは?意味をわかりやすく簡単に解説

焼きなまし法とは?意味をわかりやすく簡単に解説

公開: 更新:


焼きなまし法とは

焼きなまし法は最適化問題を解くための、メタヒューリスティックアルゴリズムのひとつです。金属の焼きなまし過程にヒントを得た手法で、局所解に陥るリスクを軽減しながら大域的最適解を探索できます。英名では「Simulated Annealing」と呼ばれており、複雑な組み合わせ最適化問題に適しています。

このアルゴリズムは高温状態から、徐々に温度を下げていく過程をシミュレートします。初期段階では大きな変化を許容し、温度が下がるにつれて変化の幅を狭めていきます。これにより局所解から脱出する可能性を保ちつつ、最終的に良質な解に収束することが期待できるのです。

焼きなまし法は確率的な要素を導入しているのが特徴です。解の評価が悪化する変更でも一定の確率で受け入れることで、局所解から抜け出す機会を作ります。この確率は温度パラメータに依存し、温度が下がるにつれて悪化を許容する確率も低下します。


Python基礎・実践(Django)

企業・法人向けのPython研修では、基礎から応用まで体系的に学べます。

Python研修の詳細

DX社員研修

企業・法人向けのDX研修では、実務に繋がるリスキリングでITレベルを向上させます。

DX研修の詳細

Javaエンジニア育成研修

企業・法人向けのJavaエンジニア育成研修では、Javaの基礎から応用まで確実に習得できます。

Java研修の詳細

新卒・新入社員向け研修

企業・法人に新入社員・新卒社員に向けたプログラミング研修を提供しています。

新入社員研修の詳細

コードキャンプのIT研修を全て見る

焼きなまし法の実装と応用例

焼きなまし法の実装と応用例について、以下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は徐々に下がり、エネルギーが悪化する変更も確率的に受け入れます。これにより局所解から脱出する機会を保ちながら、良質な解への収束を図ることができます。

焼きなまし法の効果的な実装には問題に応じたエネルギー関数と、近傍生成関数の設計が重要です。また、初期温度や冷却率などのパラメータ調整も性能に大きく影響するため、対象問題の特性を考慮しながら慎重に設定する必要があるでしょう。

おすすめのPython研修一覧

Python研修を提供しているおすすめの企業・法人を一覧で掲載しております。

Python研修の一覧を見る

おすすめのDX研修一覧

DX研修を提供しているおすすめの企業・法人を一覧で掲載しております。

DX研修の一覧を見る

おすすめのJava研修一覧

Java研修を提供しているおすすめの企業・法人を一覧で掲載しております。

Java研修の一覧を見る

おすすめのJavaScript研修一覧

JavaScript研修を提供しているおすすめの企業・法人を一覧で掲載しております。

JavaScript研修の一覧を見る

温度スケジュールの設計

焼きなまし法において温度スケジュールの設計は、解の質と収束速度に大きな影響を与えます。一般的には指数関数的な冷却スケジュールが用いられますが、問題の特性に応じて線形や対数的なスケジュールを採用することもあります。適切な初期温度と冷却率の選択が重要です。

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やプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する