當前位置:首頁 » 操作系統 » 精英遺傳演算法

精英遺傳演算法

發布時間: 2023-08-19 13:48:27

⑴ Python實現基於遺傳演算法的排課優化

排課問題的本質是將課程、教師和學生在合適的時間段內分配到合適的教室中,涉及到的因素較多,是一個多目標的調度問題,在運籌學中被稱為時間表問題(Timetable Problem,TTP)。設一個星期有n個時段可排課,有m位教師需要參與排課,平均每位教師一個星期上k節課,在不考慮其他限制的情況下,能夠推出的可能組合就有 種,如此高的復雜度是目前計算機所無法承受的。因此眾多研究者提出了多種其他排課演算法,如模擬退火,列表尋優搜索和約束滿意等。

Github : https://github.com/xiaochus/GeneticClassSchele

遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。遺傳演算法的流程如下所示:

遺傳演算法首先針對待解決問題隨機生成一組解,我們稱之為種群(Population)。種群中的每個個體都是問題的解,在優化的過程中,演算法會計算整個種群的成本函數,從而得到一個與種群相關的適應度的序列。如下圖所示:

為了得到新的下一代種群,首先根據適應度對種群進行排序,從中挑選出最優的幾個個體加入下一代種群,這一個過程也被稱為精英選拔。新種群餘下的部分通過對選拔出來的精英個體進行修改得到。

對種群進行修改的方法參考了生物DAN進化的方法,一般使用兩種方法: 變異 和 交叉 。 變異 的做法是對種群做一個微小的、隨機的改變。如果解的編碼方式是二進制,那麼就隨機選取一個位置進行0和1的互相突變;如果解的編碼方式是十進制,那麼就隨機選取一個位置進行隨機加減。 交叉 的做法是隨機從最優種群中選取兩個個體,以某個位置為交叉點合成一個新的個體。

經過突變和交叉後我們得到新的種群(大小與上一代種群一致),對新種群重復重復上述過程,直到達到迭代次數(失敗)或者解的適應性達到我們的要求(成功),GA演算法就結束了。

演算法實現

首先定義一個課程類,這個類包含了課程、班級、教師、教室、星期、時間幾個屬性,其中前三個是我們自定義的,後面三個是需要演算法來優化的。

接下來定義cost函數,這個函數用來計算課表種群的沖突。當被測試課表沖突為0的時候,這個課表就是個符合規定的課表。沖突檢測遵循下面幾條規則:

使用遺傳演算法進行優化的過程如下,與上一節的流程圖過程相同。

init_population :隨機初始化不同的種群。
mutate :變異操作,隨機對 Schele 對象中的某個可改變屬性在允許范圍內進行隨機加減。
crossover :交叉操作,隨機對兩個對象交換不同位置的屬性。
evolution :啟動GA演算法進行優化。

實驗結果

下面定義了3個班,6種課程、教師和3個教室來對排課效果進行測試。

優化結果如下,迭代到第68次時,課程安排不存在任何沖突。

選擇1203班的課表進行可視化,如下所示,演算法合理的安排了對應的課程。

⑵ 遺傳演算法原理簡介

遺傳演算法(Genetic Algorithm, GA)是一種進化計算(Evolutionary Computing)演算法,屬於人工智慧技術的一部分。遺傳演算法最早是由John Holland和他的學生發明並改進的,源於對達芬奇物種進化理論的模仿。在物種進化過程中,為了適應環境,好的基因得到保留,不好的基因被淘汰,這樣經過很多代基因的變化,物種的基因就是當前自然環境下適應度最好的基因。該演算法被廣泛應用於優化和搜索中,用於尋求最優解(或最優解的近似),其最主要的步驟包括交叉(crossover)和突變(mutation)。

