1. 程式人生 > >模擬退火演算法 POJ 2420

模擬退火演算法 POJ 2420

【前言】先說一說什麼是模擬退火,感覺很多地方都講得挺神祕的,其實非常簡單。

【模擬退火演算法】轉自點選開啟連結

1. 模擬退火演算法認識

   爬山演算法也是一個用來求解最優化問題的演算法,每次都向著當前上升最快的方向往上爬,但是初始化不同可能

   會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統

   中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下

   初始高溫 => 溫度緩慢下降=> 終止在低溫 (這時能量函式達到最小,目標函式最小)

   在熱力學中的退火過程大致是變溫物體緩慢降溫而達到分子之間能量最低的狀態。設熱力學系統S中有有限個且

   離散的n個狀態,狀態的能量為,在溫度下,經過一段時間達到熱平衡,這時處於狀態的概率為

                   

   模擬退火演算法也是貪心演算法,但是在其過程中引入了隨機因素,以一定的概率接受一個比當前解要差的解,並且

   這個概率隨著時間的推移而逐漸降低。

2. 模擬退火演算法描述

   若,即移動後得到更優的解,那麼總是接受改移動。

   若,即移動後得到更差的解,則以一定的概率接受該移動,並且這個概率隨時間推移

   逐漸降低。這個概率表示為

   

   由於是退火過程,所以dE < 0,這個公式說明了溫度越高出現一次能量差為dE的降溫概率就越大,溫度越低,

   出現降溫的概率就越小,由於dE總是小於0,所以P(dE)取值在0到1之間。偽碼如下

【例題 POJ 2420】點選開啟連結

【題意】給n個點,找出一個點,使這個點到其他所有點的距離之和最小,也就是求費馬點。

【PS】講道理,並不是非常信任這種做法QAQ。

【AC程式碼】

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N     1005
#define INF   0x3fffffff
#define eps   1e-8 //搜尋條件閥值
#define delta 0.98 //溫度下降速度
#define T     100  //初始溫度
using namespace std;
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
struct point{
    double x,y;
    point(){}
    point(double x,double y):x(x),y(y){}
}P[N];
double dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double getSum(point p[],int n,point t)
{
    double sum=0;
    while(n--) sum+=dis(p[n],t);
    return sum;
}
//模擬退火
double solve(point p[],int n)
{
    point z;
    point  s   = p[0]; //隨機初始化一個點開始搜尋
    double t   = T;    //初始化溫度
    double ans = INF;  //初始答案
    while(t>eps)
    {
        bool fuck = 1;
        while(fuck)
        {
            fuck = 0;
            for(int i=0; i<4; i++)
            {
                z.x = s.x+dir[i][0]*t;
                z.y = s.y+dir[i][1]*t;
                double tmp = getSum(p,n,z);
                if(ans>tmp)
                {
                    ans = tmp;
                    s   = z;
                    fuck= 1;
                }
            }
        }
        t*=delta;
    }
    return ans;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%lf%lf",&P[i].x,&P[i].y);
        }
        printf("%.0f\n",solve(P,n));
    }
    return 0;
}


相關推薦

模擬退火演算法 POJ 2420

【前言】先說一說什麼是模擬退火,感覺很多地方都講得挺神祕的,其實非常簡單。 【模擬退火演算法】轉自點選開啟連結 1. 模擬退火演算法認識    爬山演算法也是一個用來求解最優化問題的演算法,每次都

模擬退火入門——POJ 2420

題目連結: POJ 2420 題目大意: 給出平面上N(<=100)個點,你需要找到一個這樣的點,使得這個點到N個點的距離之和儘可能小。輸出這個最小的距離和(四捨五入到最近的整數) 解題思路: 如果下午不是馬原課無聊,學習了一下模擬退火的思想,大概看到這題也沒太多想法,不過

poj:2420 A Star not a Tree?(模擬退火演算法)

這個題和poj2069  都是用%lf過不了  改成%f就能過 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network u

MATLAB模擬退火演算法模板

為了參加國賽,這幾天學了模擬退火演算法,整理下當做模板方便國賽的時候用。 模擬退火用於處理最優化問題,可以求出當目標函式取得最小值時的決策變數的值。 在編寫程式時需要根據具體問題設計演算法,演算法描述為: (1)解空間(初始解) (2)目標函式 (3)新解的產生 &nbs

模擬退火演算法案例

2018年的華為軟體精英挑戰賽題目簡介:給出華為雲虛擬機器過去的租借數量歷史資料,用以訓練模型並預測下一個時間段裡的虛擬機器租借數量,然後把這些預測得到的虛擬機器裝填進一定規格的物理機中,即分為預測和裝填兩個部分。   總結一下裝填部分使用的模擬退火演算法: 演算法原理 裝

HDU 3007 模擬退火演算法

Buried memory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4067  

深度學習 --- 模擬退火演算法詳解(Simulated Annealing, SA)

