图炸了的话请多刷新几次(upd:8.9)

堆优化模拟退火(List-Based Simulated Annealing) 算法

引入

堆优化模拟退火(List-Based Simulated Annealing,简称 LBSA) 是一种对 模拟退火 的优化算法。由 Shi-hua Zhan,[1],[2] Juan Lin,[1:1] Ze-jun Zhang,[1:2] Yi-wen Zhong[1:3],[2:1] 提出。(以下我们以求最小值为例)

解释

我们定义当前温度为 \(t\) ,已知状态为 \(x\) ,新状态为 \(y\), 能量(值)的计算函数为 \(f\)。根据 模拟退火 可以得到发生状态转移(修改最优解)的概率 \(p\) 为(公式1):

\[p=\begin{cases}
1 & \text{if}\ f(y)\le f(x) \\
\exp({\frac{-(f(y)-f(x))}{t}}) & \text{otherwise}
\end{cases}
\]

相反,如果我们知道发生状态转移的概率 \(p\), 那么我们就可以计算出相应的温度 \(t\)。

证明过程
  1. 首先,将等式两边取对数,得到 \(\ln(p)=\frac{-(f(y)-f(x))}{t}\)。

  2. 然后,将等式两边相乘得到 \(t\ln(p)=-(f(y)-f(x))\)。

  3. 最后,将等式两边除以 \(\ln(p)\) 得到 \(t=\frac{-(f(y)-f(x))}{\ln(p)}\)。

可以得到相应的温度 \(t\) 为(公式2):

\[t=\frac{-(f(y)-f(x))}{\ln(p)}
\]

生成初始温度堆

顾名思义,堆优化,那肯定有堆!其实我们是要生成一个初始的温度堆,里面存储了大量的温度。温度堆怎么生成呢?下图表对此进行了解释:

graph TD
a(温度堆生成开始) --> b[定义初始状态 $x$<br/>创建空的温度堆 $L$<br/>定义温度堆长度 $L$<sub>$max$</sub><br/>定义初始发生状态转移的概率 $p$<br/>$i=0$] --> c[创建新状态 $y$] --> d{"$f(y)<f(x)$ (解更优)"} --NO--> f["计算温度 $t=(-(f(y)-f(x)))/\ln(p)$(公式2)&emsp;&emsp;&emsp;&emsp;<br/>将温度 $t$ 插入温度堆 $L$ 中<br/>$i++$"] --> g{"$i < L$<sub>$max$</sub>"} --Yes-->c
d --Yes--> e["$x=y$(更新状态)"] --> f
g --NO--> h[结束]

(做图表真的累)

我们一般定义 \(p=0.1\)。

这个温度堆为大根堆,即温度越高,优先级越高。重复相同的程序,直到填满。

温度控制

对于第 \(i\) 次模拟退火,我们会跑 \(M\) 次。定义当前温度堆最大值为 \(t_{max}\) ,已知状态与新状态的值差为 \(d_i\),那么发生状态转移的概率 \(p_i\) 为(公式3):

\[p_i=e^{-d_i/t_{max}}
\]

以上可以通过公式 1 得出(应该是一毛一样)。

根据Metropolis算法(Metropolis acceptance criterion),每次遇到一个较差的新状态,生成一个从0到1的随机小数 \(r\)。如果 \(r\) 小于发生状态转移的概率 \(p\),则将接受较差的新状态,同时通过以下公式算出新的温度 \(t_i\)(公式4):

\[t_i=\frac{-d_i}{\ln(r_i)}
\]

证明可参见公式 2 的证明。

更新列表

对于第 \(i\) 次模拟退火,我们跑完 \(M\) 次后,将最大值 \(t_{max}\) 从堆里删去,插入上述 \(t_i\) 的平均值,然后进行下一次模拟退火。

下图表对此进行了详细解释:

graph TD
a(LBSA开始) --> b[生成温度堆<br/>生成状态 $x$<br/>$k=0$] --> c[从温度堆 $L$ 堆顶取出最大值 $T$<sub>$max$</sub><br/>$k++,t=0,c=0,m=0$] --> d[创建新状态 $y$<br/>$m++$] --> e{"$f(y)<f(x)$ (解更优)"} --No--> f["定义$d_i=−(f(y)-f(x))$<br/>$p=exp(-d_i/t$<sub>$max$</sub>$)$(公式3)<br/>生成从0到1的随机数 $r$"] --> g{"$r\le p$"} --Yes--> h["$t=t+(-d_i/\ln(r))$ &emsp;&emsp;&emsp;&emsp;<br/>c++"] --> i["$x=y$ &emsp;&emsp;&emsp;&emsp;"] --> j[$m\le M$] --No--> k{"$c==0?$ &emsp;&emsp;&emsp;&emsp;"} --No--> l["弹出温度堆 $L$ 堆顶<br/>插入 $t/c$"] --> m{$k\le K$} --No--> n(LBSA结束)
e --Yes--> i
g --No--> j
j --Yes--> d
k --Yes--> m
m --Yes--> c

  1. College of Computer and Information Science, Fujian Agriculture and Forestry University, Fuzhou 350002, China

  2. Center of Modern Education Technology and Information Management, Fujian Agriculture and Forestry University, Fuzhou 350002, China

