最小球覆蓋:用半徑最小的球去覆蓋所有點。
純粹的退火演算法,是搞不定的,精度不夠,不然就會tle,根本跑不出答案來。
任取一點為球心,然後一點點靠近最遠點。其實這才是最主要的。
因為:4個點確定乙個球,也就是說,這個球,會慢慢穩定,每次用乙個點到最遠的點的距離去靠近,怎麼靠近,玄學距離 。
再在這個基礎上乘以 t ,模擬退火溫度。這樣靠近速度增加。並且不用判斷是否較以前是否更優才轉移,因為他是必須轉移過去。至少你不可能是最長邊的端點的,而且他會隨著溫度逐漸穩定。
#include #include#include
using
namespace
std;
const
int maxn = 35;
struct
node nodes[maxn];
intn;
double
dist(node a,node b)
double
calc(node z)
int dx[6] = ;
int dy[6] = ;
int dz[6] = ;
int
main()
} node z;
z.x = s.x + (nodes[k].x-s.x)/d*t;
z.y = s.y + (nodes[k].y-s.y)/d*t;
z.z = s.z + (nodes[k].z-s.z)/d*t;
ans =min(ans,d);
s =z;
t = t*0.98
; }
printf(
"%.5f\n
",ans);
}
return0;
}
HDU3007 求解最小圓覆蓋 模擬退火?
這次先上 再證明 的可行性,感覺有點不像模擬退火,因為這個 借用的實際上是乙個完全單調的函式 只有乙個極值點,就是說只有乙個低谷,那個點實際上就是答案,就是全域性最優 就不自己寫 了,獻上網上找到的一段 這段 的思路其實就是先找乙個點作為起始點p,然後不斷找到和該點距離最遠的點a,然後將p向a慢慢挪...
poj1379 模擬退火
poj 1379 題意 給定n個點,你需要在給定矩形範圍內找到乙個點,使得它到這n個點的距離的最小值最大。一開始是用的顧研的方法,但總是ac不了,聽盾哥說他那個有問題。正確的演算法流程應該是 初始化 初始溫度de 充分大 初始p個並行解狀態s 演算法迭代的起點 失敗次數上限l,接受引數x,衰變係數k...
poj 1379 模擬退火
題意 給定n個點和範圍,在範圍內找到乙個點,使得n個點到這個點的最小距離最大 模擬退火法 模擬退火的過程 1 找到這些點所在的範圍,用兩個點框定 中e1,e2兩個點 2 在這個範圍內生成num個點 num自定 3 對於每個生成的點i,在其周圍生成num個點,一旦有點優於i,則替換。4 縮小範圍d,若...