简介
模拟退火是一种求解概率法,用来在一个大的搜寻空间内找寻命题的最优解
简单来说,模拟退火是一种随机化算法。而且相当玄学
名副其实,模拟退火的出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。
原理
模拟退火的原理也和金属退火的原理近似:将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子。
分子都知道吧,在空气中运动的一种粒子,所以,我们平时感到的热量就是它告诉运动产生的。所以,先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。
如果不清楚,可以先搞懂金属退火:简单说,就是金属加热到一定温度,保持一段时间,然后慢慢冷却的过程
过程
退火有三个参数
初始温度:T_0
降温系数:C
终止温度:T_k
大致过程如下
可以发现,温度越低,ans逐渐稳定,并集中在最优解
参数
初始温度:温度T的初始值设置问题。 温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一、初始温度高,则搜索到全局最优解的可能性大,但因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。实际应用过程中,初始温度一般需要依据实验结果进行若干次调整。
退火速度:模拟退火算法的全局搜索性能也与退火速度密切相关。一般来说,同一温度下的“充分”搜索(退火)是相当必要的,但这需要计算时间。实际应用中,要针对具体问题的性质和特征设置合理的退火平衡条件。
温度管理:温度管理问题也是模拟退火算法难以处理的问题之一。实际应用中,由于必须考虑计算复杂度的切实可行性等问题,常采用如下所示的降温方式:式中k为正的略小于1.00的常数,t为降温的次数。
注意
我们先定义一个随机数srand();
由于它很玄学,所以多跑几次就可以了
例题
洛谷P1337
代码如下:
#include <bits/stdc++.h>
#define down 0.996//降温
using namespace std;
int n;
struct node{
int x;
int y;
int w;
}object[