1. 程式人生 > >隨機搜尋(Random Searching)演算法概述

隨機搜尋(Random Searching)演算法概述

個人理解,隨機搜尋是一種在巨大資料規模下執行一個耗時上無法接受的程式的優化方法。 它可以用以對一個搜尋演算法施展優化的前提是:

1、資料規模大,精確的結果難以在一定時間計算出。 2、結果的些許的不精確能夠被接受。 3、求取的結果是最優化(optimization)問題,有一個成本計算模型。

以上自己總結,歡迎補充。

下面還是一步步深入隨機搜尋演算法敘述,也有人把有導向的隨機搜尋演算法稱為啟發式搜尋。

一、最基本的隨機搜尋

顧名思義,就是隨機的搜尋,沒有特別的要說的,舉個例子:有十億個數字,我想搜尋十萬次就找出一個比較理想的最小(大)數。這就是一個簡單的應用隨機搜尋的一個場景。這時候我們需要設計一個隨機取樣的函式,然後在十億個數裡取出十萬個數進行比較獲取最小(大)的數。雖然後最的結果不精確,但是如果並不需要知道確切的最優值的時候,這還是非常棒的提高程式效率的演算法。

這只是一個簡單的樣例,當然還有許多其他場景會用到隨機搜尋。但是這種模型非常簡單,有時候並不能給出令我們滿意的結果,我們還需要對其一步步進行改進。但是核心的思想就是這樣的,以後的都是圍繞這一思想進行的,這先提前說一下。

二、爬山搜尋演算法

爬山搜尋演算法是一種簡單的貪心改進,通過基本的搜尋演算法我們發現,我們並沒有利用到已經獲得的最優解(假如十億個數字按一定多項式分佈),而是粗暴的進行了隨機抽樣求取最優解(簡單粗暴有時候確實非常好)。貪心策略的假如,使隨機搜尋演算法的效率和準確性有一個較好的提升。如下圖所示:爬山演算法 圖中有ABCDE五個點,我們想搜尋曲線中最高點,如果我們起始點隨機選取到了C點,根據貪心策略,我們會向比C更高的點搜尋過去,以此遞迴能夠找到最高點A。同樣的如果隨機選取的E點同樣的搜到最高點A。只有隨機開始點在D的位置,我們才能夠搜到真正的最高點B。由此我們可以發現爬山搜尋演算法的一個缺陷,就是比較容易陷入區域性最優解中。

一個簡單的消除(可能也消除不了)該缺陷的方法就是,我們多次執行該搜尋演算法,以期隨機選取的開始點落在B點兩側的下降曲線上。最後再比較多次執行爬山搜尋演算法的結果獲取更理想的解。有時候被稱為“多重爬山演算法”。

三、模擬退火演算法(Simulated Annealing、SA)

模擬退火來自冶金學的專有名詞退火。退火是將材料加熱後再經特定速率冷卻,目的是增大晶粒的體積,並且減少晶格中的缺陷。材料中的原子原來會停留在使內能有區域性最小值的位置,加熱使能量變大,原子會離開原來位置,而隨機在其他位置中移動。退火冷卻時速度較慢,使得原子有較多可能可以找到內能比原先更低的位置。 模擬退火的原理也和金屬退火的原理近似:我們將熱力學的理論套用到統計學上,將搜尋空間內每一點想像成空氣內的分子;分子的能量,就是它本身的動能;而搜尋空間內的每一點,也像空氣分子一樣帶有“能量”,以表示該點對命題的合適程度。演算法先以搜尋空間內一個任意點作起始:每一步先選擇一個“鄰居”,然後再計算從現有位置到達“鄰居”的概率。可以證明,模擬退火演算法所得解依概率收斂到全域性最優解。

以上模擬退火介紹引自wiki,簡單的說就是在爬山搜尋演算法的基礎上,新增一個概率函式,這個函式能給出一個概率值來決定是否選取該解當當前一步驟下的區域性最優解,即有一定概率能夠跳出區域性最優解。

模擬退火演算法新解的產生和接受可分為如下四個步驟:

1、由一個產生函式從當前解產生一個位於解空間的新解;為便於後續的計算和接受,減少演算法耗時,通常選擇由當前新解經過簡單地變換即可產生新解的方法,如對構成新解的全部或部分元素進行置換、互換等,注意到產生新解的變換方法決定了當前新解的鄰域結構,因而對冷卻進度表的選取有一定的影響。 計算與新解所對應的目標函式差。因為目標函式差僅由變換部分產生,所以目標函式差的計算最好按增量計算。事實表明,對大多數應用而言,這是計算目標函式差的最快方法。