所有的生物體都由細胞組成,每個細胞中都包含了同樣的染色體(chromosome)。染色體由一串DNA組成,我們可以簡單地把一個生物個體表示為一條染色體。每條染色體上都包含著基因,而基因又是由多個DNA組成的。每個基因都控制著個體某個性狀的表達,例如眼睛的顏色、眼皮的單雙等。在物種繁衍的過程中,首先發生交叉,來自於父母的染色體經過分裂和重組,形成後代的染色體。之後,後代有一定概率發生基因突變,即染色體上某個位置處的基因以一定概率發生變化。之後,對每一代都重復進行交叉和突變兩個步驟。對於每一個後代,我們可以通過一定的方式測量其適應度。適應度越好的個體,在下一次交叉中被選中的概率越大,它的基因越容易傳給下一代。這樣,後代的適應度就會越來越好,直到收斂到一個穩定值。

在優化問題中,可行解總是有很多個,我們希望尋找一個最優解,它相對於其他可行解來說具有更好的適應度(即目標函數值更大或更小)。每個可行解就是一個「生物個體」,可以表示為狀態空間中的一個點和適應度。每個解都是一個經過編碼的序列,已二進制編碼為例,每個解都是一個二進制序列。這樣每個染色體就是一個二進制序列。遺傳演算法從從一組可行解開始,稱為population,從population中隨機選擇染色體進行交叉產生下一代。這一做法的基於下一代的適應度會好於上一代。遺傳演算法的過程如下:

終止條件可以是達到了最大迭代次數,或者是前後連續幾代的最優染色體的適應度差值小於一個閾值。以上演算法描述也許還不夠直觀,我們舉例說明。假設解可以用二進制編碼表示,則每個染色體都是一個二進制序列。假設序列長度為16,則每個染色體都是一個16位的二進制序列:

首先,我們隨機生成一個population,假設population size為20,則有20個長度為16的二進制序列。計算每個染色體的適應度,然後選取兩個染色體進行交叉,如下圖所示。下圖在第6為上將染色體斷開再重組,斷開的位置是可以隨機選擇的。當然,斷裂位置也可以不止一個。可以根據具體問題選擇具體的交叉方式來提升演算法性能。

之後,隨機選取後代染色體上某個基因發生基因突變,突變的位置是隨機選取的。並且,基因突變並不是在每個後代上都會發生,只是有一定的概率。對於二進制編碼,基因突變的方式是按位取反:

上述例子是關於二進制編碼的,像求解一元函數在某個區間內的最大最小值就可以使用二進制編碼。例如,求解函數f(x)=x+sin(3x)+cos(3x)在區間[0,6]內的最小值。假設我們需要最小值點x保留4位小數,那麼求解區間被離散成60000個數。因為2 {15}<60000<2 {16},所以,需要16位二進制數來表示這60000個可能的解。其中0x0000表示0,0x0001表示0.0001,以此類推。針對這個例子,文末給出了demo code.

然而,在排序問題中無法使用二進制編碼,應該採用排列編碼(permutation encoding)。例如有下面兩個染色體:

交叉:隨機選取一個交叉點,從該出將兩個染色體斷開。染色體A的前部分組成後代1的前部分,然後掃描染色體B,如果出現了後代1中不包含的基因,則將其順序加入後代1中。同理,染色體B的前部分組成了後代2的前部分,掃描染色體A獲得後代2的後部分。注意,交叉的方式多種多樣,此處只是舉出其中一種方式。

( 1 5 3 2 6 | 4 7 9 8) + ( 8 5 6 7 2 | 3 1 4 9) => ( 1 5 3 2 6 8 7 4 9) + ( 8 5 6 7 2 1 3 4 9)

突變:對於一個染色體,隨機選中兩個基因互換位置。例如第3個基因和倒數第2個基因互換:

(1 5 3 2 6 8 7 4 9) => (1 5 4 2 6 8 7 3 9)

此外還有值編碼(value encoding)和樹編碼(tree encoding)等,具體例子可以參考這個鏈接: http://obitko.com/tutorials/genetic-algorithms/encoding.php

