python遗传算法工具箱的使用_遗传算法的python实现,非常值得看的一篇文章
遺傳算法是一種智能優化算法,通常用于求解復雜的數學問題。相比于傳統方法,遺傳算法摒棄了盲目的窮舉或完全隨機的求解策略,借鑒了自然界優勝劣汰、自然進化的思想,快速逼近最優解。上文對遺傳算法的基本內容進行了介紹,本文將通過一個例子的講解帶領讀者深入遺傳算法的每一個具體步驟,并用python完整地實現整個算法,題目如下圖所示。
第一步:編碼
通過對題目的分析,這是一個包含兩個自變量的復雜函數,而且規定了自變量的取值范圍。為保證精度,我們將保留小數點后四位小數。下面考慮如何將兩個自變量編碼成二進制:1.為了滿足精度的同時避免使用小數點,我們需要將自變量乘以10000;2.為了節省內存,我們應該根據自變量的取值范圍確定2進制的位數。
上圖很清楚地展示了編碼的思路和過程,首先根據自變量的取值范圍確定二進制的位數(分別對應18位和15位),然后將兩個01串拼接成一個長度為33的01串。這個二進制串可以看作一條染色體,0或1可以看作基因,接下來的交叉、變異操作都將在這個二進制串上進行。
第二步:種群初始化
種群中應包含一定數目的染色體(33位的二進制),這些染色體使用隨機數的方法完成初始化。用python實現這一功能非常簡單,雙重for循環+隨機數函數輕松解決,代碼很容易理解,這里不再啰嗦。
第三步:計算個體適應度
有了初始化的種群,下面讓我們開啟“上帝視角”,判斷種群中每個個體對自然的適應程度。由于我們的目的是尋找函數的最大值,因此題目中的函數就是我們“自然法則”,我們要將33位的二進制數解析成兩個自變量,然后帶入函數計算結果,結果越大代表適應度越強,在進化過程中更容易得到上帝的垂青。在下圖的python代碼中,將二進制轉換成十進制之后,要將自變量轉換到指定取值范圍。
第四步:開始進化
選擇。“物競天擇,適者生存”是進化論的核心思想,接下來要根據個體的適應度來決定哪些個體被淘汰,哪些個體繼續進化。為了避免陷入局部最優解,維護自然界的公平正義,我們采用輪盤賭的方法。所有個體都可能被淘汰,只不過適應度越低,被淘汰的概率越高。下圖的python代碼不長,相信讀者一看就懂。
交叉。經過自然法則的選擇之后幸存下來的個體開始繁衍生息,生命的繁衍過程實際上是染色體相互交叉的過程,目的是生成適應度更高的后代。我們設定一個參數“交叉率”,利用“上帝之手”--隨機數對是否進化做出選擇。產生0~32之間的隨機整數對兩個33位的二進制數進行切割,并交叉重組。
變異。自然界中的基因突變,也可以完全用程序實現。變異的概率很低,我們需要設定另外一個參數“變異率”,通過修改染色體上隨機位置的一個基因實現變異。下圖中的python代碼中replace_char( )函數為自定義函數,功能是實現了指定位置字符的替換,參見完整代碼。
多代進化
以上的步驟構成了種群的一次完整進化過程,當然為了得到最優解,我們需要讓種群進行成百上千代的進化。再多的世代對python而言都是一個for循環的事。第一次實驗,我設置的參數:進化世代為1000,種群規模為100,交叉率0.7,變異率0.1,結果顯示在335代時得到最優解,x1=11.6284,x2=5.3241,此時函數的最大值為38.4342,各世代最優解如下所示。
總結
本文從一個例子出發,詳細講解了遺傳算法的具體步驟和python實現,應該說整體的思路還是很清晰的,如果使用numpy代碼會更簡潔,當然還有更簡單的實現方法,matlab和python的sklearn包中都集成了遺傳算法工具包,只需要幾行代碼就能完成遺傳算法的計算,但是我覺得自己動手實現有助于加深我們對遺傳算法的理解。完整代碼已上傳,老規矩,如果需要請在下方評論留言。
總結
以上是生活随笔為你收集整理的python遗传算法工具箱的使用_遗传算法的python实现,非常值得看的一篇文章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站空间怎么使用(网站空间怎么使用教程)
- 下一篇: 萌萌安卓游戏(安卓萌游戏)