首页 > 其他分享 >[OI] 模拟退火

[OI] 模拟退火

时间:2024-07-30 08:55:50浏览次数:9  
标签:ansx ansy OI int double 决策 模拟退火

模拟退火是一种适合求样本点较大的多峰函数极值的方法.

模拟退火有几个参数:初始温度(\(T_{0}\)),终止温度(\(T_{e}\))和降温参数 \(d\),具体地,模拟退火是让每次的当前温度 \(T\) 变为 \(d\times T\),直到终止,因此 \(T_{e}\) 应为一个很接近 \(0\) 的正数,\(d\) 应该为一个很接近 \(1\) 的小于 \(1\) 的正数.

模拟退火在每次会根据温度选择一个新的决策点,温度越高,选择的决策点距离当前最优决策点越远. 具体地,为了实现这一步,我们可以直接把温度乘进随机数里:

double ex=ansx+(rand()*2-RAND_MAX)*t;
double ey=ansy+(rand()*2-RAND_MAX)*t;

其中 \(ansx,ansy\) 为当前最优决策.

在找出当前决策点以后,就计算它的贡献,然后进行下一个决策点的选择:

  1. 假如新的决策点更优,直接选择该决策点
  2. 否则,有 \(e^{\frac{-\Delta w}{T}}\) 的概率选择这个新的决策(二项式分布,这一步的目的是防止它卡在局部最优解里)

第二步可以这么实现:

else if(exp(-de/t)*RAND_MAX>rand()){
	ansx=ex,ansy=ey;
}

为了让模拟退火正确的概率更高,可以考虑如下几点:

  1. 换 srand() 纯看脸
  2. 多跑几遍模拟退火(推荐用 clock() 卡时间跑完,充分利用每一毫秒)
  3. 多调调参

UPD:Linux 环境下 clock() 的单位是微秒

JSOI2004 平衡点

本题的权值函数为系统重力势能之和,能量越低越稳定,因此权值低的为更优解.

我选择调 srand,用 CTHOIissb 在 \(233\) 进制意义下的哈希值过了,难绷

#include<bits/stdc++.h>
using namespace std;
using namespace std;
int n;
struct node{
	int x,y,w;
}a[2001];
double ansx,ansy,answ;
inline double energy(double x,double y){
	double r=0,dx,dy;
	for(int i=1;i<=n;++i){
		dx=x-a[i].x;
		dy=y-a[i].y;
		r+=sqrt(dx*dx+dy*dy)*a[i].w;
	}
	return r;
}
void sa(){
	double t=3000,down=0.996;
	while(t>1e-15){
		double ex=ansx+(rand()*2-RAND_MAX)*t;
		double ey=ansy+(rand()*2-RAND_MAX)*t;
		double ew=energy(ex,ey);
		double de=ew-answ;
		if(de<0){
			ansx=ex;ansy=ey;answ=ew;
		}
		else if(exp(-de/t)*RAND_MAX>rand()){
			ansx=ex,ansy=ey;
		}
		t*=down;
	}
}
unsigned long long _hash(string x){
	unsigned long long ans=0;
	for(char i:x){
		ans=ans*233+i;
	}
	return ans;
}
int main(){
	int st=clock();
	srand(_hash("CTHOIissb"));
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i].x>>a[i].y>>a[i].w;
		ansx+=a[i].x;
		ansy+=a[i].y;
	}
	ansx/=n,ansy/=n;
	answ=energy(ansx,ansy);
	while(clock()-st<=1000*980) sa();
	printf("%.3lf %.3lf",ansx,ansy);
}

标签:ansx,ansy,OI,int,double,决策,模拟退火
From: https://www.cnblogs.com/HaneDaCafe/p/18331495