在實際的遺傳演算法中,往往會保留上一代中的少數幾個精英(elite),即將上一代population中適應度最好的幾個染色體加入到後代的poulation中,同時去除後代population中適應度最差的幾個染色體。通過這個策略,如果在某次迭代中產生了最優解,則最優解能夠一直保留到迭代結束。

用GA求函數最小值的demo code: https://github.com/JiaxYau/GA_test

參考資料

[1] Introction to Genetic Algorithm, http://obitko.com/tutorials/genetic-algorithms/index.php

[2] Holland J H. Adaption in natural and artificial systems

⑶ 遺傳演算法中的排序選擇策略選擇最優的復制到下一代是不是已經包含了精英保留策略的作用

這得看你的排序選擇策略是怎樣的。
一種排序是只對當代種群進行排序,這種排序選擇方式並不包含精英保留策略的作用。
另一種排序是把上一次種群放一直排序,這種方式包含了精英保留策略的作用。
例如有初始種群包含個體為A1,A2,A3,A4,經過適應度計算後得知最優個體為順序為A2,A1,A3,A4,經過排序選擇後為A2,A2,A1,A3,然後經過交叉和變異後的變為B1,B2,B3,B4,而B1,B2,B3,B4的適應度均沒有A2大,那麼如果採用第一種排序方式,只對B1-B4排序選擇,那麼將丟失A2這一優良個體,所以並不包含精英保留作用。如果將B1-B4與A1-A2一起排序,那麼由於A2適應度最大,因此必然會選到A2,等效於精英保留策略。

⑷ 遺傳演算法--GA

        遺傳演算法(GA)屬於 人工智慧啟發式演算法 ,啟發式演算法的目標就是 尋找原始問題的最優解 ,該演算法的定義為

         人類通過直觀常識和生活經驗,設計出一種以搜索最優解為目的,通過模擬大自然規律的演算法,該演算法在可以在接受的花銷(計算時間和存儲空間)范圍內找到問題實例的一個可行解,且該可行解和真實最優解的誤差一般不可以被估計

        當下主要有的啟發式演算法包括 遺傳演算法、退火法,蟻群演算法、人工神經網路等 ,這篇文章主要介紹遺傳演算法

        遺傳演算法的基本原理是模擬達爾文進化論 "物競天擇,適者生存" 的自然法則,其核心思想為

(1)將原始問題的參數,抽象為基因編碼

(2)將原始問題的可行解,抽象為基因排列的染色體組合

(3)將原始問題的解集規模,抽象為一定數量染色體組成的種群

(4)尋找可行解的過程,抽象為種群的進化過程(染色體選擇、交叉、變異等)

(5)比較可行解的優劣,抽象為量化比較不同種群對當前環境的適應程度

(6)逼近最優解的過程,抽象為淘汰適應度差的種群,保留適應度高的種群進行下一次進化

(7)問題的最優解,抽象為經過多次進化後,最終生存下來的精英種群

        理論上,通過有限次種群進化,生存下來的種群都是 精英染色體 ,是最適合當前環境條件的種群,也就可以無限逼近原始問題的最優解

相關生物學術語:

    為了大家更好了解遺傳演算法,在此之前先簡單介紹一下相關生物學術語,大家了解一下即可。

基因型(genotype):性狀染色體的內部表現;

表現型(phenotype):染色體決定的性狀的外部表現,或者說,根據基因型形成的個體的外部表現;

進化(evolution):種群逐漸適應生存環境,品質不斷得到改良。生物的進化是以種群的形式進行的。

適應度(fitness):度量某個物種對於生存環境的適應程度。

選擇(selection):以一定的概率從種群中選擇若干個個體。一般,選擇過程是一種基於適應度的優勝劣汰的過程。

復制(reproction):細胞分裂時,遺傳物質DNA通過復制而轉移到新產生的細胞中,新細胞就繼承了舊細胞的基因。

