模拟退火学习
模擬退火學(xué)習(xí)
作業(yè)部落
網(wǎng)上講的不錯的(他好像還有一些其他的東西、、、)
引入
對于一些題目,無法直接算出答案或者想不到正解,想到隨機找答案,那么模擬退火就是一種有系統(tǒng)方法的隨機算法
沒用的不需要了解的來源
百度百科......
模擬退火算法來源于固體退火原理,是一種基于概率的算法,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內(nèi)部粒子隨溫升變?yōu)闊o序狀,內(nèi)能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態(tài),最后在常溫時達到基態(tài),內(nèi)能減為最小。
幾個要記下來的東西
用途
主要思想
- 把當(dāng)前答案看成一只退火兔,一開始很急躁(溫度很高),所以答案到處亂跑(這中間會記錄最優(yōu)解),最后兔子慢慢冷靜下來(溫度逐漸降低),就找到答案
- 利用rand來尋找答案接受劣解的波動范圍(當(dāng)然T也是一個決定性參數(shù))
- 退火找答案之后,可能會有更優(yōu)答案在自己周圍很近的地方,所以rand去周圍看一看是否更優(yōu)
- 一開始根據(jù)自己的猜測來找一個答案“開始”點,可以降低一定時間復(fù)雜度......
板子
我只講大致的思想,具體實現(xiàn)根據(jù)模板題及l(fā)uogu的題解講述來學(xué)習(xí)吧
主要是懶
first
luogu板子題平衡點/吊打xxx
然后,我的優(yōu)美代碼......
second
有難度,luogu均分數(shù)據(jù)
#include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> #include<algorithm> #include<ctime> #include<queue> #include<stack> #include<vector> #define rg register #define il inline #define lst long long #define ldb long double #define N 25 #define M 10 #define Time() (ldb)clock()/(ldb)CLOCKS_PER_SEC using namespace std; const int Inf=1e5;int n,m; ldb tot,ans=Inf; ldb v[N],sum[N]; ldb dp[N][N];il int read() {rg int s=0,m=0;rg char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')m=1;ch=getchar();}while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return m?-s:s; }il ldb PF(rg ldb x){return x*x;} il ldb sol() {for(rg int i=1;i<=n;++i)sum[i]=sum[i-1]+v[i];for(rg int i=0;i<=n;++i)for(rg int j=0;j<=m;++j)dp[i][j]=Inf;dp[0][0]=0;for(rg int i=1;i<=n;++i)for(rg int j=1;j<=m;++j)for(rg int k=0;k<i;++k)dp[i][j]=min(dp[i][j],dp[k][j-1]+PF(sum[i]-sum[k]-tot));ans=min(ans,dp[n][m]);return dp[n][m]; }il void SA(rg ldb T) {rg ldb nans=ans;for(;T>1e-3;T*=0.98){rg int xx=1+rand()%n,yy=1+rand()%n;if(xx==yy)continue;swap(v[xx],v[yy]);rg ldb res=sol();if(res<nans||exp((res-nans)/T)*rand()-RAND_MAX<0)nans=res;else swap(v[xx],v[yy]);} }int main() {n=read(),m=read();for(rg int i=1;i<=n;++i)v[i]=read(),tot+=v[i];tot/=m,sol();while(Time()<0.3)SA(1000);printf("%.2Lf\n",sqrt(ans/m));return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/cjoierljl/p/9394519.html
總結(jié)
- 上一篇: 极限竞速地平线5怎么进入名人堂
- 下一篇: 成都欢乐谷激流勇进开放时间