相关文章

  • 使用 kivy 从 python 脚本的 buildozer 构建 android apk 时出错
    我想从使用kivy包构建的Python脚本构建apk为此,我使用googlecollab.这里是main.py脚本:importyoutube_dlfromkivy.appimportAppfromkivy.uix.boxlayoutimportBoxLayoutfromkivy.uix.buttonimportButtonfromkivy.uix.tex......
  • android u开机流程详细分析(中) - zygote
    5、zygoteZygote进程是Android中所有Java进程的父进程。Zygote进程在Init进程启动过程中被以service服务的形式启动。从android5.0开始,android开始支持64位的编译,zygote本身也就有了32位和64位的区别,所以在这里用ro.zygote属性来控制启动不同版本的zygote进程。init.rc位于......
  • android 14开机流程详细分析(上) - Boot ROM,Boot loader,kernel,init
    androidu开机流程详细分析本文基于android-14.0.0_r2源码AOSP架构AOSP的软件堆栈包含以下层:图1.AOSP软件堆栈架构下面列出了图1中使用的术语的定义:Android应用完全使用AndroidAPI开发的应用。GooglePlay商店广泛用于查找和下载Android应用,不过也......
  • async void 和async Task 有什么区别? 何时使用void
    在C#中,asyncvoid和asyncTask用于定义异步方法,但它们之间有一些重要的区别。下面我将详细解释这两种方法签名的区别以及何时使用它们。asyncTask定义:asyncTask方法返回一个Task对象,表示一个异步操作的完成状态。这种方法签名通常用于异步方法,它可以返回一个Task......
  • P9058 [Ynoi2004] rpmtdq 与 P9678 [ICPC2022 Jinan R] Tree Distance
    思路:注意到点对数量有\(N^2\)个,考虑丢掉一些无用的点对。对于点对\((x_1,y_1),(x_2,y_2)\),满足\(x_1\lex_2<y_2\ley_1\),即区间\([x_2,y_2]\)被\([x_1,y_1]\)包含,此时满足若询问到了\([x_1,y_1]\),则一定会询问到\([x_2,y_2]\)。若满足\(\operatorname{dis}(x_1......
  • android studio 调用第三方无源代码so
    androidstudio调用第三方无源代码so在AndroidStudio中调用第三方无源码的SO(共享库),你需要遵循以下步骤:将SO文件放置在项目中合适的位置。配置app的build.gradle文件,确保Gradle在构建应用时知道SO文件的位置。在Java/Kotlin代码中使用JNI接口加载SO库。......
  • Android 8.0 源码分析 (四) Activity 启动
    链接:https://juejin.cn/post/6844903983442558989前言我们熟知一般Android工程师都是在应用层上���发,不会涉及系统源码,但是如果你想往底层发展,或者深入插件化、Framework系统层等开发工作,如果不了解Android源码可是不行的,那么接下来我基于自己的理解跟学习来记录跟Android......
  • Android 8.0 源码分析 (二) Launcher 启动
    链接https://juejin.cn/post/6844903981504790541前言我们熟知一般Android工程师都是在应用层上开发,不会涉及系统源码,但是如果你想往底层发展,或者深入插件化、Framework系统层等开发工作,如果不了解Android源码可是不行的,那么接下来我基于自己的理解跟学习来记录跟Androi......
  • joisc 2023 护照
    joisc2023护照这题题意好难理解。题目链接P9331[JOISC2023Day1]Passport题意描述有\(n\)个点,每个点连边连向编号在\([L_i,R_i]\)间的点,有\(Q\)组询问,每次从\(x\)号点出发,求出到\(1\)号点和到\(n\)号点的两条路径经过点的并集的最小值。\(n,Q\leq2\cdot......
  • 记录一次IPhone和Android手机usb网卡驱动的移植过程
    记录一次IPhone和Android手机USB网卡的移植过程移植环境IPhoneUSB网卡的快速移植1.**添加驱动支持**2.USB连接IPhone手机,留意手机的`信任弹窗`并点击确定和输入密码3.检查USB网卡是否生成4.如果生成的网卡没有自动分配IP,安装udhcpc5.验证测试AndroidUSB网卡的快......