首页 > 其他分享 >模拟退火(浅谈)

模拟退火(浅谈)

时间:2023-11-03 10:33:57浏览次数:36  
标签:最优 浅谈 dE 模拟退火 tempy tempx 能量 温度

写在前面

放眼历史,喧嚣过后终归无声,热寂才是最终归宿。
image

算法思想

世界上的万事万物总是比较容易稳定在低能量的状态,当物体温度较高时,内能较大,固体内部粒子处于快速无规则运动,在固体温度慢慢降低的过程中,固体内能减小,粒子慢慢趋于有序。
举个现实生活的小栗子:在冶金工业中,通常会把结构不是很稳定的金属矿石(不处于能量最低)加热到一个较高温度,使它的能量变高内能增大,内部粒子平均运动速率变快。相当于把金属大部分粒子先提升到一个比较高能量的位置,再降温,降温之后把温度恒定,停留足够长的一段时间之后,我们就可以认为金属在这个温度下已经达到平衡状态(可能是最低或局部最低的能量状态),结构在这个温度下稳定。接下来再降低温度,再稳定一段时间不变,一次一次的降温,最终我们期望在降到最低的温度的时候金属处于最稳定的状态。
在微观世界中,有时给电子提供一部分能量,让电子跃迁到能量稍微高一点的能及上去,电子在那个能及上是不稳定的,然后就会一下子跳到能量更低的能级上,这个过程释放大量能量,达到更稳定的状态。就是说它最开始的状态相对稳定(处于局部最优状态),给它能量升高的机会,它才会跃迁到能量更低的层级上去。

作用

通过多次迭代,逼近函数的最值。

几个概念

\(T\):初始温度(数越大,正解概率越高,但是耗时越长)
\(down\): 温度变化率(越大约不准确,但越快),设置这个系数的目的是让\(T\)能以一个合适的速度减小,使得当\(T\)在到达边界时我们已经尝试了足够多组解来使最终解接近最优解,由于越临近结束越接近最优解,可以加快降温速度,通常使\(T_{i}=T_{i-1}\times down\)。
\(x\):每次随机选择的解。
\(\triangle x\):\(x\)的变化量,通常(\(x_i=x_{i-1}+\triangle x\)),随机取值的值域与\(T\)成正比(温度越高分子无规则运动越剧烈)。
\(dE\):熵变,两次函数值的差值。

实现方式

定一个较高温度\(T\)(加热),进入外层循环(由温度决定,控制温度慢慢下降,结束条件为\(T\)小于指定值)。在内层循环中在一定范围内随机找一个\(x_{i+1}\)(一般情况下 $x_{i+1}=x_i+T\times $一个从\(0\)到\(1\)的随机数 )。判断\(f(x_{i+1})\)是否优于\(f(x_i)\),若\(dE\)不小于\(0\),接受\(x_{i+1}\),替换\(x\)并与全局最优解对比。若\(dE\)小于\(0\),有一定概率接受\(x_{i+1}\),\(dE\)越小接受概率越小,通常用函数\(e^{\frac{dE}{kT}}\)(\(e\)为自然对数,\(k\)为玻尔兹曼常数(近似于\(1.3\)))于一个从\(0\)到\(1\)的随机数比较,若函数值大于随机数则接受\(x_{i+1}\)。循环一定次数(或者连续几次\(dE\)接近\(0\),内能变化小,体系接近稳定)后退出内层循环。继续降温......

随便抓一只伪代码
反正不是我写的
int T = 114514;
int tempx, tempy, tempans, de;
//下面的x, y, ans为临时最优解
while( T > 1e-15 ){  //T十分接近零
	tempx = x + (rand() * 2 - RAND_MAX) * T;
	tempy = y + (rand() * 2 - RAND_MAX) * T;
	//rand() * 2 - RAND_MA可以生成从 -32767 到 32767 的随机数,以让坐标点转移到一个随机位置,随着不断降温,T会越来越小,所以坐标点转移的范围也会越来越小,逐渐逼近最优点
	tempans = solve( tempx, tempy )
	//solve是用来求内能
	de = tempans - ans;
	if( de < 0 ){//是大于还是小于具体问题判断   
		x = tempx;
		y = tempy;
		w = tempw;
	} else if( exp( -de / T ) * RAND_MAX > rand() ){//以一个概率选择是否接受,但是就算是接受,我们也不会用它来更新最优解,因为我们当前的最优解比它优秀。传如esp函数中的值需为负	
		x = tempx;
		y = tempy;	
	}
	T *= down;//降温
}

