最近学了一波模拟退火。个人感觉,就是随机算法,然后我们的目标点,一开始温度T高的时候会移动的剧烈,T小的时候移动的缓和(所以这就是为什么每一次移动的距离都是乘T)。然后真正的模拟退火是如果当前的tem比ans优,那就毫不犹豫地接受,否则则以一定概率接受。也就是那个exp(dE/T)> rand 那个。

然后还有爬山算法,就是只会一直找更优解,不接受差解,具体就是在模拟退火基础上,一直找最优解,找不到就降温(所以会陷入局部最优解的坑)。在网上嫖了一份代码(https://blog.csdn.net/just_sort/article/details/51648958)

1 while(t>eps)

2 {

3 bool fuck = 1;

4 while(fuck)

5 {

6 fuck = 0;

7 for(int i=0; i<4; i++)

8 {

9 z.x = s.x+dir[i][0]*t;

10 z.y = s.y+dir[i][1]*t;

11 double tmp = getSum(p,n,z);

12 if(ans>tmp)

13 {

14 ans = tmp;

15 s = z;

16 fuck= 1;

17 }

18 }

19 }

20 t*=delta;

21 }

View Code

求费马点:poj2420

题目链接:https://vjudge.net/problem/POJ-2420

一开始就以坐标平均点作为起始点,然后移动的时候虽然可以无脑的向四周移动,但是我们可以这样看,求出每一个点和当前点的dx,dy,然后肯定是当前点朝dx和dy方向移动。这样会更好

(这个是带上一定概率接受更差解的)

1 #include

2 #include

3 #include

4 #include

5 #include

6 using namespace std;

7 #define eps 1e-6

8 int n;

9 const int N = 109;

10 struct Point{

11 double x,y;

12 }p[N],now;

13 double dis(Point a,Point b){

14 return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y - b.y));

15 }

16 double getsum(Point u){

17 double res = 0;

18 for(int i = 1;i<=n;++i){

19 res += dis(p[i],u);

20 }

21 return res;

22 }

23 int main(){

24 scanf("%d",&n);

25 for(int i = 1;i<=n;++i){

26 scanf("%lf %lf",&p[i].x,&p[i].y);

27 now.x += p[i].x;

28 now.y += p[i].y;

29 }

30 now.x /= n; now.y /= n;

31 double ans = getsum(now);

32 double T = 100;

33 srand(23333);

34 while(T > eps){

35 double dx = 0,dy = 0;

36 for(int i = 1;i<=n;++i){

37 dx += (p[i].x - now.x)/dis(now,p[i]);

38 dy += (p[i].y - now.y)/dis(now,p[i]);

39 }

40 Point next = (Point){now.x + dx*T, now.y + dy*T};

41 double tem = getsum(next);

42 if(tem < ans){

43 ans = tem;

44 now = next;

45 }

46 else if(exp( (ans - tem) / T) > (rand()%10000)/10000.0){

47 ans = tem;

48 now = next;

49 }

50 T *= 0.98;

51 }

52 printf("%.0f",ans);

53 return 0;

54 }

View Code

最小球覆盖:poj2069

题目链接:https://vjudge.net/problem/POJ-2069

和上一题差不多,先以平均点做起始点,然后每次移动肯定是往距离当前点的最远点移动。

(这个没有接受更差解了)

1 #include

2 #include

3 #include

4 #define eps 1e-6

5 using namespace std;

6 const int N = 40;

7 int n;

8 struct Point{

9 double x,y,z;

10 }p[N],now;

11 double dis(Point u,Point v){

12 return sqrt( (u.x-v.x)*(u.x-v.x) + (u.y-v.y)*(u.y-v.y) + (u.z - v.z)*(u.z - v.z));

13 }

14 int main(){

15 while(~scanf("%d",&n) && n){

16 for(int i = 1 ; i <= n ;++i){

17 scanf("%lf %lf %lf",&p[i].x,&p[i].y,&p[i].z);

18 now.x+=p[i].x; now.y+=p[i].y; now.z += p[i].z;

19 }

20 now.x/=n; now.y/=n; now.z/=n;

21 double T = 100;

22 double ans = 1e99;

23 while(T > eps){

24 int k = 1;

25 for(int i = 1;i <= n ;++i){

26 if(dis(now,p[i]) > dis(now,p[k]) ){

27 k = i;

28 }

29 }

30 double tem = dis(p[k],now);

31 ans = min(ans,tem);

32 now.x += ( (p[k].x - now.x)/tem )*T;

33 now.y += ( (p[k].y - now.y)/tem )*T;

34 now.z += ( (p[k].z - now.z)/tem )*T;

35 T *= 0.98;

36 }

37 printf("%.6f\n",ans);

38 }

39 return 0;

40 }

View Code

至于最小园覆盖,模拟退火的话和最小求覆盖一样啦。不过最小圆覆盖有线性的点增量法(下一篇讲到),所以就不妨在这里了。

