zoukankan      html  css  js  c++  java
  • 浅谈模拟退火

    核心思想

    模拟退火十分好写,它的核心思想就是:

    每一次降温都可以从当前状态转移到另一种相近状态(没有严格定义,可以自己想产生相近解的方法)

    如果那个相近状态的答案更优,当然转移到那种状态!

    但如果更劣,也需要一定的概率转移到那种状态(防止陷入局部最优解)

    那个概率就是:

    [P=e^{frac{nowVal-nextVal}{T}} ]

    这里的T就是当前温度,Val是对应状态的答案

    要注意(frac{nowVal-nextVal}{T})是一个负值,因此必定有(0<P<1)

    可以看出,当那种相近状态越劣((nowVal-nextVal)越小),就有越小的概率转移到那种状态

    而当前温度越低,也是越稳定的

    (这里针对的是答案越小越优的题目)

    参数设置

    模拟退火是一个十分依赖参数的随机化算法,大致有以下几个参数

    ①初始温度(startT)

    ②温度变化率(deltaT)

    ③温度下限(lowT)

    ④随机种子(seed)

    初始温度大致可以设在100~10000,防止一开始活跃性太高,陷入太劣的解

    温度变化率宜设置在0.99~0.999

    温度下限可以很小,大概在1e-15~1e-10之间

    至于(seed)...

    大致流程

    综上,模拟退火的大致流程就是:

    ①初始化温度

    ②产生相近状态

    ③利用上述方法判断是否转移,并同时改变记录的答案值

    ④降温,goto ②

    直到温度低于下限结束

    最后说一下,四个参数的调整对算法效率影响很大,可以自己做题体会一下

    例题

    提供几道例题练手

    [JSOI2004]平衡点

    [NOIp提高组2017]宝藏

  • 相关阅读:
    linux环境变量
    linux命令系列 ls
    为什么寄存器比内存快?
    Python RE
    Python List Comprehension
    转:C++ 关键字 inline详细介绍
    转:c++里关于cerr,clog,cout三者的区别
    CS项目总结
    selenium 添加动态隧道代理
    python 进程/线程/协程 测试
  • 原文地址:https://www.cnblogs.com/ytxytx/p/9705916.html
Copyright © 2011-2022 走看看