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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 2069最小球覆盖 HDU3007最小圆覆盖【模拟淬火算法】

發(fā)布時(shí)間:2024/10/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 2069最小球覆盖 HDU3007最小圆覆盖【模拟淬火算法】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

POJ 2069最小球覆蓋

1.給定N個(gè)三維點(diǎn),要求覆蓋這些點(diǎn)的最小球半徑; 2.采用模擬淬火算法,隨機(jī)選取一個(gè)點(diǎn)作為初始解,然后不斷向當(dāng)前最遠(yuǎn)的點(diǎn)靠近; 3.這是一個(gè)不斷調(diào)整的過程,對應(yīng)模擬淬火算法中不斷向內(nèi)能最低這一目標(biāo)函數(shù)(半徑最小)逼近,溫度對應(yīng)控制變量
  • 對于一個(gè)點(diǎn),球心就是這個(gè)點(diǎn),且半徑無窮小
  • 對于兩個(gè)點(diǎn),球心就是兩點(diǎn)線段的中點(diǎn),半徑就是線段長度的一半
  • 對于三個(gè)點(diǎn),三點(diǎn)構(gòu)成的平面必為球的大圓,球心是三角形的外心,半徑就是球心到某個(gè)點(diǎn)的距離
  • 對于四個(gè)點(diǎn),若四點(diǎn)共面,則轉(zhuǎn)換到3點(diǎn)共面;若四點(diǎn)不共面,四面體可以唯一確定一個(gè)外接球
  • 對于五個(gè)點(diǎn)及五個(gè)點(diǎn)以上,最小球必為某四個(gè)點(diǎn)的外接球
#include<iostream> #include<map> #include<string> #include<cstring> #include<vector> #include<algorithm> #include<set> #include<sstream> #include<cstdio> #include<cmath> #include<climits> #include<cstdlib> using namespace std; const double eps=1e-3; //POJ2069 最小球覆蓋 struct POINT{double x,y,z; }p[110];//N個(gè)點(diǎn) POINT op;//最小球的球心 int n; inline double dist(POINT &a,POINT &b){//兩點(diǎn)距離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)); } double solve(){double ret,delta=100.0;//溫度double maxDis,tempDis;int i,id;while(delta>eps){id=0;maxDis=dist(op,p[id]);for(i=1;i<n;i++){tempDis=dist(op,p[i]);if(tempDis>maxDis){maxDis=tempDis;id=i;}}ret=maxDis;op.x+=(p[id].x-op.x)/maxDis*delta;op.y+=(p[id].y-op.y)/maxDis*delta;op.z+=(p[id].z-op.z)/maxDis*delta;delta*=0.98;}return ret;//最小球半徑 } int main(){while(scanf("%d",&n)!=EOF&&n){for(int i=0;i<n;i++){scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);}printf("%lf\n", solve());}return 0; }

HDU3007最小圓覆蓋

給定N個(gè)二維點(diǎn),求覆蓋這些點(diǎn)的最小圓半徑

#include<iostream> #include<map> #include<string> #include<cstring> #include<vector> #include<algorithm> #include<set> #include<sstream> #include<cstdio> #include<cmath> #include<climits> #include<cstdlib> using namespace std; const double eps=1e-8; //HDU3001 最小圓覆蓋 struct POINT{double x,y,z; }p[510]; POINT op;//最小圓的圓心 int n; inline double dist(POINT &a,POINT &b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } void solve(){double ret,delta=100.0;double maxDis,tempDis;int i,id;while(delta>eps){id=0;maxDis=dist(op,p[id]);for(i=1;i<n;i++){tempDis=dist(op,p[i]);if(tempDis>maxDis){maxDis=tempDis;id=i;}}ret=maxDis;op.x+=(p[id].x-op.x)/maxDis*delta;op.y+=(p[id].y-op.y)/maxDis*delta;delta*=0.98;}printf("%.2lf %.2lf %.2lf\n",op.x,op.y,ret); } int main(){while(scanf("%d",&n)!=EOF){if(n==0) break;op.x=op.y=0;for(int i=0;i<n;i++){scanf("%lf%lf",&p[i].x,&p[i].y);op.x+=p[i].x;op.y+=p[i].y;}op.x/=n;op.y/=n;solve();}return 0; }

總結(jié)

以上是生活随笔為你收集整理的POJ 2069最小球覆盖 HDU3007最小圆覆盖【模拟淬火算法】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。