题解

今天下午刚学了模拟退火

借这个题来总结下模拟退火的要注意的问题吧

1 : \(eps\)不要设的太大

2 : 初温\(T\)在2000左右就差不多可以了

3 : 注意题目要求是要求最大值还是最小值,当x<0时\(exp(x)\)的取值范围才是\(0~1\)

4 : 可以在退完火以后再单独从当前最优答案下进行微调

5 : 可以进行多次退火

然后这题就是每次退火就是随机交换序列中的两个数,对序列DP一下就好了

题解

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
const int M = 25 ;
const int N = 8 ;
const double INF = 1e50 ;
const double EPS = 1e-3 ;
using namespace std ; int n , m ;
int val[M] , e[M] ;
double f[N][M] , p[M] , Sum[M] ;
double bax , Ans = INF ;
inline double Rand() {
return (double)((rand() % 101) / 100.0) ;
}
inline double F() {
for(int i = 0 ; i <= m ; i ++)
for(int j = 0 ; j <= n ; j ++) f[i][j] = INF ;
f[0][0] = 0 ;
for(int i = 1 ; i <= n ; i ++) Sum[i] = Sum[i - 1] + p[i] ;
for(int i = 1 ; i <= m ; i ++)
for(int j = i ; j <= n ; j ++)
for(int k = i - 1 ; k < j ; k ++)
f[i][j] = min(f[i][j] , f[i - 1][k] + (Sum[j] - Sum[k] - bax) * (Sum[j] - Sum[k] - bax)) ;
if(f[m][n] < Ans) {
Ans = f[m][n] ;
for(int i = 1 ; i <= n ; i ++) e[i] = p[i] ;
}
return f[m][n] ;
} inline void Solve() {
for(int i = 1 ; i <= n ; i ++) p[i] = e[i] ;
double T = 2000 , W = 0.98 ;
double NowAns , PreAns , dlt ;
while(T > EPS) {
PreAns = F() ;
int a = rand() % n + 1 , b = rand() % n + 1 ;
while(a == b) b = rand() % n + 1 ;
swap(p[a], p[b]) ;
NowAns = F() ; dlt = NowAns - PreAns ;
if(exp(-dlt / T) > Rand()) ;
else swap(p[a] , p[b]) ;
T *= W ;
}
for(int i = 1 ; i <= 10000 ; i ++) {
int a = rand() % n + 1 , b = rand() % n + 1 ;
while(a == b) b = rand() % n + 1 ;
swap(p[a] , p[b]) ;
F() ;
swap(p[a] , p[b]) ;
}
}
int main() {
srand(time(0)) ;
cin >> n >> m ;
for(int i = 1 ; i <= n ; i ++) {
cin >> val[i] ;
bax += val[i] ;
p[i] = val[i] ;
}
bax /= m ; F() ;
int Times = 20 ; while(Times--) Solve() ;
printf("%.2lf\n",sqrt(Ans / m)) ;
return 0 ;
}

最新文章

  1. 显示隐藏文件 .DS_Store文件
  2. python小算法(二)
  3. 查看Linux版本系统信息方法汇总
  4. ArrayList源代码深入剖析
  5. pyqt动态创建一系列组件并绑定信号和槽(网友提供学习)
  6. LayoutInflater使用
  7. 【linux-shell】rsync
  8. Use Prerender to improve AngularJS SEO
  9. [第一阶段] Python学习
  10. freemarker报错之九
  11. B20J_1297_[SCOI2009]迷路_矩阵乘法
  12. redis info
  13. springdata 动态查询 是用来查询的 仅提供查询功能
  14. Windows下return,exit和ExitProcess的区别和分析
  15. python之路——15
  16. Session &amp; Cookie 简介
  17. 04-Bootstrap的插件
  18. Spark VS Presto VS Impala
  19. 电商网站jQuery放大镜代码
  20. js的事件学习笔记

热门文章

  1. POJ3107 树的重心
  2. codevs1128 导弹拦截
  3. JQuery判断radio是否选中并获取选中值的示例代码
  4. 远程调试 Android 设备使用入门(谷歌翻译版)
  5. hdu5618(cdq分治求三维偏序)
  6. Linux下启用IP转发功能(主要针对Ubuntu的使用)
  7. MySQL集群之五大常见的MySQL高可用方案(转)
  8. Nginx+Tomcat+Memcached负载均衡和session共享
  9. Vue.js父子通信之所有方法和数据共享
  10. [转载]【BlackHat 2017】美国黑客大会首日议题汇总,演讲PPT下载也在这里