图炸了的话请多刷新几次(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. 【题解】ABC293E Sol

    题目大意 给定整数 \(A,X,M\),求 \(\sum\limits^{X-1}_{i=0} A^i\) 对 \(M\) 取模的值. 数据范围:\(1 \le A,M \le 10^9\),\(1 ...

  2. Go的语言特性有哪些

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本文主要通过值传递和指针.字符串.数组.切片.集合.面向 ...

  3. 即构SDK8月迭代:新增下行网络测速、切换房间、预览首帧回调等多项功能

    即构SDK8月上新,网络探测模块新增下行网络测速.媒体播放器新增缓存到文件结尾的回调.新增切换房间功能.新增预览首帧回调等.本月SDK迭代新上线的功能非常丰富,详细内容请看下文. LiveRoom 新 ...

  4. ISP之图像降分辨率

    1.图像缩放背景 图像的放大.缩小(简称缩放)是图像处理的一种处理方法.所谓图像缩放是指图像分辨率的改变,它在图像显示.传输.图像分析以及动画制作.电影合成.甚至医学图像处理中都有着相当广泛的应用.比 ...

  5. 平时容易忽视的地方之一:java在抽取方法时,什么时候该用void

    当一个类中多个方法有相同编码,或该部分编码可以作为一个整体,适合抽取出一个方法时,要注意这个抽取的方法的返回值,什么时候可以用void,什么时候不能用void? 先看代码: import lombok ...

  6. DataArts Studio实践丨通过Rest Client 接口读取RESTful接口数据的能力

    本文分享自华为云社区<DataArts Studio 通过Rest Client 接口读取RESTful接口数据的能力,通过Hive-SQL存储>,作者: 张浩奇 . Rest Clien ...

  7. Feign自定义重试策略及超时时间

    背景 feign可以配置重试策略及超时时间,但是无法根据业务场景动态的设置.可能会引起接口幂等,无效重试资源耗费,大数据量耗时操作报超时异常等问题.所以需要更细粒度的重试策略及超时时间配置. 自定义重 ...

  8. js中调用函数中的变量

    (function f1() { var num = 10; window.num = num;})(); console.log(num);

  9. CSS基础(4)

    目录 1 定位 1.1 为什么需要定位 1.2 定位组成 1.2.1 边偏移(方位名词) 1.2.2 定位模式 (position) 1.3 定位模式介绍 1.3.1 静态定位(static) - 了 ...

  10. HTTP请求时哪些请求头是默认携带的?

    提起HTTP的请求头和响应头总是一头雾水,因为总是看上去一大堆,好多还不知道是什么意思. 今天我们先研究请求头,我就想,如果我们能弄清楚,在我们什么都不做的情况下,一个最简单的HTTP请求会携带哪些请 ...