通用局部搜索算法之模拟退火[转]
设施区位及算法 2009-08-28 20:44:05 阅读24 评论0 字号:大中小
爬山法从来不会“下山”,只会向值比当前节点好的方向搜索,因而肯定不完备,
很容易停留在局部极值上;
纯粹的随机行走,从后继节点集合中等概率地随机选择一个后继,然后移动到该后继,
因此是完备的,但缺乏效率;
模拟退火算法:将效率和完备性结合起来,即爬山法 + 随机行走
1. 模拟退火算法(simulated annealing)
在冶金中,退火是为了增加金属或玻璃的韧性和硬度而先将其加热到高温再让其逐渐
冷却的过程,使材料结合成一个低能量的结晶态。
模拟退火算法与爬山法类似,但是它没有选择最佳的移动,而是选择随机的移动。如果
该移动使情况得到改善,那么接受该移动;否则,算法以某个概率接受该移动。该概率
与移动的“恶劣程度”(即变坏的梯度值)成指数级下降,同时该概率也随着“温度”T的降
低而下降,即:
p = e^(delta_E / T),此时delta_E < 0.
开始时,温度较高,“坏的”移动更可能被接受,而T越低就越拒绝坏的移动。可以证明,
如果T下降的足够慢,模拟退火算法找到全局最优解的概率逼近于1.
function Simulated-Annealing(problem, schedule) return a solution state
input: problem
schedule, 从时间到温度T的一个映射
local variables: current, 一个节点
next, 一个节点
T, 一个温度值,用于控制下降步骤的概率
current = Make-Node(Initial-State[problem]);
for t = 1 to 无穷 do
T = schedule[t];
if T == 0 then return current ;
next = 随机选择current节点的一个后继;
delta_E = VALUE[next] - VALUE[current] ;
if delta_E > 0 then current = next ;
else current = next with probability p = e^(delta_E / T) ;
很容易停留在局部极值上;
纯粹的随机行走,从后继节点集合中等概率地随机选择一个后继,然后移动到该后继,
因此是完备的,但缺乏效率;
模拟退火算法:将效率和完备性结合起来,即爬山法 + 随机行走
1. 模拟退火算法(simulated annealing)
在冶金中,退火是为了增加金属或玻璃的韧性和硬度而先将其加热到高温再让其逐渐
冷却的过程,使材料结合成一个低能量的结晶态。
模拟退火算法与爬山法类似,但是它没有选择最佳的移动,而是选择随机的移动。如果
该移动使情况得到改善,那么接受该移动;否则,算法以某个概率接受该移动。该概率
与移动的“恶劣程度”(即变坏的梯度值)成指数级下降,同时该概率也随着“温度”T的降
低而下降,即:
p = e^(delta_E / T),此时delta_E < 0.
开始时,温度较高,“坏的”移动更可能被接受,而T越低就越拒绝坏的移动。可以证明,
如果T下降的足够慢,模拟退火算法找到全局最优解的概率逼近于1.
function Simulated-Annealing(problem, schedule) return a solution state
input: problem
schedule, 从时间到温度T的一个映射
local variables: current, 一个节点
next, 一个节点
T, 一个温度值,用于控制下降步骤的概率
current = Make-Node(Initial-State[problem]);
for t = 1 to 无穷 do
T = schedule[t];
if T == 0 then return current ;
next = 随机选择current节点的一个后继;
delta_E = VALUE[next] - VALUE[current] ;
if delta_E > 0 then current = next ;
else current = next with probability p = e^(delta_E / T) ;
转自: