首页 > 其他分享 >闲话 22.9.29

闲话 22.9.29

时间:2022-09-29 17:45:56浏览次数:53  
标签:10 arr 退火 int double sum 29 闲话 22.9

闲话

发现很多人都会很用心来写闲话。
gtm数了数muel的闲话 一共514字
是不是我写个114字就达到标准了呢?

gtm在闲话里不断记录他人的话语。
似乎闲话就是这种东西,记录你当时想写的东西

某人提醒我说有相册这种东西
似乎是的 我保存了很多人的很多相册
所以不用担心图荒了
但我更喜欢在blog里放歌词
所以和我无关

教室の廃材が宙に浮かぶ

やっぱどうしたって嫌なもんは

嫌なんだろうなきっと

ひとりぼっちを選べない私の

馬鹿げたモノローグ

……

模拟退火(SA)

今天lyin退火切了T4
我认为随机化是很好的东西
于是来学一学

模拟退火是什么?

随机化。
我们着眼的是工业上的退火程序。由于退火的规律引入了更多随机因素,那么我们得到最优解的概率会大大增加。于是我们可以将目标函数作为能量函数,模拟这个程序。

怎么退火?

首先要有一个当前温度 \(T_0\),然后再来一个终止温度 \(T_e\) ,接着再给一个降温系数 \(d\)。其中 \(T_0\) 是一个很大的数(一般取 \(10^9\) 或 \(10^{12}\) ),\(T_e\) 是一个较小的数(一般取 \(10^{-12}\) 或 \(10^{-16}\),当然你取 \(10^{-66}\) 也没人管你),降温系数是一个接近 \(1\) 小于 \(1\) 的数。

参数部分很玄学,请自行尝试更多的可能性。

假设我们当前有了一个状态,它的解是 \(S_0\)。然后我们随机更改这个状态,得到新的解 \(S_1\)。假如 \(S_1\) 优于 \(S_0\) 则接受这个新的答案,若 \(S_1\) 劣于 \(S_0\) 则以概率接受这个答案。后半部分很重要,是退火的关键。
假设劣解与优解的差值为 \(\Delta S>0\),当前温度为 \(T\),则我们接受这个解的概率是 \(\large e^{\frac {-\Delta S} T}\)。容易发现这个概率的取值为 \((0,1)\)。由于指数上 \(\frac 1T\) 的存在,当温度很高时劣解的劣势会被减小,我们就有更多的可能跳出当前次优解,并在温度减小的过程中逐渐稳定,最终以很大的概率到达最优位置。

我们称这样的随机更改为一次转移。每次转移后执行 \(T_0 = d\times T_0\),当 \(T_0 < T_e\) 时结束退火,反之继续转移。
通常维护所有转移后得到解中最优解作为答案。

保证能切吗?

不保证。

但是有很多技巧可以尝试。玄学

1. 玄学调参

一眼扫过去我们能发现很多数值,像是 \(T_0,d\) 啥的。随便改改数,拟合一下大样例是很好的选择。
注意不要自己落入次优解。

2. 分段模拟退火

把值域分开,每段单独跑一次退火。
如果这个函数的峰很多那可以优化求解,但是如果你在跑单峰那还是别麻烦自己了。

3. 多跑几次

跑一遍退火得到当前解,再把它作为初始解扔到退火函数里再跑一次。
一般跑个三五次就够了。但如果你觉得不过瘾——

4. 卡时

暴力做法必备。
使用 clock() 函数返回程序运行时间,如果再跑一次退火就超时就直接输出答案并结束程序。

这里假设你的退火函数叫 SA()

do { 
	SA() ;
} while(1.0 * clock() / CLOCKS_PEE_SEC < 0.95); // 0.95 可以换成时间限制减去0.1或0.05,具体由跑一次退火的时间决定。

实例

by LYinMX

const double d = 0.99, T0 = 1e9, Te = 1e-12;
double res; // 答案

mt19937 mt( (ull)(&N) );
int Rand ( int l, int r ) { return uniform_int_distribution<>(l,r)(mt); }
double Randdb ( double l, double r ) { return uniform_real_distribution<>(l,r)(mt); }

