图炸了的话请多刷新几次(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. 生成CSV文件的方法*(LIST集合为数据和生成的文件名)

    /** * 生成csv文件 * @param pointsList 组织实体 * filename 生成的文件名 * list 要生成的数据 * @return */ public void Poin ...

  2. .Net8的AOT引导程序BootStrap

    前言 .Net8的本地预编机器码AOT,它几乎进行了100%的自举.微软为了摆脱C++的钳制,做了很多努力.也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等.而需要C++做的,也就仅仅是引 ...

  3. 基于GPT搭建私有知识库聊天机器人(四)问答实现

    前文链接: 基于GPT搭建私有知识库聊天机器人(一)实现原理 基于GPT搭建私有知识库聊天机器人(二)环境安装 基于GPT搭建私有知识库聊天机器人(三)向量数据训练 在前面的文章中,我们介绍了如何使用 ...

  4. Blazor资源大全,很棒的Blazor

    Blazor资源大全 一个收集了很棒的Blazor资源的集合. Blazor是一个使用C#/Razor和HTML在浏览器中运行的.NET Web框架. 欢迎贡献!请先查看贡献指南.感谢所有的贡献者,你 ...

  5. 开源资产管理系统chemex

    目录 项目地址 部署 初始化环境 安装docker.Mariadb 配置数据库 docker 脚本 运行 项目地址 gitee项目链接 部署 参考链接:Centos7使用Docker部署Chemex资 ...

  6. Django reset framework: 序列化

    序列化与反序列化 将模型转换为json 称之为 序列化 将json转换为模型 称之为 反序列化 何时进行序列化与反序列化 序列化:当后端将数据库中信息取出返回给前端时,要进行序列化操作 反序列化:当需 ...

  7. 使用 VirtualBox+Vagrant 创建 CentOS7 虚拟机

    一.准备工作 1.1 软件下载 VirtualBox:Downloads – Oracle VM VirtualBox Vagrant:Install | Vagrant | HashiCorp De ...

  8. webpack是如何处理css/less资源的呢

    上一篇文章 体验了webpack的打包过程,其中js文件不需要我们手动配置就可以成功解析,可其它类型的文件,比如css.less呢? css-loader 首先,创建一个空文件夹,通过 npm ini ...

  9. [ABC131E] Friendships

    2023-01-30 题目 题目传送门 翻译 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 找规律,构造 解题思路 先构造一个菊花图为最大边的图,再依次连边减小k. ...

  10. Programming abstractions in C阅读笔记:p127-p129

    <Programming Abstractions In C>学习第51天,p127-p129,总结如下: 一.技术总结 1. string library 掌握常用函数如strlen,s ...