模拟退火随机大法

该博客介绍了一种使用模拟退火算法求解最优化问题的方法。通过设定初始状态、退火参数和迭代次数,算法在不断交换元素位置的过程中寻找最小权值。在每次迭代中,算法根据退火策略决定是否接受权值更高的状态,从而在全局范围内搜索最优解。最终,算法在给定的模拟退火次数后返回最小权值。
摘要由CSDN通过智能技术生成

如:求最小权值

各变量含义

  • T:当前温度
  • T_min:熄火时刻
  • r:退火速度
  • delta:距离差
  • now:当前状态
  • next:随机选的状态
  • calc(now):当前状态权值
  • res:当前最优解
  • cnt:执行模拟退火次数
import random
import math

n = int(input())
now = list(range(0, n)) # 初始化状态
res = float('inf')
cnt = 50

def calc(st):
    res = 0
    # 计算状态st权值
    return res

def SA():
    T, T_min, r = 1e6, 1e-5, 0.97
    while T > T_min:
        x, y = random.randint(0, n), random.randint(0, n)
        next = now[:]
        next[x], next[y] = next[y], next[x] # 随机交换两个位置元素
        a, b = calc(now), calc(next)
        delta = b - a
        if delta < 0: # 如果状态b的权值更小,则一定跳到这个状态
            now = next[:]
        else: # 否则以一定概率跳到比它权值高的状态
            if math.exp(-delta / T) > random.random(): # 当x<0时,0<e的x次方<1,所以在0~1内找一个随机数与之比较
                now = next[:]
        res = min(res, calc(now)) # 尝试更新答案
        T *= r

for _ in range(cnt):
    SA()

print(res)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值