您的位置:首页 > 其它

优化方法-模拟退火法

2015-11-23 15:31 176 查看
模拟退火法是针对爬山法只能求出局部最优解提出来的。模拟退火法其实也是一种贪心法,但是他搜寻最优解的过程中引入了随机因素,允许在中间的计算过程中按照一定的概率来接受相对较差的中间结果,因此它有可能调出局部最优解寻找到全局的最优解。

模拟退火法算法描述:

若J(Y(I+1)) >= J(Y(I)) (即移动后得到更优解)则总是接受该移动

若J(Y(I+1)) < J(Y(I)) (即移动后得到的解比当前解要差) 则以一定的概率接受该移动,并且这个概率随着时间的推移逐渐降低

上行中一定的概率参考了冶金中的退火过程,其计算公式如下:

p= exp(-(highcost-lowcost)/temperture) 因为温度(接收较差的解的意愿)开始非常高,指数总是接近于0,所以概率接近于1,随着温度的降低,高成本和低成本之间的差异越来越大,概率越低。因此该算法只倾向于稍微差的解而不会是非常差的解。

关键代码实现:

def annealingoptimize(domain,costf,T=10000.0,cool=0.95,step=1):
#随机初始化值
vec= [float(random.randint(domain[i][0],domain[i][1]))
for i in range(len(domain))]

while T>0.1:
#选择一个索引值
i = random.randint(0,len(domain)-1)

#选择一个改变索引的方向
dir = random.randint(-step,step)

#创建一个代表题解的新列表,改变其中的一个值
vecb = vec[:]
vecb[i] += dir
if vecb[i] < domain[i][0]:
vecb[i] = domain[i][0]
elif vecb[i] > domain[i][1]:
vech[i] = domain[i][1]

#计算当前新成本和当前
ea = costf(vec)
eb = costf(vecb)

#是更好的解或者按照概率被接收
if (eb<ea or random.random()<pow(math.e,-(eb-ea)/T))
vec = vecb

#降低温度
T = T*cool
return vec


为了退火,函数需要创建一个合适长度的随机数,在每个属性的上下限阈值范围内。维度T和冷却率cool是两个可选的参数,函数每次迭代的时候将i设定为一个随机索引,并将dir设为介于-step和step之间的某个随机数。该函数会持续计算直到设定的温度退出条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: