技术标签: 退火算法 模拟退火算法 用神经网络模拟原子 SA 调参 参数设置
模拟退火算法有4个参数
N:每个温度迭代次数
T:重复降温次数
a:降温系数
t0:初始温度
本文用一个50个城市的TSP问题数据集,用交叉对比的方法调参。一组参数运行200次取平均。
首先调初始温度
N=1000,T=1000,a=0.99固定
可以看到在初始温度在1500时平均距离和标准差就几乎没有什么变化了。也就是初始温度在大于1500以后对结果已经没有什么影响。产生这种效果的原因是
模拟退火算法最重要的判断条件
Math.exp(差值/t)>r(0-1的随机数)
因为0-1之间随机平均下来就是0.5
Math.exp(-0.69)=0.5
也就是说-0.69< 差值/t <0 时Math.exp(差值/t)>0.5
所以大致可以将模拟退火算法理解成只要 差值的绝对值在t的0.7倍以内就会被采用。因为温度t随着迭代逐渐降低,t*0.7显然逐渐变得更小,实现了退火。
所以t0*a^N这个值对退火算法最为重要。
比如 1500*0.99^1000=0.06,0.06*0.7这个冗余度对计算路径太小了已经没什么意义。
第二步,调节降温系数
N=1000,T=1000,t0=1500固定
当降温系数=0.99815时平均距离为69276最优,这时t0*a^N=235,这道题的最短路径可能在66221附近,235*0.7/66221=0.002,这个冗余度相当于最优值的0.2%。
第三步调重复降温次数T
N=1000,a=0.99815,t0=1500固定
这组结果很明显同一个过程重复次数越多性能越好。但T越大速度也越慢,所以T取2500.因为每个温度迭代次数=1000固定所以t0*a^N也都是固定的。
第四步调节每个温度迭代次数N
T=2500,a=0.99815,t0=1500固定
这个很明显随着N的变化t0*a^N也显著变化,结果变差。
所以综合起来退火算法的四个参数
N:每个温度迭代次数
T:重复降温次数
a:降温系数
t0:初始温度
T越大性能越优,
N,a,t0这个三个变量是相互制约的,t0*a^N的值是退火算法最为关键的因素。一个大致可以参考的标准是t0*a^N*0.7/理论最优值=0.002。
这个测试和蚁群算法的测试用的数据集是一样的
虽然退火算法的最好平均值大于蚁群算法,
但是模拟退火算法的最优值是66221,这个最优值好于蚁群算法, 而且这个最优值多次出现,表明退火算法更有利于搜索全局最优值。
c语言捕获kill信号Programs may want to catch the kill signals sent by the kill command in C programs on Linux so that it can gracefully shutdown itself before it is killed. For example, I have a daemon progd...
Fspecial函数用于创建预定义的滤波算子,其语法格式为:h=fspecial(type)h=fspecial(type,parameters,sigma)参数type制定算子类型,parameters指定相应的参数,具体格式为:type='average',为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。type='gaussian',为高斯低通...
它可以重命名(如输入的aa,bb),重排序(拖动下面的任意一行),或者隐藏(点击下图种的"眼睛")query返回的字段(field)。对于你定义的一个或多个条件,若请求的数据匹配上了,你可以选择包含它,或者排除它。使用此转换按字段连接来自结果集的多个时间序列(合并请求很有用:请求源不同,请求的返回的数据结构相同)。这种转换针对有多个请求的panel,如果你想隐藏请求种的一个或多个时,可以使用这个转换。使用两个其他的字段(field),或者两个query的结果进行计算,获取一个新的字段。
import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import javax.swing.border.Border;public class ChickenProgram extends JFrame implements Act...
书接上文,上一篇扫描键盘使用的时查询方式,还有一种识别方式是中断,那么在这一篇中使用中断来进行单片机对按键的识别。本次实验使用了c8051f020和ZLG_7289芯片一.实验目的1.掌握ZLG7289专用按键显示芯片电路设计。2.掌握SPI通信程序设计方法。3.掌握基于ZLG7289按键显示驱动程序设计。二.实验内容设计一个定时器。要求:能够输入定时时长,定时最长时间为 9 分 5...
1. 前言:本篇内容基于上一篇文章【WPF实用教程2】(点此跳转)创建的解决方案进行演示。这一篇章通过自定义一个具有清空功能的输入框,带大家进入WPF自定义控件开发的内容,重在演示创建方法,其中涉及到的一些理论知识会简单提及,不会重点解释,后续会在进阶篇中讲解。工程最后效果图:2. 工程相关内容清理在进行演示前,先把...
灵动MM32F0010A1T使用高性能的ARM Cortex-M0为内核的32位MCU,工作频率可高达48兆赫兹,内置SRAM高速存储器,丰富的增强型I/O端口和外设连接到外部总线。MM32F0010A1T包含1个12位的ADC、1个16位通用定时器、1个16位基本定时器、1个16位高级定时器。还包含标准的通信接口:1个I2C接口、1个SPI接口和2个UART接口。MM32F0010A1T工作电压为2.0V5.5V,工作温度范围(环境温度)-40◦C85◦C常规型和-40◦C~105◦C扩展型(V)。多种
onBackPressed() : 当手机按下back键时,执行此方法。 用此方法时 :有super.onBackPressed() 时 不能把在此方法中设置的 intent 传回上一个Activity , 因此 去掉super.onBackPressed() 在末尾加上finish();
对接苹果支付流程上相较于微信或者支付宝来说 后端做的代码是非常少的 但是需要注意的点很多对于支付 最重要的是知道这笔支付到底是不是真正意义上成交了,以及成交价格是否对应我们的商品价格 这是我们需要去判断的苹果支付对于微信支付和支付宝支付来说,有本质的区别。苹果支付的商品需要现在appstore里面去上架。所以整个支付流程如下APP内请求苹果SDK发起支付。并完成购买。支付成功之后APP端会传一段receipt_data(同时需要带上APP支付成功的交易单号)给后端去做验证。后端拿到这个数据之后,.
import org.apache.catalina.connector.Connector;import org.apache.coyote.http11.Http11NioProtocol;import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;public class MyTomca...
最近发现了一门新技术,感觉开启了新世界的大门,写下这篇文章与同道共勉。如何将一个视频导出为canvas动画?视频能很方便的实现我们h5很难制作的动画,那么我们怎么将视频导出成为html canvas动画呢?AE + 插件Bodymovin.zxp这样就可以导出一份data.json(动画工程文件)和一份图片文件夹(里面包含着各样的帧图图片)将导出的材料发送给前端,前端通过lottie.j...
JavaScript的内置对象JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法对象的属性:反映该对象某些特定的性质的,如:字符串的长度、图像的长宽等;对象的方法:能够在对象上执行的动作。例如,表单的“提交”(Submit),时间的“获取”(getYear)等JavaScript 提供多个内建对象,比如 String、Date、Arr...