このブログの表紙は
ChatGPT + DALL·E 2
共著です。
記事ディレクトリ
序文
この記事は、インテリジェント アルゴリズム (Python 再帰)コラムの 2 回目の記事であり、主に、シミュレーテッド アニーリング アルゴリズム(Simulate Anneal Algorithm, SAA)
の関連アプリケーション シナリオのアイデア、実装、およびシミュレーションを紹介しますpython
。
シミュレーテッドアニーリングアルゴリズムは、その名のとおり、固体アニーリングの熱力学的過程をシミュレーションしたもので、大規模な組み合わせ最適化問題を解くのに適したランダム探索アルゴリズムです。一般的な局所探索アルゴリズムとは異なり、SAA
近傍の目標値が比較的小さい状態を一定の確率で選択するアルゴリズムであり、理論的には大域最適アルゴリズムです。
1. アルゴリズムの考え方
固体焼鈍プロセスとは、固体を加熱して溶かし、ゆっくりと冷却して規則的な結晶に固化させる熱力学的プロセスを指し、主に加熱プロセス、等温プロセス、冷却プロセスから構成されます3
。
(1)
加熱過程:固体を加熱すると、温度が上昇するにつれて粒子の熱運動が強まり、徐々に平衡位置から外れ、粒子の配置もランダムな状態を呈し、このとき物体が出現します。巨視的レベルで液体状態になること、つまり溶ける現象です。溶融プロセスでは、システム内に存在していた可能性のある不均一な状態が除去され、温度の上昇とともにシステムのエネルギーが増加します。等温プロセス: アニーリング プロセスでは、システムが平衡に達するように温度をゆっくりと下げる必要があります
(2)
。各温度での状態。このプロセスは、自由エネルギー減少の法則に従って説明できます。温度が一定に保たれながら環境と熱を交換する閉鎖系の場合、システム状態の自発的変化は常に自由エネルギー減少の方向に進行します。エネルギーが最小値に達する 系が平衡状態に達すると、
(3)
冷却過程が起こり、温度の低下により粒子の熱運動が徐々に弱くなり、粒子の配列が徐々に整い、系のエネルギーは継続的に減少し、最終的には低エネルギーの結晶構造が得られます。アニーリングプロセスは、液体が固化して固体の結晶状態になると完了します。
SAA
これは、大きな探索空間で最適解を見つけるために使用される確率ベースのアルゴリズムです。固体アニーリングと同様のプロセスを使用します。まず、固体を十分な温度まで加熱します (アルゴリズムのランダム探索と同等)。その後ゆっくりと冷却され(アルゴリズムの局所探索に相当)、各温度で平衡状態に到達し(アルゴリズムの各状態遷移に相当)、最終的に物理基底状態に到達します(最適解を見つけるアルゴリズムに相当) )。具体的には、温度TT
の粒子として表すことができます。Tで平衡に達する確率はexp ( − Δ E k T ) exp(- \frac {\Delta E} {kT})e x p ( −kT _E_ _),其中 E E Eは温度TTTにおける内部エネルギーΔE ΔEΔEはその変化です、kkkはボルツマン定数です。固体アニーリングを使用して組み合わせ最適化問題、内部エネルギーEE をE は目的関数値fff、温度TTT は制御パラメータttt、つまり、 初期解xxSAA
。
xと制御パラメータの初期値tttから開始し、現在の解に対して反復を"产生新解 --> 计算目标函数差 --> 接受或舍弃"
繰り返しttアルゴリズム終了時の現在の解であるt値は、モンテカルロ反復解法に基づくヒューリスティックなランダム検索プロセスで得られる近似最適解です。アニーリングプロセスは、制御パラメータtttとその減衰率Δt ΔtΔ t、各tttの値での反復回数LLLとストップコンディションSSSら。
2. 詳細を整理する
2.1 ハイパーパラメータの選択
初期温度にはより大きな値を選択し、終了温度にはより小さな値T
を選択することをお勧めします。T_end
初期温度はここで選択されます。T=100, T_end=0.001
大きすぎるか小さすぎると、アルゴリズムの収束速度、つまり反復回数と冷却係数に影響します。各温度は問題のシナリオに応じて適切です。制御、大きすぎると収束速度にも影響します。ボルツマン定数はk
に設定されます1
。
2.2 いくつかのトリック
実際には上記のフローチャートに完全に従う必要はなくSAA
、例えば各温度での繰り返し回数は原理的にこの部分が影響します、例えば冷却係数を少し大きめに設定すると、 , すると0.99
、これ 一部の部分は実装時に省略できますが、アルゴリズムは依然として最適な解を得ることができます。もちろん、この問題に関してブロガーが出した結論にすぎず、それが普遍的かどうかはまだ検証される必要がある。アルゴリズムの整合性を保つため、この記事では引き続きフローチャートに従ってアルゴリズムを実装しますSAA
。
3. アルゴリズムの実装
3.1 問題のシナリオ
最も価値のある問題、f ( x ) = xsin ( 5 x ) − xcos ( 2 x ) f(x) = xsin(5x) - xcos(2x) を解きます。f ( x )=x s in ( 5 x )−ドメイン上のx cos ( 2x )の[0, 5]
最小値。手動で計算してみましょう:
f ′ ( x ) = 2 xsin ( 2 x ) + sin ( 5 x ) − cos ( 2 x ) + 5 xcos ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2 x) + 5 x cos(5 x)f( × )_=2 xインチ( 2 x ) _+s in ( 5 x )−cos ( 2 x )+5 x cos ( 5 x ) 令f ' ( x ) = 0 f^\prime (x) = 0f( × )_=0以降のよどみ点は理論的には求めることができますが、計算するのは簡単ではありません。。。
3.2 アルゴリズムの観点からの分析
上記の問題シナリオとアルゴリズム原理によれば、次の 2 つの状況を考慮する必要があります。
(1)
現在の解は局所最適解です。つまり、f ( x ' ) < f ( x ) f(x^ \prime) < f(x )f ( x) _<f ( x )は、現在の局所最適解を保持し、新しい解の生成を続けます。
(2)
現在の解は局所最適解ではありません。つまり、f ( x ' ) ≥ f ( x ) f(x^ \prime) \ゲク f(x)f ( x) _≥f ( x )、現在の温度での解の収束確率を計算します。確率が特定のしきい値 (ランダム) より大きい場合、その解は局所最適解として使用でき、解を保持して続行します。新しいソリューションを生成するか、そうでない場合はソリューションを破棄し、新しいソリューションの生成を続けます。
3.3 Pythonの実装
# -*- coding:utf-8 -*-
# Author: xiayouran
# Email: [email protected]
# Datetime: 2023/1/16 11:12
# Filename: sa.py
import numpy as np
from matplotlib import pyplot as plt
def f(x):
return x*np.sin(5*x) - x*np.cos(2*x)
seed = 10086
np.random.seed(seed)
T = 100 # 初始温度
T_end = 1e-3 # 终止温度
coldrate = 0.9 # 冷却系数
max_count = 15 # 每个温度值下的迭代次数
x_range = [0, 5] # 定义域
if __name__ == '__main__':
plt.figure()
plt.ion()
x_ = np.linspace(*x_range, num=200)
plt.plot(x_, f(x_))
x = np.random.uniform(*x_range) # 初始解
while T > T_end:
for _ in range(max_count):
y = f(x)
x_new = np.clip(x + np.random.randn(), a_min=x_range[0], a_max=x_range[1])
# something about plotting
if 'sca' in globals() or 'sca' in locals():
sca.remove()
sca = plt.scatter(x, y, s=100, lw=0, c='red', alpha=0.5)
plt.pause(0.01)
y_new = f(x_new)
if y_new < y: # 局部最优解
x = x_new
else:
p = np.exp(-(y_new - y) / T) # 粒子在温度T时趋于平衡的概率为exp[-ΔE/(kT)]
r = np.random.uniform(0, 1)
if p > r: # 以一定概率来接受最优解
x = x_new
T *= coldrate
plt.scatter(x, f(x), s=100, lw=0, c='green', alpha=0.7)
plt.ioff()
plt.show()
print('最小值对应的坐标点: ({}, {})'.format(x, f(x)))
得られた最適解は次のとおりです。
最小值对应的坐标点: (3.435632058805234, -6.276735466829619)
シミュレーションのプロセスは次のとおりです。
コードリポジトリ:IALib[GitHub]
この記事のコードは、Python
[スマート アルゴリズム (反復)] 列の専用ウェアハウスに同期されています: IALib
ランタイムライブラリIALib
のSAA
アルゴリズム:
git clone [email protected]:xiayouran/IALib.git
cd examples
python main.py -algo saa