交叉(crossover):兩個染色體的某一相同位置處DNA被切斷,前後兩串分別交叉組合形成兩個新的染色體。也稱基因重組或雜交;

變異(mutation):復制時可能(很小的概率)產生某些復制差錯,變異產生新的染色體,表現出新的性狀。

編碼(coding):DNA中遺傳信息在一個長鏈上按一定的模式排列。遺傳編碼可看作從表現型到基因型的映射。

解碼(decoding):基因型到表現型的映射。

個體(indivial):指染色體帶有特徵的實體;

種群(population):個體的集合,該集合內個體數稱為種群

大體實現過程

遺傳演算法中每一條染色體,對應著遺傳演算法的一個解決方案,一般我們用適應性函數(fitness function)來衡量這個解決方案的優劣。所以從一個基因組到其解的適應度形成一個映射。 遺傳演算法的實現過程實際上就像自然界的進化過程那樣。

基本遺傳演算法概述

    1.[開始]生成n個染色體的隨機群體(適合該問題的解決方案)

    2.[適應度]評估群體中每個染色體x的適應度f(x)

    3.[新種群]通過重復以下來創建新種群直到新種群完成的步驟

        3.1 [選擇]根據種群的適合度選擇兩個親本染色體(更好的適應性,更大的選擇機會)

        3.2 [交叉]以交叉概率跨越父母形成新的後代(兒童) )。如果沒有進行交叉,後代就是父母的確切副本。

        3.3 [突變]突變概率突變每個基因座(染色體中的位置)的新後代。

    4.[接受]在新種群中放置新後代[替換]使用新生成的種群進一步運行演算法

    5.[測試]如果滿足結束條件,則停止並返回當前種群中的最佳解

    6。[循環]轉到步驟2

影響GA的因素

    從遺傳演算法概述可以看出,交叉和變異是遺傳演算法中最重要的部分。性能主要受這兩個因素的影響。在我們解釋有關交叉和變異的更多信息之前,我們將給出一些有關染色體的信息。

染色體編碼

染色體應該以某種方式包含它所代表的解決方案的信息。最常用的編碼方式是二進制字元串。然後染色體看起來像這樣:

每個染色體由二進制字元串表示。字元串中的每個位都可以表示解決方案的一些特徵。另一種可能性是整個字元串可以表示一個數字 - 這已在基本的GA小程序中使用。當然,還有許多其他的編碼方式。編碼主要取決於解決的問題。例如,可以直接編碼整數或實數,有時對某些排列等進行編碼很有用。

染色體交叉

在我們確定了將使用的編碼之後,我們可以繼續進行交叉操作。 Crossover對來自親本染色體的選定基因進行操作並產生新的後代。最簡單的方法是隨機選擇一些交叉點,並在此點之前從第一個父項復制所有內容,然後在交叉點之後復制另一個父交叉點之後的所有內容。交叉可以說明如下:( |是交叉點):

還有其他方法可以進行交叉,例如我們可以選擇更多的交叉點。交叉可能非常復雜,主要取決於染色體的編碼。針對特定問題進行的特定交叉可以改善遺傳演算法的性能。

4.染色體突變

在執行交叉之後,發生突變。突變旨在防止群體中的所有解決方案落入解決問題的局部最優中。突變操作隨機改變由交叉引起的後代。在二進制編碼的情況下,我們可以將一些隨機選擇的位從1切換到0或從0切換到1.突變可以如下所示:

突變(以及交叉)技術主要取決於染色體的編碼。例如,當我們編碼排列時,可以將突變作為兩個基因的交換來進行。