写在后面

生命以负熵为食,建立宇宙微秩序。

标签:最优,浅谈,dE,模拟退火,tempy,tempx,能量,温度
From: https://www.cnblogs.com/PHOTONwa/p/17802122.html

相关文章

  • ThreadPoolExecutor使用浅谈
    1.基础介绍ThreadPoolExecutor是Python标准库concurrent.futures模块中的一个类,用于实现线程池的功能。ThreadPoolExecutor模块相比于threading等模块,通过submit方法返回的是一个Future对象,它代表了一个未来可期的结果。通过Future对象,我们可以在主线程(或主进程)中获取某个线程(......
  • 浅谈搜索展现层场景化技术-tanGo实践 算子化
    浅谈搜索展现层场景化技术-tanGo实践https://mp.weixin.qq.com/s/nVy9SYRIaaqZWgOHKTMQ4Qintroduction本文为搜索展现层相关技术,主线会先通过介绍搜索阿拉丁的产品形态,让读者初步了解什么是阿拉丁,及相关展现概念。之后会聚焦场景化产品,场景化是搜索构建沉浸式完美体验(重新组合整......
  • 浅谈筛法——埃氏筛
    前置芝士:见浅谈筛法——普通筛例·1素数个数:运用上一篇的知识,可得出以下代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintmaxn=1e8+5;intn,ans;boolprime(intx){ if(x==1){ return0; } if(x==2){ return1; } for(inti=2......
  • 浅谈筛法——普通筛
    前置知识-因数和倍数(六年级及以上自行跳过):\(n\divm=k\),我们就说\(n\)是\(m\)和\(k\)的倍数,\(m\)和\(k\)是\(n\)的倍数。简单来说就是这样的:\(\text{被除数}\div\text{除数,余数为0}\),那我们就说除数是被除数的因数,被除数是除数的倍数。前置知识-素数和合数(六年级及以上自......
  • 浅谈UI自动化测试
    随着软件行业的不断发展,建立一个完善的自动化测试体系变得至关重要。目前,自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言,企业在UI自动化测试方面的覆盖率仍然相对较低。接口自动化测试可以模拟和执行应用程序接口的各种操作,以验证接口的功能、性能和稳定......
  • 浅谈UI自动化测试
    随着软件行业的不断发展,建立一个完善的自动化测试体系变得至关重要。目前,自动化测试主要涵盖接口自动化测试和UI自动化测试两个主要领域。就目前而言,企业在UI自动化测试方面的覆盖率仍然相对较低。接口自动化测试可以模拟和执行应用程序接口的各种操作,以验证接口的功能、性能和稳......
  • 浅谈城市综合管廊运维的系统集成方案
    安科瑞电气股份有限公司:罗轩志摘要:从网络拓扑结构、开放式实时以太网协议、控制层系统配置方面介绍了综合管廊的系统网络架构设计,分析了无线网络特性,阐述了基于HTML5架构所能实现的功能的初步构想,以便于综合管廊运维人员巡检,确保管廊本体安全。0引言综合管廊的控制部分是保证综合......
  • 浅谈关于羚通智能分析平台通道管理和告警查询的使用功能
    ​上期我们知道了如何使用羚通智能分析平台,今天我们来详细了解一下羚通智能分析平台的通道管理和告警查询的使用功能。因为羚通智能分析平台主要是做视频算法分析的,所以我们今天来看一看羚通智能分析平台的通道管理和告警查询两个部分的使用情况如何。上一期,我们了解了一下......
  • 浅谈动态规划——01背包
    本文暂时不谈记忆化搜索先看例题P1048采药(其实就是个加了题目背景的01背包板子题)我知道你可能不想读题,所以我把题意写在这里了题意你总共有T的时间有n个物品,第i个物品的价值为w[i],拿走它消耗的时间为v[i],且每个物品只能拿一次计算出能拿取的物品的最大总价值我猜你会这......
  • 浅谈排序网络与并行排序算法
    对于普通的基于比较排序我们拥有一个复杂度下界\(O(n\logn)\),然而如果我们允许并行计算的话,将得到一些复杂度更优秀的计算方法。听到并行这个词许多人就会认为你有几个线程复杂度就除以几,所以线程堆得越多越好。但许多的算法问题都必须要满足你必须要算完A才能去计算B,比如对......