首页 > 其他分享 >模拟退火

模拟退火

时间:2023-08-06 20:28:15浏览次数:54  
标签:rand ch db 新解 模拟退火 Delta

模拟退火(Simulate Anneal)是一种用于解决问题方案数极大且非单峰函数的随机化算法,原理与金属退火类似。

每次随机出一个新解,若新解更优则接受,否则以一个与温度和与最优解的差相关的概率接受它。

降温

模拟退火有三个参数:初始温度 \(T_0\),降温系数 \(\Delta\),终止温度 \(T_k\).

其中 \(T_0\) 为较大的数,\(\Delta\) 为略小于 \(1\) 的正数,\(T_k\) 为略大于 \(0\) 的正数。

初始令温度 \(T=T_0\),降温时 \(T\rightarrow T\times\Delta\),直至 \(T\le T_k\).

随着温度降低,解逐渐稳定并集中在最优解附近。

生成新解

在当前解的基础上生成一个新解,方法较多。

调整

若新解更优,接受新解。

否则以一定概率接受解。设 \(\Delta W\) 为新解与当前解的差,我们希望这个概率随 \(T\) 的减小而减小,随 \(\Delta W\) 的减小而减小。

取 \(\displaystyle e^{-\frac{\Delta W}{rT}}\) 作为概率,其中 \(r\) 为随机数。

如果 \(\Delta W\) 的值比较极限就很容易崩掉,可以对 \(r\) 的范围进行一些限制。

精确度提高

为提高随机化算法的正确性,每次退火从上一次的最优解开始能够减小误差。

另外还需要对 \(r\) 的范围、\(\Delta\)、\(T_0\) 和 \(T_k\) 调参

笼统地,可以增加模拟退火次数,调大 \(\Delta\),调整 \(T_0\) 和 \(T_k\).


P1337 [JSOI2004] 平衡点 / 吊打XXX

使用模拟退火跑出整个系统能量的最小值。

比运气比不过别人,交了整整七发。

#include<bits/stdc++.h>
#define db double
#define N 1010
#define eps 1e-14
using namespace std;
int read(){
	int x=0,w=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*w;
}
struct node{
	int x,y,w;
}a[N];
int n,sx,sy;
db ansx,ansy;
db ans=1e18,t;
const db delta=0.993;
db calc(db x,db y){
	db ret=0,dx,dy;
	for(int i=1;i<=n;i++){
		dx=x-a[i].x,dy=y-a[i].y;
		ret+=sqrt(dx*dx+dy*dy)*a[i].w;
	}
	return ret;
}
void SA(){
	db x=ansx,y=ansy;
	t=2000;
	while(t>eps){
		db X=x+((rand()<<1)-RAND_MAX)*t;
		db Y=y+((rand()<<1)-RAND_MAX)*t;
		db now=calc(X,Y),Delta=now-ans;
		if(Delta<0){
			x=X,y=Y;
			ansx=x,ansy=y,ans=now;
		}
		else if(exp(-Delta/t)*RAND_MAX>rand())
				x=X,y=Y;
		t*=delta;
	}
}
void solve(){
	ansx=(db)sx/n,ansy=(db)sy/n;
	SA(),SA(),SA();
}
int main(){
	srand(2794735),srand(rand()),srand(rand());
	n=read();
	for(int i=1,x,y,w;i<=n;i++){
		x=read(),y=read(),w=read();
		a[i]=(node){x,y,w};
		sx+=x,sy+=y;
	}
	solve();
	printf("%.3lf %.3lf\n",ansx,ansy);
	 
	return 0;
}

标签:rand,ch,db,新解,模拟退火,Delta
From: https://www.cnblogs.com/SError0819/p/17609905.html

相关文章

  • 模拟退火
    引入模拟退火是一种随机化算法,当一个问题方案数量极大且非单峰时,我们常使用模拟退火过程先引入几个参数:当前最优解\(E_0\),新解\(E\),解变动量\(\DeltaE\)(即\(E\)与\(E_0\)的差),上一个被接受的解\(E_1\),初温\(T_0\),末温\(T_k\),当前温度\(T\),温度变动量\(\Delt......
  • 优化算法——模拟退火算法
    模拟退火算法原理爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示:其目标是要找到函数的最大值,若初始化时,初始点的位置在处,则会寻找到附近的局部最大值点处,由于点出是一个局部最大值点,故对于爬山法来讲,该算法无法跳出局部最大值点。若初始点选择在处,根据爬......
  • 基于模拟退火优化算法的三维装箱优化matlab仿真,优化重量利用率和空间利用率
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减......
  • 基于模拟退火优化算法的三维装箱优化matlab仿真,优化重量利用率和空间利用率
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要      模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平......
  • 模拟退火
    模拟退火模拟退火是一种随机化算法,当一个问题的方案数极大(甚至是无穷的)而且不是一个单峰函数的时候,我们可以考虑用模拟退火来解决,当然这只能给我们骗更多的分,想通过的话有一定的难度。优点根据爬山算法的过程,我们发现,爬山算法只能看到当前的最优解,而如果后面又有更优的解,爬山算......
  • 基于SA模拟退火优化的TWVRP路径规划matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要模拟退火算法(simulatedannealing,SAA)来源于固体退火原理,是一种基于概率的算法。模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增......
  • 模拟退火算法—旅行商问题(TSP)优化 Matlab代码可用于路径规划,物流配送,路径优化
    模拟退火算法—旅行商问题(TSP)优化Matlab代码可用于路径规划,物流配送,路径优化源码+注释数据可以修改多少个坐标都行帮忙改数据就是另外的价钱[旺柴]代码一经售出概不退换!望理解ID:835675752236542......
  • GASA-BP基于遗传模拟退火优化BP神经网络的回归预测 案例包括GA与SA优化B
    GASA-BP基于遗传模拟退火优化BP神经网络的回归预测案例包括GA与SA优化BP代码,并给出对比计算结果matlab代码,备注详细,方便初学者学习ID:2530705617259360......
  • SA-BP模拟退火算法优化BP神经网络做时间序列预测,做多输入单输出系统的预测Matlab程序,
    SA-BP模拟退火算法优化BP神经网络做时间序列预测,做多输入单输出系统的预测Matlab程序,预测精度很高。ID:1985662031870152......
  • 模拟退火算法做路径规划,解决TSP问题。
    模拟退火算法做路径规划,解决TSP问题。ID:4360618365509805......