GA的參數

    1.交叉和突變概率

    GA有兩個基本參數 - 交叉概率和變異概率。

     交叉概率 :交叉的頻率。如果沒有交叉,後代就是父母的精確副本。如果存在交叉,則後代由父母染色體的部分組成。如果交叉概率為100%,那麼所有後代都是由交叉產生的。如果它是0%,那麼全新一代都是從舊種群的染色體的精確拷貝製成的(但這並不意味著新一代是相同的!)。交叉是希望新染色體將包含舊染色體的良好部分,因此新染色體將更好。但是,將舊人口的一部分留給下一代是好的。

     突變概率 :染色體部分突變的頻率。如果沒有突變,則在交叉(或直接復制)後立即生成後代而不進行任何更改。如果進行突變,則改變染色體的一個或多個部分。如果突變概率為100%,則整個染色體發生變化,如果是0%,則沒有變化。突變通常會阻止GA陷入局部極端。突變不應該經常發生,因為GA實際上會改變為隨機搜索。

    2.其他參數

     種群規模 :種群中有多少染色體(一代)。如果染色體太少,GA幾乎沒有可能進行交叉,只探索了一小部分搜索空間。另一方面,如果染色體太多,GA會減慢。研究表明,經過一定的限制(主要取決於編碼和問題),使用非常大的種群是沒有用的,因為它不能比中等規模的種群更快地解決問題。

     3      選擇

正如您從GA概述中已經知道的那樣,從群體中選擇染色體作為交叉的父母。問題是如何選擇這些染色體。根據達爾文的進化論,最好的進化能夠創造出新的後代。選擇最佳染色體的方法有很多種。例如輪盤賭選擇,Boltzman選擇,錦標賽選擇,等級選擇,穩態選擇和其他一些選擇。

1.輪盤賭選擇

父母根據他們的健康狀況選擇。染色體越好,它們被選擇的機會就越多。想像一下輪盤賭輪,人口中的所有染色體都放在那裡。輪盤中截面的大小與每條染色體的適應度函數的值成比例 - 值越大,截面越大。有關示例,請參見下圖。

輪盤賭中放入一塊大理石,並選擇停止的染色體。顯然,具有較大適應值的染色體將被選擇更多次。

該過程可以通過以下演算法來描述。

[Sum]計算總體中所有染色體擬合度的總和 - 總和S.

[Select]從區間(0,S)-r生成隨機數。

[循環]遍歷總體並從0 - 總和中求和。當總和s大於r時,停止並返回您所在的染色體。當然,對於每個群體,步驟1僅執行一次。

2.排名選擇

當健身值之間存在很大差異時,先前的選擇類型會出現問題。例如,如果最佳染色體適應度是所有擬合度總和的90%,那麼其他染色體將很少被選擇的機會。等級選擇首先對群體進行排序,然後每個染色體接收由該等級確定的適合度值。最差的將是健身1,第二個最差的2等等,最好的將具有適應度N(人口中的染色體數量)。您可以在下面的圖片中看到,在更改適應性與排名確定的數字後情況如何變化。

排名前的情況(適合度圖)

排名後的情況(訂單號圖)

現在所有染色體都有機會被選中。然而,這種方法會導致收斂速度變慢,因為最好的染色體與其他染色體的差別不大。

3.穩態選擇

這不是選擇父母的特定方法。這種選擇新種群的主要思想是染色體的很大一部分可以存活到下一代。穩態選擇GA以下列方式工作。在每一代中,選擇一些好的(具有更高適應性)染色體來創建新的後代。然後去除一些不好的(具有較低適合度)染色體並將新的後代放置在它們的位置。其餘人口倖存下來。

4.精英

精英主義的想法已經被引入。當通過交叉和變異創建新的種群時,我們有很大的機會,我們將失去最好的染色體。精英主義是首先將最佳染色體(或少數最佳染色體)復制到新種群的方法的名稱。其餘人口以上述方式構建。精英主義可以迅速提高GA的性能,因為它可以防止丟失最佳找到的解決方案。

交叉(Crossover)和突變 (Mutation)

交叉和變異是GA的兩個基本運算符。 GA的表現非常依賴於它們。運算符的類型和實現取決於編碼以及問題。有多種方法可以執行交叉和變異。在本章中,我們將簡要介紹一些如何執行多個編碼的示例和建議。

1.二進制編碼