堆优化模拟退火(List-Based Simulated Annealing|List-Based SA|LBSA|模拟退火) 算法的更多相关文章

  1. Dijkstra算法堆优化

    转自 https://blog.csdn.net/qq_41754350/article/details/83210517 再求单源最短路径时,算法有优劣之分,个人认为在时间方面 朴素dijkstra ...

  2. 模拟退火 Simulated annealing

    模拟退火 Simulated annealing 看看有空把图片完善一下好了 模拟退火算法的一些背景 既然要说模拟退火算法,就应该说一下模拟退火算法的背景,模拟退火算法是局部搜索算法的一种扩展,该算法 ...

  3. uva10986 堆优化单源最短路径(pas)

    var n,m,s,t,v,i,a,b,c:longint;//这道题的代码不是这个,在下面 first,tr,p,q:..]of longint; next,eb,ew:..]of longint; ...

  4. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  5. 堆优化的Dijkstra

    SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...

  6. codeforces 449B Jzzhu and Cities (Dij+堆优化)

    输入一个无向图<V,E>    V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...

  7. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  8. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  9. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  10. Dij的堆优化

    #include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #i ...

随机推荐

  1. T-star高校挑战赛部分wp

    web-1签到 checkin还是很基础的 网站上传存在js检测,禁用js即可上传 写PHP一句话木马上传,http://588f25a5.yunyansec.com/upload/test.php连 ...

  2. Git子模块使用说明

    介绍 前端不同应用存在公共的脚本或样式代码,为了避免重复开发,将公共的代码抽取出来,形成一个公共的 git 子模块,方便调用和维护. 软件架构 本仓库代码将作为 git 子模块,被引用到其他仓库中,不 ...

  3. python打包方法

    在Python中,要编写setup.py文件,用于构建和打包你的Python项目,你可以遵循以下步骤: 创建项目目录结构:首先,你需要创建项目的目录结构,包括源代码文件.资源文件等.一个常见的项目结构 ...

  4. Blazor实战——Known框架多表增删改查

    多表增删改查示例 本章介绍学习多张表增.删.改.查功能如何实现,下面以销货出库单作为示例,该业务栏位如下: 销货出库单栏位 销货单号.销货日期.状态.客户.备注 销货出库单明细栏位 商品编码.商品名称 ...

  5. 【技术积累】Linux中的命令行【理论篇】【二】

    ag命令 命令介绍 ag命令是一个用于在Linux系统中进行文本搜索的工具.它是基于Silver Searcher的改进版本,具有更快的搜索速度和更强大的功能. ag命令的基本用法是在指定的目录中搜索 ...

  6. 渗透-02:HTTPS主干-分支和HTTPS传输过程

    一.HTTPS主干-分支 第一层 第一层,是主干的主干,加密通信就是双方都持有一个对称加密的秘钥,然后就可以安全通信了. 问题就是,无论这个最初的秘钥是由客户端传给服务端,还是服务端传给客户端,都是明 ...

  7. 自定义javascript中call、bind、apply方法

    call.bind.apply都是Function原型上的方法,用于改变this的指向 自定义函数 js中的call.bind.apply是用c++代码实现的,我们这里使用js代码做一个模式,没有把所 ...

  8. 「学习笔记」gdb 调试的简单操作

    gdb是一个命令行下的.功能强大的调试器. 在学习 gdb 前,我们要知道几个最基本的 cmd 命令. cmd 首先,对于 win10 系统,我们按 Windows + R 键,打开运行窗口,在里面输 ...

  9. IDA的使用2

    IDA的使用2 string类型的选择 Rename 要注意如果再namelist和public name里面是不能重名 操作数 这个主要和开发结合精密, change sign-改变符号 bitwi ...

  10. 安装iTerm2和oh-my-zsh

    安装iTerm2和oh-my-zsh 此文是在参考许多教程(见目录:参考)并结合本人安装经历写下的一篇关于iTerm2和oh-my-zsh的认识和超级详细安装教程.全文所有图片均为本人截屏拍摄.希望能 ...