simulated annealing/爬山/Metropolis/优化算法

大白话解析模拟退火

深入理解模拟退火:

模拟退货wiki

模拟退火:求费马点,求线段,求球,求函数值,求tsp旅行商问题。

 

这样就完美无缺了。。。。。。。哈哈哈哈哈哈哈哈哈😄😄😄😄

poj,1379

记录一个错了8次的题目,在学校的oj上就是re

 1 #include<iostream>
 2 #include<cmath>
 3 #include<ctime>
 4 #include<cstdio>
 5 using namespace std;
 6 
 7 const int MAXN=1000+100;
 8 const int KMEAN=30;
 9 const double INF=1<<30;
10 const double eps=1e-8;
11 const double PI=3.141592653;
12 int x,y,n;
13 struct Point
14 {
15   double x,y;
16 }myPoint[MAXN],myK[KMEAN];
17 double dis[KMEAN];
18 
19 double GetMinDis(double tx,double ty)
20 {
21   double minDis=INF,temp;
22   for(int i=0;i<n;i++)
23   {
24     temp=sqrt((tx-myPoint[i].x)*(tx-myPoint[i].x)+(ty-myPoint[i].y)*(ty-myPoint[i].y));
25     if(temp<minDis)
26           minDis=temp;
27   }
28   return minDis;
29 }
30 
31 int main()
32 {
33   int cas,i,j;
34   double temp;
35   scanf("%d",&cas);
36   while(cas--)
37   {
38     scanf("%d%d%d",&x,&y,&n);
39     srand((unsigned)time(NULL));
40     for(i=0;i<n;i++)
41       scanf("%lf%lf",&myPoint[i].x,&myPoint[i].y);
42 
43     for(i=0;i<KMEAN;i++)
44     {
45       dis[i]=INF;
46       myK[i].x=rand()%10001/10000.0*x;
47       myK[i].y=rand()%10001/10000.0*y;
48     }
49     for(i=0;i<KMEAN;i++)
50        dis[i]=GetMinDis(myK[i].x,myK[i].y);
51 
52     double theta,delta=1.0*(x>y?x:y)/sqrt(1.0*n);
53     while(delta>eps)
54     {
55       for(i=0;i<KMEAN;i++)
56       {
57         double nx=myK[i].x,ny=myK[i].y;
58         for(j=0;j<KMEAN;j++)
59         {
60           double tx,ty;
61           theta=double(rand()%10001)/10000.0*2*PI;  
62           tx=nx+delta*cos(theta);
63           ty=ny+delta*sin(theta);
64           if(tx<0||tx>x||ty<0||ty>y)
65             continue;
66 
67           temp=GetMinDis(tx,ty);
68           if(temp>dis[i])
69           {
70             myK[i].x=tx;
71             myK[i].y=ty;
72             dis[i]=temp;
73           }
74         }
75       }
76       delta=0.8*delta;
77     }
78 
79     int id=-1;
80     temp=-INF;
81     for(i=0;i<KMEAN;i++)
82     {
83       if(dis[i]>temp)
84       {
85         temp=dis[i];
86         id=i;
87       }
88     }
89     printf("The safest point is (%.1lf, %.1lf).\n",myK[id].x,myK[id].y);  
90   }
91   return 0;
92 }
View Code

 

 1 #include<iostream>
 2 #include<cmath>
 3 #include<ctime>
 4 #include<cstdio>
 5 using namespace std;
 6 #define MAX(a,b) (a)>(b)?(a):(b)
 7 
 8 const int MAXN=1000+100;
 9 const int KMEAN=30;
10 const double INF=1<<30;
11 const double eps=1e-8;
12 const double PI=3.141592653;
13 int x,y,n;
14 struct Point
15 {
16     double x,y;
17 }myPoint[MAXN],myK[KMEAN];
18 double dis[KMEAN];
19 
20 double GetMinDis(double tx,double ty)
21 {
22     double minDis=0,temp;
23     for(int i=0;i<n;i++)
24     {
25         temp=sqrt((tx-myPoint[i].x)*(tx-myPoint[i].x)+(ty-myPoint[i].y)*(ty-myPoint[i].y));
26         minDis+=temp;
27     }
28     return minDis;
29 }
30 
31 int main()
32 {
33     int i,j;
34     double temp;
35     x=y=0;
36         scanf("%d",&n);
37         srand((unsigned)time(NULL));
38         for(i=0;i<n;i++)
39         {
40             scanf("%lf%lf",&myPoint[i].x,&myPoint[i].y);
41             x=MAX(x,myPoint[i].x);
42             y=MAX(y,myPoint[i].y);
43         }
44     
45         for(i=0;i<KMEAN;i++)
46         {
47             dis[i]=INF;
48             myK[i].x=rand()%10001/10000.0*x;
49             myK[i].y=rand()%10001/10000.0*y;
50         }
51         for(i=0;i<KMEAN;i++)
52             dis[i]=GetMinDis(myK[i].x,myK[i].y);
53         
54         double theta,delta=1.0*(x>y?x:y)/sqrt(1.0*n);
55         while(delta>eps)
56         {
57             for(i=0;i<KMEAN;i++)
58             {
59                 double nx=myK[i].x,ny=myK[i].y;
60                 for(j=0;j<KMEAN;j++)
61                 {
62                     double tx,ty;
63                     theta=double(rand()%10001)/10000.0*2*PI;
64                     tx=nx+delta*cos(theta);
65                     ty=ny+delta*sin(theta);
66                     if(tx<0||tx>x||ty<0||ty>y)
67                         continue;
68                     
69                     temp=GetMinDis(tx,ty);
70                     if(temp<dis[i])
71                     {
72                         myK[i].x=tx;
73                         myK[i].y=ty;
74                         dis[i]=temp;
75                     }
76                 }
77             }
78             delta=0.8*delta;
79         }
80         temp=INF;
81         for(i=0;i<KMEAN;i++)
82         {
83             if(dis[i]<temp)
84             {
85                 temp=dis[i];
86             }
87         }
88         printf("%.0f\n",temp);
89     return 0;
90 }
View Code

 