交叉

單點交叉 - 選擇一個交叉點,從第一個父項復制從染色體開始到交叉點的二進制字元串,其餘從另一個父項復制

選擇兩點交叉 - 兩個交叉點,從第一個父節點復制從染色體開始到第一個交叉點的二進制字元串,從第一個父節點復制從第一個交叉點到第二個交叉點的部分,其餘的是再次從第一個父級復制

均勻交叉 - 從第一個父項或第二個父項中隨機復制位

算術交叉 - 執行一些算術運算以產生新的後代

突變

位反轉 - 選擇的位被反轉

2.置換編碼

交叉

單點交叉 - 選擇一個交叉點,將排列從第一個父項復制到交叉點,然後掃描另一個父項,如果該數字還沒有在後代中,則添加它注意:還有更多方法如何在交叉點之後產生休息

(1 2 3 4 5 6 7 8 9) + (4 5 3 6 8 9 7 2 1) = (1 2 3 4 5 6 8 9 7)

變異

順序更改 - 選擇並交換兩個數字

(1 2 3 4 5 6 8 9 7) => (1 8 3 4 5 6 2 9 7)

3.值編碼

交叉

可以使用來自二進制編碼的所有交叉

變異

添加一個小數字(用於實數值編碼) - 將一個小數字添加到(或減去)所選值

(1.29 5.68 2.86 4.11 5.55)=>(1.29 5.68 2.73 4.22 5.55)

4.樹編碼

交叉

樹交叉 - 在父母雙方中選擇一個交叉點,父母在該點被分割,交換點下面的部分被交換以產生新的後代

變異

更改運算符,數字 - 選定節點已更改

補充:

疑惑點:

初始種群是啥:

利用二進制(一般)表示最終解

例如:需要求解z=x^2+y^2的最大值,x={1,5,3,8},y={5,4,0,6}

用六位二進制數表示由x,y組成的解,例如:001100 表示x=1,y=4

001100 稱為一條基因序列,表示的是該問題的一種解決 方案

種群是包含多個基因序列(解決方案/個體)的集合

適應度函數是啥,有什麼作用:

適應度函數可以理解成「 游戲 規則」,如果問題較為復雜,需要自定義適應度函數,說明如何區分優秀與不優秀的個體; 如果問題比較簡單,例如上述求最大值的問題,則直接用此函數式作為適應度函數即可。作用:評定個體的優劣程度,從而決定其遺傳機會的大小。

怎麼選擇:

定義「適者生存不適者淘汰」的規則,例如:定義適應度高的被選擇的概率更大

怎麼交叉:

利用循環,遍歷種群中的每個個體,挑選另一個體進行交叉。例如,通過遍歷為基因序列A挑選出B配對,則取A的前半部分,B的後半部分,組合成新的個體(基因序列)C

如何變異:

隨機挑選基因序列上的某一位置,進行0-1互換

建議 GA的參數

如果您決定實施遺傳演算法,本章應該為您提供一些基本建議。這些建議非常籠統。您可能希望嘗試使用自己的GA來解決特定問題,因為沒有一般理論可以幫助您針對任何問題調整GA參數。

建議通常是對GA的經驗研究的結果,這些研究通常僅在二進制編碼上進行。

交叉率

交叉率一般應高,約為80%-95%。 (但是有些結果表明,對於某些問題,交叉率約為60%是最好的。)

突變率

另一方面,突變率應該非常低。最佳利率似乎約為0.5%-1%。

人口規模

可能令人驚訝的是,非常大的人口規模通常不會改善GA的性能(從找到解決方案的速度的意義上說)。良好的人口規模約為20-30,但有時大小為50-100是最好的。一些研究還表明,最佳種群規模取決於編碼字元串(染色體)的大小。這意味著如果你有32位染色體,那麼人口應該高於16位染色體。

選擇

