1. 程式人生 > >何為啟發式演算法——退火演算法,蟻群演算法,遺傳演算法

何為啟發式演算法——退火演算法,蟻群演算法,遺傳演算法

一、退火演算法

模擬退火演算法來源於固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。

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

第一步是由一個產生函式從當前解產生一個位於解空間的新解;為便於後續的計算和接受,減少演算法耗時,通常選擇由當前新解經過簡單地變換即可產生新解的方法,如對構成新解的全部或部分元素進行置換、互換等,注意到產生新解的變換方法決定了當前新解的鄰域結構,因而對冷卻進度表的選取有一定的影響。

第二步是計算與新解所對應的目標函式差。因為目標函式差僅由變換部分產生,所以目標函式差的計算最好按增量計算。事實表明,對大多數應用而言,這是計算目標函式差的最快方法。

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

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

二、遺傳演算法

遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜尋最優解的方法。遺傳演算法是從代表問題可能潛在的解集的一個種群(population)開始的,而一個種群則由經過基因(gene)編碼的一定數目的個體(individual)組成。每個個體實際上是染色體(chromosome)帶有特徵的實體。染色體作為遺傳物質的主要載體,即多個基因的集合,其內部表現(即基因型)是某種基因組合,它決定了個體的形狀的外部表現,如黑頭髮的特徵是由染色體中控制這一特徵的某種基因組合決定的。因此,在一開始需要實現從表現型到基因型的對映即編碼工作。由於仿照基因編碼的工作很複雜,我們往往進行簡化,如二進位制編碼,初代種群產生之後,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇(selection)個體,並藉助於自然遺傳學的遺傳運算元(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。這個過程將導致種群像自然進化一樣的後生代種群比前代更加適應於環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解。

遺傳演算法是基於生物學的,理解或程式設計都不太難。下面是遺傳演算法的一般演算法:

  1. 建初始狀態 初始種群是從解中隨機選擇出來的,將這些解比喻為染色體或基因,該種群被稱為第一代,這和符號人工智慧系統的情況不一樣,在那裡問題的初始狀態已經給定了。
  2. 評估適應度 對每一個解(染色體)指定一個適應度的值,根據問題求解的實際接近程度來指定(以便逼近求解問題的答案)。不要把這些“解”與問題的“答案”混為一談,可以把它理解成為要得到答案,系統可能需要利用的那些特性。
  3. 繁殖 繁殖(包括子代突變) 帶有較高適應度值的那些染色體更可能產生後代(後代產生後也將發生突變)。後代是父母的產物,他們由來自父母的基因結合而成,這個過程被稱為“雜交”。
  4. 下一代 如果新的一代包含一個解,能產生一個充分接近或等於期望答案的輸出,那麼問題就已經解決了。如果情況並非如此,新的一代將重複他們父母所進行的繁衍過程,一代一代演化下去,直到達到期望的解為止。
  5. 平行計算 非常容易將遺傳演算法用到平行計算和群集環境中。一種方法是直接把每個節點當成一個並行的種群看待。然後有機體根據不同的繁殖方法從一個節點遷移到另一個節點。另一種方法是“農場主/勞工”體系結構,指定一個節點為“農場主”節點,負責選擇有機體和分派適應度的值,另外的節點作為“勞工”節點,負責重新組合、變異和適應度函式的評估。

三、蟻群演算法

各個螞蟻在沒有事先告訴他們食物在什麼地方的前提下開始尋找食物。當一隻找到食物以後,它會向環境釋放一種揮發性分泌物pheromone (稱為資訊素,該物質隨著時間的推移會逐漸揮發消失,資訊素濃度的大小表徵路徑的遠近)來實現的,吸引其他的螞蟻過來,這樣越來越多的螞蟻會找到食物。有些螞蟻並沒有像其它螞蟻一樣總重複同樣的路,他們會另闢蹊徑,如果另開闢的道路比原來的其他道路更短,那麼,漸漸地,更多的螞蟻被吸引到這條較短的路上來。最後,經過一段時間執行,可能會出現一條最短的路徑被大多數螞蟻重複著。

下面是本演算法的一些說明:

  1. 範圍 螞蟻觀察到的範圍是一個方格世界,螞蟻有一個引數為速度半徑(一般是3),那麼它能觀察到的範圍就是3*3個方格世界,並且能移動的距離也在這個範圍之內。
  2. 環境 螞蟻所在的環境是一個虛擬的世界,其中有障礙物,有別的螞蟻,還有資訊素,資訊素有兩種,一種是找到食物的螞蟻灑下的食物資訊素,一種是找到窩的螞蟻灑下的窩的資訊素。每個螞蟻都僅僅能感知它範圍內的環境資訊。環境以一定的速率讓資訊素消失。
  3. 覓食規則 在每隻螞蟻能感知的範圍內尋找是否有食物,如果有就直接過去。否則看是否有資訊素,並且比較在能感知的範圍內哪一點的資訊素最多,這樣,它就朝資訊素多的地方走,並且每隻螞蟻都會以小概率犯錯誤,從而並不是往資訊素最多的點移動。螞蟻找窩的規則和上面一樣,只不過它對窩的資訊素做出反應,而對食物資訊素沒反應。
  4. 移動規則 每隻螞蟻都朝向資訊素最多的方向移,並且,當週圍沒有資訊素指引的時候,螞蟻會按照自己原來運動的方向慣性的運動下去,並且,在運動的方向有一個隨機的小的擾動。為了防止螞蟻原地轉圈,它會記住剛才走過了哪些點,如果發現要走的下一點已經在之前走過了,它就會盡量避開。
  5. 避障規則 如果螞蟻要移動的方向有障礙物擋住,它會隨機的選擇另一個方向,並且有資訊素指引的話,它會按照覓食的規則行為。
  6. 資訊素規則 每隻螞蟻在剛找到食物或者窩的時候撒發的資訊素最多,並隨著它走遠的距離,播撒的資訊素越來越少。

根據這幾條規則,螞蟻之間並沒有直接的關係,但是每隻螞蟻都和環境發生互動,而通過資訊素這個紐帶,實際上把各個螞蟻之間關聯起來了。比如,當一隻螞蟻找到了食物,它並沒有直接告訴其它螞蟻這兒有食物,而是向環境播撒資訊素,當其它的螞蟻經過它附近的時候,就會感覺到資訊素的存在,進而根據資訊素的指引找到了食物。

以上是演算法學習過程中所引用的一些理論上的知識,有關應用請參看具體應用部分。