2、判斷新解是否被接受,判斷的依據是一個接受準則,最常用的接受準則是Metropolis準則: 若Δt′<0則接受S′作為新的當前解S,否則以概率exp(-Δt′/T)接受S′作為新的當前解S。

3、當新解被確定接受時,用新解代替當前解,這隻需將當前解中對應於產生新解時的變換部分予以實現,同時修正目標函式值即可。此時,當前解實現了一次迭代。可在此基礎上開始下一輪試驗。而當新解被判定為捨棄時,則在原當前解的基礎上繼續下一輪試驗。

4、模擬退火演算法與初始值無關,演算法求得的解與初始解狀態S(是演算法迭代的起點)無關;模擬退火演算法具有漸近收斂性,已在理論上被證明是一種以概率1 收斂於全域性最優解的全域性優化演算法;模擬退火演算法具有並行性。

演算法步驟引自wiki,看wiki上說的已經很清晰了,所以就貼上過來不再改了。說一下這個接受新解概率的問題,也是演算法的關鍵部分。上述概率公式就是退火過程中原子選擇新位置的概率的原理轉換過來的,在退火的過程開始階段,會有較大的概率接受較差的解。隨著退火過程的不斷進行,演算法越來越不可能接受較差的解,直到最後只能接受最優解。比多重爬山演算法更可靠,被證明以概率1收斂全域性最優解,注意是收斂於全域性最優解,而不是一定是全域性最優解。(最後細說)

ps:額外說一下,這裡模擬退火演算法看起來有點聚類演算法中K-Means演算法的味道,只是比前者多一個概率函式。而我們又知道K-Means演算法是有一定概率陷入區域性最優解的。那是不是能夠在K-Means演算法中添入概率函式來改進該演算法呢?可以的,其實K-Means演算法更類似爬山演算法,每次只接受最優解,如果我們每次在選取K箇中心點的過程中,新增這一概率函式,使其有一定概率選取周圍一些非區域性最優點的話,就可以了,或者設計一個模型來選取新點。

模擬退火演算法,如果模型建的夠好,都是能夠改進其他窮舉搜尋演算法的。當然別忘了隨機搜尋演算法應用的前提。

四、遺傳演算法(Genetic Algorithm、GA)

這個演算法也是受自然科學的啟發,模擬生物種群的進化,實現的一種計算機模擬演算法。演算法中參考了種群(population)的形成、進化、物競天擇等概念,有顏色體串(基因串,即某一題解),發生交叉(crossover)、配對(breeding)、變異(mutation)等行為,繁殖產生新的一個更接近全域性最優解的新種群,這樣遞迴下去到某一步結束種群的發展。

演算法步驟:

1、選取初始種群 2、評價種群個體的適應度 3、按比例選擇產生下一個種群 4、改變種群 5、判斷停止條件,不滿足則返回第二步迴圈執行

初始種群的選取一般可以隨機的選取一些題解。種群個體適應度就是根據成本函式計算出的花費。按比例選擇下一代,一般會較高比例選取適應度高(花費低)的個體,也稱之為精英選拔,按較低比例選取其他適應度低的個體。這樣就產生了新的種群,新種群的組成還沒完,還要包括第四步的改變種群,也就是交叉、配對、變異等操作,對已經加入新種群的個體進行修改產生新的個體。一般簡單的操作就是進行一些題解的範圍的、隨機的修改、部分的值的互換、按規則合併等操作。這樣一個全新的種群就產生了。然後就是繼續評價種群適應度繼續選拔。迭代到得到滿意解或一定次數為止。

過程中比較關鍵的一些值還是需要經過多次計算來確定合適值的選取的,比如精英選拔比例,變異概率,成本函式,種群數量等,這些值如果選取還需根據自己需要進行實驗而定。

一般的終止條件有:

1、進化次數限制 2、計算耗費的資源限制 3、得到一個滿足的最優個體 4、適應度不發生變化 5、人為干預

當然也可以組合使用。

本篇先說這四個隨機搜尋的演算法,還有其他的隨機搜尋演算法,像:區域性搜尋、禁忌搜尋、蟻群演算法、人工免疫系統(AIS)演算法、人工免疫系統(AIS)、粒子群優化(PSO )、引力搜尋演算法( GSA )、蟻群聚類方法( ACCM中) 、隨機傳播搜尋( SDS )等等,非常多,自己也需要學習消化和實踐,改篇再述。如有問題請留言指正,非常感謝。

最後,很難優化的一個問題: 在上圖的最右邊,有一個狹長的成本最低區域,接近它的任何解都可能被排除在外,因為這些解的成本都很高,所以我們幾乎沒有概率得到這樣一個全域性最小值的途徑。這是隨機化演算法的共同缺陷,沒有很好的解決途徑。