上一節我們深入探討了,Hopfield神經網路的性質,介紹了吸引子和其他的一些性質,而且引出了偽吸引子,因為偽吸引子的存在導致Hopfield神經網路正確率下降,因此本節致力於解決偽吸引子的存在。在講解方法之前我們需要再次理解一些什麼是偽吸引子,他到底是如何產生的? 簡單來說說就是網路動態轉

模擬退火演算法理論+Python解決函式極值+C++實現解決TSP問題

簡述 演算法設計課這周的作業: 趕緊寫了先,不然搞不完了。 文章目錄 簡述 演算法理論部分 變數簡單分析 從狀態轉移概率到狀態概率 推導 理解當溫度收斂到接近0的時候,收斂到結果 理論

模擬退火演算法詳解

轉載自http://cighao.com/2015/12/03/introduction-of-SA/ 1. 簡介 模擬退火演算法 (Simulated Annealing,SA) 最早的思想是由 N. Metropolis 等人於1953年提出。1983年, S. Kirkpatr

模擬退火演算法

模擬退火演算法是一種求函式最小值點的隨機演算法,最近工作中要用到優化演算法,因此研究了一下這個比較簡單的演算法。模擬退火最基本的思想來源於金屬退火過程,在退火過程中,熱運動的原子逐漸凍結在勢能最低的位置,從而保證了整塊金屬晶格結構的一致性,達到最佳效能。模擬退火演算法的基本步驟如下: 1. 確定搜尋起始點x

【電腦科學】【2016.10】多目標優化的模擬退火演算法研究

本文為英國埃克塞特大學(作者:Kevin Ian Smith)的電腦科學博士論文,共137頁。 許多應用領域的計算優化問題都歸結為多目標優化問題,從而達到最小化或最大化的目的。如果(通常情況下)這些目標都是相互競爭的目標,則優化的目的是找出一組合適的解決方

模擬退火演算法2

     著名的模擬退火演算法,它是一種基於蒙特卡洛思想設計的近似求解最優化問題的方法。 一點歷史——如果你不感興趣,可以跳過 美國物理學家 N.Metropolis 和同仁在1953年發表研究複雜系統、計算其中能量分佈的文章,他們使用蒙特卡羅模擬法計算多分子系統

模擬退火演算法與C語言實現(TSP問題)

1簡介: 模擬退火來自冶金學的專有名詞退火。退火是將材料加熱後再經特定速率冷卻,目的是增大晶粒的體積,並且減少晶格中的缺陷。材料中的原子原來會停留在使內能有區域性最小值的位置,加熱使能量變大,原子會離開原來位置,而隨機在其他位置中移動。退火冷卻時速度較慢,使得原子有較多可能

人工智慧實驗——隨機重啟爬山法,模擬退火演算法,遺傳演算法求解N皇后問題

一、爬山法 爬山法就是完全的貪心演算法,每一步都選最優位置,可能只能得到區域性最優解。本實驗對普通爬山法進行了簡單的優化,採用了傳統爬山法的變種——隨機重啟爬山法,當爬山步數超過一定值時,會重新打亂棋盤,重新“爬山”。 適應度函式:衝突皇后的總對數 “爬山”:每一步就是

[work] 演算法學習筆記 (爬山法,模擬退火演算法,遺傳演算法

在優化問題中,有兩個關鍵點 代價函式 確定問題的形式和規模之後,根據不同的問題,選擇要優化的目標。如本文涉及的兩個問題中,一個優化目標是使得航班選擇最優,共計12個航班,要使得總的票價最少且每個人的等待時間之和最小。第二個問題是學生選擇宿舍的問題,每個學生可以實現填報

A Star not a Tree?(費馬點問題+模擬退火演算法

A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9377 Accepted: 4043 Description Luke wan

hdu2899:Strange fuction(模擬退火演算法)

Problem Description Now, here is a fuction:   F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <

模擬退火演算法解決TSP(python實現 110+行程式碼)【gif生成】

簡述 程式碼我是基於我之前寫的兩篇,一篇是遺傳演算法TSP的Python實現,一篇是模擬退火演算法的解決TSP的C++實現。 模擬退火演算法理論+Python解決函式極值+C++實現解決TSP問題 遺傳演算法解決TSP問題 Python實現【160行以內程式碼】

TSP_旅行商問題-模擬退火演算法

TSP_旅行商問題-模擬退火演算法 TSP_旅行商問題-貪心演算法 TSP_旅行商問題-模擬退火演算法 TSP_旅行商問題-遺傳演算法 TSP_旅行商問題-基本蟻群演算法 問題描述 對於n組城市座標,尋找最短路徑使其

2018-4-8模擬退火演算法

閱讀資料來源:《智慧優化演算法以及matlab實現》第七章【圖文】智慧優化演算法_數學建模_王成章_模擬退火法_2011_百度文庫https://wenku.baidu.com/view/335c56e94afe04a1b071de13.htmlMetropolis 取樣與蒙