首页 > 编程语言 >堆优化模拟退火(List-Based Simulated Annealing|List-Based SA|LBSA|模拟退火) 算法

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

时间:2023-08-09 15:37:21浏览次数:41  
标签:状态 Based -- emsp List ln 模拟退火 温度

堆优化模拟退火(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) \\ e^{\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 ↩︎ ↩︎

标签:状态,Based,--,emsp,List,ln,模拟退火,温度
From: https://www.cnblogs.com/znpdco/p/17615397.html

相关文章

  • C# list常用的几个操作 改变list中某个元素的值 替换某一段数据
    1、改变list中某个元素的值publicclasstb_SensorRecordModel{publicintID{get;set;}publicdecimalValue1{get;set;}}List<tb_SensorRecordModel>list=newList<tb_SensorRecordModel>();li......
  • MDC-based Angular Material组件迁移
    1.前言在AngularMaterialv15中,许多组件已基于官方的WebMaterialDesignComponents(MDC)进行了重构。以下导入的组件已被重构:ImportpathSummaryofchanges@angular/material/autocompleteStylechangesonly@angular/material/buttonStylechanges,A......
  • Bootstrap框架----多条记录双文本(List)添加
    有时候我们需要实现双文本的多条记录录入,传给后台保存成List的结构。界面交互设计如图:可动态添加行数,每行固定两个文本录入。我们在之前的文章中已经在SpringMVC基础框架的基础上应用了BootStrap的后台框架,在此基础上记录多条文本录入用法。应用bootstrap模板基础项目源码下载......
  • ASP.NET------DropDownList的使用方法
    第一种少量自定义数据时:.aspx中的代码:<asp:DropDownListID="DropDownList1"runat="server"><asp:ListItemValue="2">男</asp:ListItem><asp:ListItemSelected="True"Value=&quo......
  • 2-3 list2-8 逐个显示字符,再逐个消去
    #include<stdio.h>#include<time.h>#include<string.h>//等待x毫秒intsleep(unsignedlongx){clock_tc1=clock(),c2;do{if((c2=clock())==(clock_t)-1)return0;}while((c2-c1)<x);return1;}int......
  • ArrayList底层原理、线程安全及其相关集合(面试常问)
    一、ArrayList底层原理1.特点及其原理:ArrayList底层基于数组实现,查找快,增删慢2.ArrayList底层原理,初始化及调用add()方法添加元素:默认初始化容量为10第一次创建集合并在添加第一个元素时在底层创建一个默认长度为10的数组:​调用构造函数初始化时默认创建的是空数组只......
  • Junit - 如何测试List
    背景测试过程中,需要校验查询列表返回数据的正确性。常见的需求如:验证查询条件正确性:输入某查询条件,验证返回结果的List所有记录的该字段均为输入条件;验证数据正确性:验证查询结果中,某字段不能为空,某字段一定需要>0,某字段是个List,但是List的Size一定不为0;添加数据后,查询......
  • 如何使用Microsoft List的评级功能促进用户的协作和决策
    博客链接:https://blog.51cto.com/u_13637423MicrosoftLists是一个多功能的应用程序列表,可以使团队有效地组织、跟踪和共享相关信息,在MicrosoftLists中有一个非常重要且有趣的功能:Rate(评级)功能,用户可以针对列表中的项目完成评级并提供反馈。本文将给大家介绍如何启用MicrosoftLis......
  • 【MFC】CListCtrl 如何设置单元格颜色?
    CListCtrl默认可设置的内容很少,如单元格颜色默认无法设置。若想设置单元格颜色,需要对CListCtrl进行拓展,已有老外为我们写好demo,这里对其中原理、设置方法进行一个解析。其原理是:设置CListCtrl控件的OwerDraw属性为true,然后使用GDI画图函数进行各种自定义绘制。拓展的类为CColor......
  • 【转】JAVA中list和原生数组的互相转换
    经常用经常忘转自 javaList和数组相互转换的方法总结_javalist转为数组_great-sun的博客-CSDN博客Java中,可以通过以下方法将List转换为数组:List<String>list=newArrayList<>();String[]array=list.toArray(newString[0]);在这个例子中,我们将一个String类型的List......