import numpy as np
# 隨機確定變化的方向
def direction2():
if np.random.random() > 0.5:
return 1
return -1
# 隨機確定是否接受較差的解
def direction3(delta, t):
chance = np.exp(-1*delta/t)
if np.random.random() < chance:
return true
return false
# 模擬退火求解最小值
def saa(fitness, x, t=10000, c=0.96, t=1000):
# fitness 表示待優化函式
# x 表示一組可行解
# t 表示溫度
# c 表示退火因子
# t 表示在每個溫度下的尋優次數
# 初始化最優解
pg = x
# 解空間的維度
d = len(x)
# 主迴圈
while t > 1:
for i in range(t):
for j in range(d):
# 構造新解
nx = pg[:]
nx[j] += direction2() * np.random.random()
# 更新最優解
if fitness(nx) < fitness(pg):
pg = nx
elif direction3(fitness(nx)-fitness(pg), t):
pg = nx
t *= c
# 返回最優解和最優值
return pg, fitness(pg)
# 目標函式
def func(x):
x1, x2 = x
return x1 ** 2 + 2 * x1 + 1 + x2 ** 2 + 2 * x2 + 1
# 初始解
init = [2*np.random.random(), 2*np.random.random()]
xm, fv = saa(func, init)
print(xm, fv)
# [-1.001342543851264, -1.0025416982616582] 8.262654045854134e-06
智慧型優化演算法之模擬退火演算法
詳細的 解釋及背景,過幾天再進行補充 模擬退火演算法 問題背景是tsp問題,有100個旅遊景點。並且假設距離矩陣d已經給出。d已知 sum inf for j 1 1000 s 1,1 randperm 100 102 temp 0 for i 1 101 temp temp d s i s i 1...
演算法 模擬退火演算法
模擬退火演算法 一 簡單介紹 於固體退火原理,是一種基於概率的演算法。物理學解釋 將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨 溫公升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到 平衡態,最後在 常溫時達到基態,內能減為最小。模擬退火演算法從某一較高初溫出發,伴隨溫...
模擬退火演算法
w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...