HDU,3932

 1 #include <string.h>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <ctime>
 6 #include <stdlib.h>
 7 #include <cstdio>
 8 #include <cmath>
 9 #define maxn 1010
10 #define MIN(a,b) (a<b?a:b)
11 #define MAX(a,b) (a>b?a:b)
12 #define inf 1e12
13 #define eps 1e-8
14 const double PI=acos(-1.0);
15 using namespace std;
16 struct point{
17     double x,y;
18 }po[maxn],ans_po[100];
19 int X,Y,n;
20 double ans[100];
21 double dis(point &a,point &b){
22     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
23 }
24 double find_max(point &a){
25     double ans=0,t;
26     for(int i=0;i<n;i++){
27         t=dis(a,po[i]);
28         ans=MAX(ans,t);
29     }
30     return ans;
31 }
32 int main(){
33     int i,j;
34     double step,theta,now;
35     point temp;
36     srand(unsigned(time(NULL)));
37     while(~scanf("%d%d%d",&X,&Y,&n))
38     {
39         for(i=0;i<n;i++)
40             scanf("%lf%lf",&po[i].x,&po[i].y);
41         for(i=0;i<30;i++){
42             ans_po[i].x=(rand()%1001)/1000.0*X;
43             ans_po[i].y=(rand()%1001)/1000.0*Y;
44             ans[i]=find_max(ans_po[i]);
45         }
46         step=MAX(X,Y);
47         while(step>eps){
48             for(i=0;i<30;i++){
49                 theta=(rand()%1001)/500.00*PI;
50                 for(j=0;j<30;j++){
51                     temp.x=ans_po[j].x+cos(theta)*step;
52                     temp.y=ans_po[j].y+sin(theta)*step;
53                     if(temp.x>X || temp.x<0 || temp.y>Y || temp.y<0)
54                         continue;
55                     now=find_max(temp);
56                     if(now<ans[j])ans[j]=now,ans_po[j]=temp;
57                 }
58             }
59             step*=0.8;
60         }
61         j=0,now=ans[0];
62         for(i=1;i<30;i++)
63             if(ans[i]<now) now=ans[i],j=i;
64         printf("(%.1lf,%.1lf).\n%.1lf\n",ans_po[j].x,ans_po[j].y,now);
65     }
66     
67     return 0;
68 }
View Code

 poj,2069

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <iostream>
 6 
 7 #define INF 1e99
 8 #define eps 1e-7
 9 #define T 100
10 #define delta 0.98
11 #define N 55
12 
13 using namespace std;
14 
15 struct node
16 {
17     double x,y,z;
18 }p[N];
19 
20 double dis(node a,node b)
21 {
22     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
23 }
24 
25 double Search(node p[],int n)
26 {
27     double t=T;
28     double ans=INF;
29     node s=p[0];
30     while(t>eps)
31     {
32         int k=0;
33         for(int i=0;i<n;i++)
34             if(dis(s,p[i])>dis(s,p[k]))
35                 k=i;
36         
37         double d=dis(s,p[k]);
38         ans=min(d,ans);
39         
40         s.x+=(p[k].x-s.x)/d*t;
41         s.y+=(p[k].y-s.y)/d*t;
42         s.z+=(p[k].z-s.z)/d*t;
43         t*=delta;
44     }
45     return ans;
46 }
47 
48 int main()
49 {
50     int n;
51     while(scanf("%d",&n),n)
52     {
53         for(int i=0;i<n;i++)
54             scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
55         printf("%.5f\n",Search(p,n));
56     }
57     return 0;
58 }
View Code

 

posted @ 2016-05-16 21:21  指尖泛出的繁华  阅读(224)  评论(0编辑  收藏  举报