好吧。這道題最大的收穫是發現模擬退火演算法好簡單啊。還是很容易寫出來的。這道題我看大牛們用的是牛頓近似解或者模擬退火演算法。
可以移步這裡:
提交到poj後wa,於是自己的程式改得越來越像上面鏈結中的程式了。於是不貼**了。收穫是最終發現錯誤還是出在邏輯上面,自己有個變數沒注意,導致雖然能過樣例點,但是過不了測試點。所以下次在出現這種情況還是要檢查程式,不要太關注那些很詭異的地方。比如輸出時printf("%lf\n", f)中有沒有l等。
這道題用乙個candidates[nr]的陣列不斷逼近最優解。
生成過程如下:
首先,求出所有的點的座標的最大範圍,記為t,在這個範圍內生成nr個隨機點。我看到有直接用輸入點作為起始點的,在這個測試資料下也可以通過。
然後,對這nr個隨機點,每次再隨機產生nr(或別的數目)個隨機點,如果生成的隨機點的更逼近最優點(即距離和最小),則用新的隨機點代替之前的。每次生成隨機點的範圍為該點t*belta以內(belta在0~1之間)。也就是說範圍t每次縮小為原來的0.8(或別的數值)。
迴圈結束的條件是t小於最小的粒度,比如0.1或是隨機點有特別接近最優點的。
大致思路如此,寫起來其實也很簡單,不要有畏難情緒就好。wikipedia上有模擬退火演算法的挺清楚的描述:
最後感慨一句。早這樣寫poj程式估計我早成大牛或是資深碼農了。唉。
poj 2420 模擬退火
題意 給n個點,求與這n個點,距離和最接近的那個點是什麼,輸出這個最短距離。解析 模擬退火。在acdream那裡學模擬退火,準備做去年西安網賽的題目。來自 pragma comment linker,stack 1677721600 include include include include i...
POJ 2420(模擬退火)
2015 04 17 23 53 52 思路 模擬退火啟蒙題.縮小係數定為了 0.7。由於這題具有單調性,所以其實不用模擬退火去隨機化多個起點,用 爬山演算法 即可,只用乙個起點,讓它 爬 到最優解。1 include 2 include 3 include 4 include 5 include ...
模擬退火入門 POJ 2420
題目大意 給出平面上n 100 個點,你需要找到乙個這樣的點,使得這個點到n個點的距離之和盡可能小。輸出這個最小的距離和 四捨五入到最近的整數 解題思路 如果下午不是馬原課無聊,學習了一下模擬退火的思想,大概看到這題也沒太多想法,不過是真的神奇啊,先放上我覺得講得很簡單的模擬退火演算法的乙個講解 大...