可以使用基本的輪盤賭選擇,但有時排名選擇可以更好。查看有關選擇優缺點的章節。還有一些更復雜的方法可以在GA運行期間更改選擇參數。基本上,這些表現類似於模擬退火。如果您不使用其他方法來保存最佳找到的解決方案,則應確保使用精英主義。您也可以嘗試穩態選擇。

編碼

編碼取決於問題以及問題實例的大小。查看有關編碼的章節以獲取一些建議或查看其他資源。

交叉和變異

運算符取決於所選的編碼和問題。查看有關操作員的章節以獲取一些建議。您還可以查看其他網站。

搜索空間

    如果我們正在解決問題,我們通常會尋找一些最好的解決方案。所有可行解決方案的空間(所需解決方案所在的解決方案集)稱為搜索空間(也稱為狀態空間)。搜索空間中的每個點代表一種可能的解決方案。每個可能的解決方案可以通過其對問題的值(或適應度)進行「標記」。通過GA,我們在眾多可能的解決方案中尋找最佳解決方案 - 以搜索空間中的一個點為代表。然後尋找解決方案等於在搜索空間中尋找一些極值(最小值或最大值)。有時可以很好地定義搜索空間,但通常我們只知道搜索空間中的幾個點。在使用遺傳演算法的過程中,隨著進化的進行,尋找解決方案的過程會產生其他點(可能的解決方案)。

    問題是搜索可能非常復雜。人們可能不知道在哪裡尋找解決方案或從哪裡開始。有許多方法可用於尋找合適的解決方案,但這些方法不一定能提供最佳解決方案。這些方法中的一些是爬山,禁忌搜索,模擬退火和遺傳演算法。通過這些方法找到的解決方案通常被認為是很好的解決方案,因為通常不可能證明最佳方案。

NP-hard Problems

NP問題是一類無法用「傳統」方式解決的問題。我們可以快速應用許多任務(多項式)演算法。還存在一些無法通過演算法解決的問題。有很多重要問題很難找到解決方案,但是一旦有了解決方案,就很容易檢查解決方案。這一事實導致了NP完全問題。 NP代表非確定性多項式,它意味著可以「猜測」解決方案(通過一些非確定性演算法),然後檢查它。如果我們有一台猜測機器,我們或許可以在合理的時間內找到解決方案。為簡單起見,研究NP完全問題僅限於答案可以是或否的問題。由於存在輸出復雜的任務,因此引入了一類稱為NP難問題的問題。這個類並不像NP完全問題那樣受限。 NP問題的一個特徵是,可以使用一個簡單的演算法,可能是第一眼看到的,可用於找到可用的解決方案。但是這種方法通常提供了許多可能的解決方案 - 只是嘗試所有可能的解決方案是非常緩慢的過程(例如O(2 ^ n))。對於這些類型問題的更大的實例,這種方法根本不可用。今天沒有人知道是否存在一些更快的演算法來提供NP問題的確切答案。對於研究人員來說,發現這樣的演算法仍然是一項重大任務(也許你!:-))。今天許多人認為這種演算法不存在,因此他們正在尋找替代方法。替代方法的一個例子是遺傳演算法。 NP問題的例子是可滿足性問題,旅行商問題或背包問題。可以獲得NP問題匯編。

參考:

         https://www.jianshu.com/p/ae5157c26af9

        https://www.jianshu.com/p/b36b520bd187

⑸ 請問遺傳演算法精英保留策略就是指精英選擇嗎怎麼在聯賽選擇中加入精英策略,請問大致思想是什麼

不管採用哪種選擇方法,目的是將對結果有利的基因選出來,參加下一次進化。

如果,演算法中採用概率類的選擇方法,可能會導致本次計算最優的基因(精英)沒有被選上。

通常,採用精英保留策略,就是直接將這些(或這個)最優基因,不通過選擇,直接參加下一次進化。

理解了,其實是比較好實現的。

但是一定要選擇合適的比例。比例太大,進化太慢。

