首页 > 其他分享 >【复建笔记】模拟退火

【复建笔记】模拟退火

时间:2023-11-11 11:15:53浏览次数:32  
标签:... rand int double 笔记 模拟退火 del ans 复建

简述一下我的理解:

为什么要有那一行一定概率下接受答案?

因为如果没有就会在当前峰下爬山,有的话才能跳到别的峰上,这一行与温度有关,当温度越低,跳的概率越低。

退火随机一个二维点:

nowx = limx + ((rand() << 1) - RAND_MAX) * T;
nowy = limy + ((rand() << 1) - RAND_MAX) * T;

退火接受概率的公式:

\(e^{\frac{-del}{T}}?\frac{rand()}{RAND_{MAX}}\)

得看是最大还是最小值了。

退火的模板:

const double lim = ... // 温度最小值,通常为 1e-10 左右
const double d = ... // 变化系数,通常为 0.996 左右
void SA() {
    double T = ... // 初始温度,通常为 2021 左右
    while(T > lim) {
        ... // 获取一个随机的位置
        now = calc(); // 计算当前位置的答案 
        del = now - ans; // 计算 变化量
        if(del < 0) { // 以最小值为例
            ans = now; // 更新答案
            ...  // 更新答案和中间量的状态
        } else if(exp(-del/T) > (double)rand()/RAND_MAX) {
            ...  // 一定概率选择当前当前状态
        } 
        T *= d; // 降温
    }
}

复建例题:

P2210

很简单,直接一遍秒了。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

namespace IO {
	#define pb push_back
	#define lson rt << 1
	#define rson rt << 1 | 1
	const int N = 1e3 + 10;
	const int Maxn = 2e5 + 10;
	int read() {
		int res = 0, f = 0; char ch = getchar();
		for(; !isdigit(ch); ch = getchar()) f |= (ch == '-');
		for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch - '0');
		return f ? -res : res;
	}
}

using namespace IO;

int n, a[20][5], rk[20];
const double Lim = 1e-10;
const double down = 0.996;
 
int calc() {
	int res = 0;
	bool vis[20][20];
	for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) vis[i][j] = vis[j][i] = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 0; j <= 2; j++) {
			if(vis[i][a[i][j]] || vis[a[i][j]][i]) continue;
			int x = rk[i], y = rk[a[i][j]];
			if(x > y) swap(x, y);
			res += y - x, vis[i][a[i][j]] = 1, vis[a[i][j]][i] = 1;
		}
	}
	return res;
}

int ans = INT_MAX;

void SA() {
	double T = 2023;
	while(T > Lim) {
		int nowx = rand() % n + 1, nowy = rand() % n + 1;
		swap(rk[nowx], rk[nowy]);
		int nowans = calc();
		int del = nowans - ans;
		if(del < 0) {
			ans = nowans;
		}
		else if(exp(-del/T) > rand() / RAND_MAX) {
			
		}
		else {
			swap(rk[nowx], rk[nowy]);
		}
		T *= down;
	}	
}

signed main() {
	srand(2006);
	n = read();
	for(int i = 1; i <= n; i++) a[i][0] = read(), a[i][1] = read(), a[i][2] = read();
	for(int i = 1; i <= n; i++) rk[i] = i;
 	while((double)clock()/CLOCKS_PER_SEC<=0.8) SA();
 	cout<<ans;
 	return 0;
}

标签:...,rand,int,double,笔记,模拟退火,del,ans,复建
From: https://www.cnblogs.com/tttttttle/p/17825656.html

相关文章

  • 深度学习笔记
    机器学习流程数据获取特征工程(神经网络可以作为一种特征提取的方法,而非算法)建立模型(用工具包建模很快)评估与应用特征工程是所有机器学习算法中最核心的部分图像分类任务图像300*100*3(像素点数目+通道数(3个通道:如RGB))......
  • yzy第九周学习笔记
    《Unix/Linux系统编程》第六章学习笔记第六章信号和信号处理本章讲述了信号和信号处理;介绍了信号和中断的统一处理,有助于从正确的角度看待信号;将信号视为进程中断,将进程从正常执行转移到信号处理;解释了信号的来源,包括来自硬件、异常和其他进程的信号;然后举例说明了信号在Un......
  • 学习笔记9
    教材知识点总结信号和中断信号是一种异步事件通知机制,类似于软件中断,用于通知进程发生了某种事件。与硬件中断不同,信号是由内核向进程发送的,而不是由硬件设备触发的。Unix/Linux中的信号处理信号类型:Unix/Linux系统支持多种类型的信号,例如SIGINT(终端中断)、SIGSEGV(段错......
  • 读程序员的制胜技笔记09_死磕优化(下)
    1. 造成延迟的3个方面1.1. CPU1.2. I/O1.3. 人2. 不要打包数据2.1. 一个打包的数据结构2.1.1. C#structUserPreferences{publicbyteItemsPerPage;publicbyteNumberOfItemsOnTheHomepage;publicbyteNumberOfAdClicksICanStomach;publicbyteM......
  • 《软件工程:一种实践方法》读书笔记一
    它把作为一本书按惯例该讲的历史部分形式一下就一段话带过,但是其中一个来自《人月传说》的形象的比喻深深吸引了我的眼球:“……正像一只逃亡的野兽落到泥潭中做垂死的挣扎,越是挣扎,陷得越深,最后无法逃脱灭顶的灾难。……程序设计工作正像这样一个泥潭,……一批批程序员被迫在泥潭中......
  • Altium Designer自学笔记
    本次使用AD20为基础进行练习。1.1新建工程包括:原理图、PCB、原理图库、PCB库。 1.2新建元器件 点击右下角的“Panels"面板,调出新建元器件界面1.3视图---->栅格------->切换捕捉栅格右边DesignerltemID可修改器件名称,绘制状态下Tap键可暂停修改。 11.4复制元器件按......
  • FOC学习笔记-基于灯哥FOC
    1、foc控制技术现在无刷电机越来越多的进入人们的视野,因为他的控制精度更高,相对直流电机而言可以更稳定的工作等特点,被越来越多的应用于机器人行业,而无刷电机的控制离不开FOC控制。FOC(field-orientedcontrol)为磁场导向控制,又称为矢量控制(vectorcontrol),是一种利用变频器(VFD)控制......
  • 学习笔记九
    学习笔记九一、任务详情自学教材第6章,提交学习笔记(10分),评分标准如下知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核......
  • 【PySide6】QChart笔记(二)—— QBarSeries的使用
    一、QBarSeries简介1.官方描述https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QBarSeries.html【译注:官方文档内容过于简洁,表明完全仅继承了QAbstractBarSeries,且没有扩展任何属性、方法和信号。因此,直接参考QAbstractBarSeries的文档:】https://doc.qt.io/qtforpython-6/......
  • 【学习笔记】随机化算法
    例题P7831[COCI2009-2010#3]PATULJCI题解首先对每个颜色开一个vector<int>保存其位置,随后对于一段区间\([l,r]\)和一个颜色\(c\),可以很快速的求出\([l,r]\)内\(c\)出现的次数。然后进行随机化,每次随机一个元素并查看他的出现次数。若随机\(t\)次,那么随机不到的概率是\(\frac......