void SA () {
    { // 初始化状态
        for( int i = 1; i <= n; ++i ) arr[i] = Randdb(0,1), arr[0] += arr[i];
        for( int i = 1; i <= n; ++i ) arr[i] = arr[i] / arr[0] * x;
    }
	double t = T0, now = 0;
	for( int i = 1; i <= n; ++i ) for( auto it : son[i] ) now += arr[i] * arr[it] / 2; // 初始化答案
	while( t > Te )
	{
		{ // 计算当前解
            int x = Rand(1,n), y = Rand(1,n); 
            double e = arr[x] * Randdb( Lim( t * 1e-6 ), Lim(t) ), sum = now;
            for( auto it : son[x] ) sum -= e * arr[it]; arr[x] -= e; 
            for( auto it : son[y] ) sum += e * arr[it]; arr[y] += e;
        }
        
		double delta = sum - now; 
        res = max( res, sum );
		if( Randdb(0,1) <= exp(delta/t) ) now += delta; // 当 delta > 0 时必定接受解 反之按随机概率接受解
        else arr[x] += e, arr[y] -= e; // 不接受

		t *= d; // 冷却
	}
}

标签:10,arr,退火,int,double,sum,29,闲话,22.9
From: https://www.cnblogs.com/joke3579/p/chitchat220929.html

相关文章

  • 【设计模式】29.结构型模式-装饰模式(Decorator)
    一、描述装饰模式能够在不改变原来对象结构和功能的前提下,动态的给对象增加新的功能,相比于使用子类扩展的方式,装饰模式更加的灵活。角色(1)抽象构件类:为具体构件类和装饰......
  • MySQL--函数--2022年9月29日
    第一节  字符串函数1、常见的字符串函数2、语法:select函数名();第二节  数值函数1、常见的数值函数2、语法:select函数......
  • LeetCode 2296. Design a Text Editor
    原题链接在这里:https://leetcode.com/problems/design-a-text-editor/题目:Designatexteditorwithacursorthatcandothefollowing:Add texttowherethecu......
  • 13 刘欣晨 2022.9.22
    实验一 项目名称:     输出每日一贴                       importdatetimemot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别......
  • 《近期BSN开发常见问题答疑(2022.9.23)》
    区块链服务网络(Blockchain-basedServiceNetwork)(以下称为“BSN”)是一个跨云服务、跨门户、跨底层框架,用于部署和运行区块链应用的全球性公共基础设施网络,由国家信息中心、......
  • 2022.9.29-周四-九月第四周
     公式化生活的,真的过够了 作词:潘云安作曲:潘云安编曲:告五人形同虚设的时间在你眼里成为了无限青春充满了不眠是为了追寻更多的明天好似无尽的灯街从不分你我......
  • 废话刷工作量比赛-建模竞赛题第2赛季第29轮
    “废话刷工作量”也是一种本事。例如,序列图上每条消息都给它配上一条返回消息,整张图的篇幅就翻了一倍……请对以下类图做“废话刷工作量”处理,即,在下图基础上添加尽可能多的......
  • 20220929
    20220928传送门t1牛牛的方程式思路​ 由裴蜀定理:若\(a,b\)为整数,且\(gcd(a,b)=d\),那么一定存在整数\(x,y\)使得\(ax+by=d\)成立。这样,这道题就迎刃而解了。代码也非......
  • 肖sir __新闻__2022年9 月29日___信息
    1、健全生态补偿机制,推动美丽中国建设2、国办通报表扬国务院第九次大督查3、党的二十大召开4、乡村振兴取得阶段性重大成就5、人设部:增设:中类和小类职业6、俄罗斯和......
  • 【闲话】2022.09.28
    又颓了一会KaTeX,真开心今天没有考试,于是自己切了会CDQ,切了会莫反,又思考了一下如何做可持久化字典树。没有切基环树,太难了,对于我这种蒟蒻而言。发现自己还想切一个由......