大白話解析模擬退火:html
深刻理解模擬退火:node
模擬退貨wikiios
模擬退火:求費馬點,求線段,求球,求函數值,求tsp旅行商問題。ide
這樣就天衣無縫了。。。。。。。哈哈哈哈哈哈哈哈哈😄😄😄😄函數
poj,1379spa
記錄一個錯了8次的題目,在學校的oj上就是re.net
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 }
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 }
HDU,3932code
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 }
poj,2069htm
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 }