模拟退火可以解决局部最优带来的困境,即以一定的概率接受差解
以此来达到全局最优,对解决商旅文体有很好的效果
只记录路径交换方法函数以免我以后忘了
#模拟退火,利用温度控制逐步减少接受差解的概率,最终达到局部最优
def sa():
t = 200 #设置初始温度
tf = 0.01 #设置终止温度
kb = 0.5 #设置降温系数
f1 = comp_bestway_score() #f1保存当前解分值
obway = [0] * n #obway保存当前最优路径
for i in range(n):
obway[i] = bestway[i] #保存当前最优路径
obscore = f1 #obscore保存全局最优分值
while t > tf:
for iter in range(2000): # iter为等温过程迭代次数
v1 = random.randint(0,n-1)#
v2 = random.randint(0,n-1)#随机选择两个不同的结点
if(v1 != v2):
if(v2<v1):
v1,v2=v2,v1
if(v1<v2):
l=bestway[v1:v2+1]
l.reverse()
bestway[v1:v2+1]=l
#bestway[v1],bestway[v2]=bestway[v2],bestway[v1]#随机交换两个城市的顺序
f2 = comp_bestway_score() #f2保存候选解分值(新路径的分值)
if(f2 < obscore): #如果新路径分值变好
obscore = f2
for i in range(n):
obway[i] = bestway[i]#用新路径替换当前路径
delta = f2 - f1 #计算候选解与当前解之间的差值(ΔE)
if(delta < 0): #直接接受候选解
f1 = f2
else:
alpha = random.random()
if( alpha < math.exp( - delta / t )):
f1 = f2
else: #不接受候选解,回退到当前解
# bestway[v2], bestway[v1] = bestway[v1], bestway[v2]
l=bestway[v1:v2+1]
l.reverse()
bestway[v1:v2+1]=l
t = kb * t #降温
# 将最终获取到的最优路径更新至bestway
for i in range(n):
bestway[i] = obway[i]