标签:now,tem,Point,int,double,费马点,模拟退火,include,模板

来源: https://www.cnblogs.com/xiaobuxie/p/11619652.html

matlab模拟退火最小球覆盖,【模板】模拟退火 费马点以及最小球覆盖相关推荐

  1. 基于遗传算法和模拟退火算法改进的混合模拟退火算法(解决求函数极值问题,MATLAB代码已实现)

    基本思想: 混合模拟退火算法时遗传算法和模拟退火算法的结合,在混合模拟退火算法中使用了大量的样本作为问题的可能解决方案而不是将单个样本作为一个问题的可能解决方案.对遗传算法中适应的概念进行相应改进. ...

  2. java模拟退火算法求函数_模拟退火算法从原理到实战【基础篇】

    模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小 ...

  3. luogu P2613 【模板】有理数取余(费马小定理,乘法逆元)

    整理的算法模板合集: ACM模板 目录 题目传送门 题目传送门 相当于是一个高精的费马小定理求乘法逆元.虽然数据达到了101000110^{10001}1010001,但是我们可以使用快读然后一直模m ...

  4. NYOJ-14 会场安排问题(经典贪心,区间完全不覆盖模板)

    附另一:此类问题选题总结:https://blog.csdn.net/qq_41289920/article/details/81001357 题干: 会场安排问题 时间限制:3000 ms | 内存 ...

  5. Matlab粒子群算法搜索费马点-求到多个点距离之和最小的点

    0. 前言 本文是在我之前一篇博客的基础上进行了扩展和延申,原文使用了matlab自带的优化函数,而本文采用了一个比较经典的随机优化算法--粒子群算法,对给定的目标函数进行求解. Matlab实现搜索 ...

  6. matlab回测,Matlab交易策略回测模板

    1. Matlab交易策略回测模板 for i=1::length(data) if MarketPosition==0 LongMargin(i)=0; %多头保证金 ShortMargin(i)= ...

  7. 【Matlab优化覆盖】虚拟力算法求解无线网络传感覆盖优化问题【含源码 1187期】

    一.代码运行视频(哔哩哔哩) [Matlab优化覆盖]虚拟力算法求解无线网络传感覆盖优化问题[含源码 1187期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  8. 基于matlab 求多边费马点,POJ2420(求多边形费马点) | 学步园

    题意:题目的意思就是给你N个点,在平面上寻找一个点,使得这个点到其他点的距离之和最小,问你最小的距离是多 少? 分析:在三角形内部这个点叫做费马点(费马点定义).那么这道题目就是求一个多变形的费马点. ...

  9. Lucas+阶乘打表+费马小定理模板2.0

    目的:输入m, n, p,求出C(m,n)%p的精确值 基础: 1.费马小定理:已知整数a和质数p,其中Gcd(a, p)==1,那么a^(p-1)%p==1恒成立 2.要求出(a/b)%p的值(p一 ...

最新文章

  1. Kubernetes集群部署(yum部署)
  2. 只用嘴唇动一动,AI就能合成语音,效果自然流畅看不出破绽
  3. Navicat通过跳板机连接数据库
  4. java 学习笔记2022.1.26
  5. arcgis python脚本筛选与线共边的面_ArcGis Python脚本——遍历输出面或折线要素的折点坐标...
  6. opera android 7,Opera迷你浏览器 Opera Mini 7
  7. 左神桶排序和基数排序
  8. 【点阵液晶编程连载五】液晶驱动代码的移植
  9. 【python】导入HTMLTestRunner失败---报错ModuleNotFoundError: No module named ‘HTMLTestRunner‘
  10. php 处理像素点数组,求助:php处理这个数组
  11. ABP官方文档翻译 3.7 领域事件(事件总线)
  12. 稳扎稳打 Silverlight 4.0 教程
  13. c语言开发入门教程,C语言开发入门教程
  14. 【Unity数据持久化】Ixmllserializable接口的使用
  15. https://imgsa.baidu.com/forum/pic/item/...【贴吧图床】
  16. Ubuntu安装MySQL(RPM包安装)
  17. shell编程,脚本语言
  18. OkHttp工具类在微服高并发场景中问题实践总结
  19. linux中查看系统进程的四种方法
  20. vue后台系统管理项目-openlayers地图定位、港口数据标记功能

热门文章

  1. 二十一 JDK注解注解案例
  2. 锁——死锁——单个锁锁死
  3. vue项目的骨架及常用组件介绍
  4. 修改hostname有几种方式?(转)
  5. nefu 519 昨日重现
  6. WPF的ComboBox 数据模板自定义
  7. Blackfin DSP学习心得与参考资料
  8. 转载:vb导出excel的方法
  9. javascript导入EXCEL数据
  10. 谈一谈Java 中 1000==1000 为false,而100==100 为true?