日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Poj2420 A Star not a Tree? 模拟退火算法

發布時間:2025/5/22 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Poj2420 A Star not a Tree? 模拟退火算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://poj.org/problem?id=2420

?

題目大意:每組數據中給n個點(n<=100),求平面中一個點使得這個點到n個點的距離之和最小。

?

分析:一開始看到這個題想必是不好做的...因為平面太大了,不能使用枚舉的方法,于是想到隨機點出來比較。可是總不能無限的枚舉,而且隨機點出的答案需要是最優值還是一個玄學問題。所以想到了模擬退火的方法。

具體操作:首先隨意找一個點作為出發點,然后設置一個初始溫度,使得這個點可以在這個溫度下亂跑[但是只讓它往上下左右跑]溫度越高,這個點就越活躍,在所找到的區域中選一個到其他點距離和最小的點,然后跳過去。完成這一步后,溫度降低,再在新的點附近搜。聯想到剛開始學模擬退火時看到的一張圖:

再配上一句經典的話:

爬山算法:兔子朝著比現在高的地方跳去。它找到了不遠處的最高山峰。但是這座山不一定是珠穆朗瑪峰。這就是爬山算法,它不能保證局部最優值就是全局最優值。

模擬退火:兔子喝醉了。它隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,它漸漸清醒了并朝最高方向跳去。這就是模擬退火。

?

可以把我們的題目想像到這個圖中去:

  山峰類似距離和的函數,求最小值相當于找最高峰,一開始允許隨便找,就可以跨過第一座看上去是最高的峰頂而去往其他的位置。當時當溫度降下來[或是酒慢慢醒了]就只能在比較近的位置找了,直到某個位置跳上了最高峰,得到最后的答案。

?

但是畢竟這個起始溫度和降低溫度的速度還是有些玄學的。所以不妨開得大一點保險好了...

?

AC代碼

1 #include<cstdio> 2 #include<cmath> 3 4 using namespace std; 5 6 const int maxn=110; 7 const int T=100000; 8 const int INF=0x7fffffff; 9 const double eps=1e-8; 10 const double delta=0.98; 11 12 struct Node{double x,y;}node[maxn]; 13 14 int n; 15 int dx[4]={0,0,1,-1}; 16 int dy[4]={1,-1,0,0}; 17 18 inline double dis(Node A,Node B){ 19 return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); 20 } 21 22 double sum_dis(Node A){ 23 double sum=0; 24 for(int i=1;i<=n;i++) 25 sum+=dis(A,node[i]); 26 return sum; 27 } 28 29 void search(){ 30 Node Ans=node[1],Now; 31 double t=T,res=INF; 32 bool find; 33 while(t>eps){ 34 find=true; 35 while(find){ 36 find=false; 37 for(int j=0;j<4;j++){ 38 Now.x=Ans.x+dx[j]*t; 39 Now.y=Ans.y+dy[j]*t; 40 double Dis=sum_dis(Now); 41 if(Dis<res) 42 res=Dis,Ans=Now,find=true; 43 } 44 } 45 t=t*delta; 46 } 47 if(res-(int)(res)>0.5) 48 printf("%d\n", (int)(res+1)); 49 else 50 printf("%d\n", (int)(res)); 51 } 52 53 int main(){ 54 #ifndef ONLINE_JUDGE 55 freopen("Poj2420.in","r",stdin); 56 freopen("Poj2420.out","w",stdout); 57 #endif 58 59 while(~scanf("%d",&n)){ 60 for(int i=1;i<=n;i++) 61 scanf("%lf%lf",&node[i].x,&node[i].y); 62 search(); 63 } 64 65 return 0; 66 } View Code

?

轉載于:https://www.cnblogs.com/Robert-Yuan/p/5033878.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Poj2420 A Star not a Tree? 模拟退火算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。