模拟退火python

模拟退火可以解决局部最优带来的困境,即以一定的概率接受差解

以此来达到全局最优,对解决商旅文体有很好的效果

只记录路径交换方法函数以免我以后忘了

#模拟退火,利用温度控制逐步减少接受差解的概率,最终达到局部最优
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]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值