模擬退火演算法及常見應用

2021-10-10 14:37:07 字數 3694 閱讀 2867

模擬退火

模擬退火(sim

ulat

edan

neal

ing[

sa]simulated ~~annealing[sa]

simula

teda

nnea

ling

[sa]

)的出發點是基於物理中固體物質的退火過程與一般組合優化問題之間的相似性。模擬退火演算法是一種通用的優化演算法,其物理退火過程由加溫過程、等溫過程、冷卻過程這三部分組成。

模擬退火演算法是基於mon

te−c

arlo

monte-carlo

monte−

carl

o迭代求解策略的一種隨機尋優演算法,從某一較高初溫出發,伴隨溫度引數的不斷下降,結合概率突跳特性在解空間中隨機尋找目標函式的全域性最優解,即在區域性最優解能概率性地跳出並最終趨於全域性最優。

演算法流程

每次隨機出乙個新解,設當前溫度為t

tt、新解對應的函式值與當前最優解的差為δ

e\delta e

δe。如果這個解更優即δ

e<

0\delta e<0

δe<

0則接受它為當前最優解;否則以一定的概率eδe

te^}

etδe

​接受它為當前可能最優解,即隨機出的概率小於eδe

演算法偽**:

status sa()

elseif(

exp(

-del / t)

* rand_max >

rand()

) t *= delta;

}return ans;

}

如何得到盡可能精確的解時間複雜度時間複雜度和上述的三個影響解的引數t,e

ps,d

elta

t,eps,delta

t,eps,

delt

a應用一:求函式的最值

hdu-2899

現在有方程f(x

)=6∗

x7+8

∗x6+

7∗x3

+5∗x

2−k∗

x(0≤

x≤100)

f(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-k*x (0 \leq x \leq 100)

f(x)=6

∗x7+

8∗x6

+7∗x

3+5∗

x2−k

∗x(0

≤x≤1

00),每次給出k

kk,求該函式在[0,

100]

[0,100]

[0,100

]的最小值。

**

需要注意的是,因為本題有定義域的限制,我們在隨機尋找最優解的時候應該限制在定義域中。

const

double t =

100;

const

double delta =

0.996

;const

double eps =

1e-14

;double y;

doublef(

double x)

doublesa(

)elseif(

exp(

-del / t)

* rand_max >

rand()

) t *= delta;

}return ans;

}void

solve()

}

應用二:求費馬點

poj-2420

給出平面內的n

nn個點找出費馬點,即找到乙個點使得該點到其他所有點的距離之和最小,輸出這個最小距離。

**

const

double eps =

1e-14

;const

double dinf =

1e300

;const

double delta =

0.993

;const

double t =

100;

struct point

} p[

105]

;int n;

point s;

double

dis(point a, point b)

double

f(point cur)

return ans;

}doublesa(

)elseif(

exp(

(ans - res)

/ t)

* rand_max >

rand()

) t *= delta;

}return ans;

}void

solve()

s =point

(sumx / n, sumy / n)

;printf

("%.0lf\n",sa

());

}

應用三:求最小球覆蓋

gym101981d - country meow

給出三維座標系的若干個點,在座標系範圍內找到乙個點作為圓心,在給出的點中距離它最遠的點的距離作為半徑作出乙個球,該球內包含了其餘所有的給定點。

**

const

double t =

100000

;const

double delta =

0.998

;const

double eps =

1e-14

;const

double dinf =

1e300

;struct point

} p[

105]

;int n;

point s;

double

dis(point a, point b)

intf

(point cur)

}return ans;

}doublesa(

)elseif(

exp(

-del / t)

* rand_max >

rand()

) t *= delta;

}return ans;

}void

solve()

s =point

(sumx / n, sumy / n, sumz / n)

;printf

("%.8lf\n",sa

());

}

模擬退火演算法

w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...

模擬退火演算法

一些求解極值的問題不能通過函式特性直接求解,只能暴力列舉,但是單純的列舉效率不高,通過模擬退火演算法可以高效的找到答案。學習好博文 最小圓覆蓋 hdu 3007 buried memory 大意 給出一些點,求出能覆蓋他們的最小的圓。輸出圓心和半徑 include include include i...

模擬退火演算法

1.模擬退火演算法認識 爬山演算法也是乙個用來求解最優化問題的演算法,每次都向著當前上公升最快的方向往上爬,但是初始化不同可能 會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統 中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下 ...