HDU3007 求解最小圓覆蓋 模擬退火?

2021-10-06 20:28:50 字數 1406 閱讀 9077

這次先上**,再證明**的可行性,感覺有點不像模擬退火,因為這個**借用的實際上是乙個完全單調的函式(只有乙個極值點,就是說只有乙個低谷,那個點實際上就是答案,就是全域性最優)

就不自己寫**了,獻上網上找到的一段**:

這段**的思路其實就是先找乙個點作為起始點p,然後不斷找到和該點距離最遠的點a,然後將p向a慢慢挪動很小的一段距離(該點到所有點中的最大距離在該過程中變小),直到發現更遠的點a',然後再往a'慢慢挪動,如此反覆,直到無法挪動時(該點到所有點中的最大距離不再變小時),該點就是最優圓的圓心了。

有乙個問題:起始點p的選取,選取不同位置的點,最後的結果都能是最優嗎?

至少有一點我們可以證明,就是我們進行上述步驟時,每步更新的點p其實都是相對於當前點p更優(區域性更優)。那麼模擬機器學習演算法中那個三維波浪谷(瞎說的名詞,如下圖)一樣,我們這個區域性最優能不能代表全域性最優呢?

我們舉個例子來看看。假如我們找到的區域性最優點為點p1,全域性最優點為點p0。如下圖所示。

那麼其實點p1向點p0挪動很小的一段距離時,一定能夠更優,證明略,自己畫畫就出來了(所有的點都在圓p1和圓p0所在的圓的交集中)。

其次,按照那個思路是否會提供p1到p0方向的乙個分量呢(就是說p1是否會向p0挪動,即使不是直線方向)?現在肯定能夠得到乙個結論----所有的點都在圓p1和圓p0所在的圓的交集中。可以推出被圓p0覆蓋的圓p1的弧線上一定存在至少乙個點,該點的存在會提供p1向p0方向挪動的乙個分量,就是說該點在程式中會促使p1向p0挪動(這裡沒有證明,感興趣的自證吧,應該不是蠻困難),那麼點p1是區域性最優的假設就否定了。即最後的p1就是全域性最優。p1就是p0。

綜上所述,這個思路是乙個完全單調的函式,所以起始點是哪個點都可以。

//code是直接copy的人家的

#includeusing namespace std;

const int n = 55;

#pragma warning(disable:4996);

const double eps = 1e-8;

const double inf = 1e19;

struct point

p[n];

int n;

double x, y, r;

double dis(point a, point b)

void sa()

} a.x += (p[k].x - a.x) / d * t;

a.y += (p[k].y - a.y) / d * t;

r = min(r, d);

t *= delt;

} x = a.x, y = a.y;

}int main()

}

HDU 3007 最小圓覆蓋

題意 給出平面上的一些點,要求用乙個最小的圓,把所有的點包圍起來。最小覆蓋圓,增量法 假設圓o是前i 1個點得最小覆蓋圓,加入第i個點,如果在圓內或邊上則什麼也不做。否,新得到的最小覆蓋圓肯定經過第i個點。然後以第i個點為基礎 半徑為0 重複以上過程依次加入第j個點,若第j個點在圓外,則最小覆蓋圓必...

hdu3007 最小覆蓋圓問題

題目 buried memory 最小圓覆蓋,很經典的問題。題目大概是,平面上n個點,求乙個半徑最小的圓,能夠覆蓋所有的點。如果要求乙個最小覆蓋圓,這個圓至少要由三個點確定。有一種演算法就是任意取三個點作圓,然後判斷距離圓心最遠的點是否在圓 內,若在,則完成 若不在則用最遠點更新這個圓。這裡不仔細介...

HDU 3007 隨機增量法

題目大意 給定平面上 n 個點,求最小圓覆蓋 我就是抄了個板而已 q 為什麼是 o n 的 a 搖頭搖頭搖頭 q 三角形外心怎麼求 a 不知道 q 學這個有什麼用 a 一臉懵逼 q 怎麼什麼都不知道 a 窩弱嘛tat 怎麼覺得自己又抽了 三角形外心 我知道泥萌都會。因為到各點距離相等,有 x 1 x...