⑹ 關於神經網路,蟻群演算法和遺傳演算法

  1. 神經網路並行性和自適應性很強,應用領域很廣,在任何非線性問題中都可以應用,如控制、信息、預測等各領域都能應用。

  2. 蟻群演算法最開始應用於TSP問題,獲得了成功,後來又廣泛應用於各類組合優化問題。但是該演算法理論基礎較薄弱,演算法收斂性都沒有得到證明,很多參數的設定也僅靠經驗,實際效果也一般,使用中也常常早熟。

  3. 遺傳演算法是比較成熟的演算法,它的全局尋優能力很強,能夠很快地趨近較優解。主要應用於解決組合優化的NP問題。

  4. 這三種演算法可以相互融合,例如GA可以優化神經網路初始權值,防止神經網路訓練陷入局部極小且加快收斂速度。蟻群演算法也可用於訓練神經網路,但一定要使用優化後的蟻群演算法,如最大-最小蟻群演算法和帶精英策略。

⑺ 遺傳演算法精英保留策略

我認為你的做法是對的,雖然每個人的做法有所不同。《遺傳演算法原理及應用》這本書中介紹的最優保存策略是這樣的:即當前種群中適應度最高的個體不參與交叉運算和變異運算,而是用它來替換掉本代群體中經過交叉、變異等遺傳操作後所產生的適應度最低的個體。
如果是在遺傳操作之後再採取最優保存,那麼上一代的最優個體沒准就在操作過程中被破壞了、丟失了。

⑻ 如何通俗易懂地解釋遺傳演算法

遺傳演算法,核心是達爾文優勝劣汰適者生存的進化理論的思想。

我們都知道一個種群,通過長時間的繁衍,種群的基因會向著更適應環境的趨勢進化,牛B個體的基因被保留,後代越來越多,適應能力低個體的基因被淘汰,後代越來越少。經過幾代的繁衍進化,留下來的少數個體,就是相對能力最強的個體了。

那麼在解決一些問題的時候,我們能不能學習這樣的思想,比如先隨機創造很多很多的解,然後找一個靠譜的評價體系,去篩選比較好的解,再用這些好的解像生小寶寶一樣生一堆可能更好的解,然後再篩再生,反復弄個幾代,得到的說不定就是近似最優解喲

說干就干,有一個經典組合問題叫「背包問題」,我們拿這種思路來試試

「背包問題(Knapsack Problem)是一種組合優化的NP完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和價格,在限定的總重量內,我們如何選擇,才能使得物品的總價格最高。問題的名稱來源於如何選擇最合適的物品放置於給定背包中。」

這個問題的衍生簡化問題「0-1背包問題」 增加了限制條件:每件物品只有一件,可以選擇放或者不放,更適合我們來舉例

這樣的問題如果數量少,當然最好選擇窮舉法

比如一共3件商品,用0表示不取,1表示取,那麼就一共有

000 001 010

011 100 101

110 111

這樣方案,然後讓計算機去累加和,與重量上限比較,留下來的解里取最大即可。

熱點內容
我的世界所有伺服器都能刷tnt么 發布:2025-03-10 09:25:41 瀏覽:288
相冊加密oppo 發布:2025-03-10 09:06:45 瀏覽:615
計程車網上學習登錄密碼多少 發布:2025-03-10 09:06:43 瀏覽:670
保險公司工資怎麼演算法 發布:2025-03-10 09:03:50 瀏覽:144
yy模擬器源碼 發布:2025-03-10 09:00:47 瀏覽:770
海信冰箱的壓縮機 發布:2025-03-10 08:55:52 瀏覽:269
安卓模擬器如何設置網路設置在哪裡 發布:2025-03-10 08:46:14 瀏覽:927
知道服務密碼怎麼辦 發布:2025-03-10 08:43:57 瀏覽:723
c語言程序名的後綴是 發布:2025-03-10 08:43:18 瀏覽:261
c語言偏移量 發布:2025-03-10 08:43:09 瀏覽:869