Geatpy
The Genetic and Evolutionary Algorithm Toolbox for Python
Introduction
- Website (including documentation): http://www.geatpy.com
- Tutorial pdf: https://github.com/geatpy-dev/geatpy/tree/master/geatpy/doc/Geatpy-tutorials (推薦看!)
- Demo : https://github.com/geatpy-dev/geatpy/tree/master/geatpy/demo
- Pypi page : https://pypi.org/project/geatpy/
- Contact us: http://www.geatpy.com/support
- Source code: https://github.com/geatpy-dev/geatpy/tree/master/geatpy/source-code
- Bug reports: https://github.com/geatpy-dev/geatpy/issues
- Franchised blog: https://blog.csdn.net/qq_33353186
- github:https://github.com/geatpy-dev/geatpy
推薦一個博客:https://blog.csdn.net/qq_33353186 寫的很詳細!!
Geatpy提供了許多已實現的遺傳和進化算法相關算子的庫函數,如初始化種群、選擇、交叉、變異、重插入、多種群遷移、多目標優化非支配排序等,並且提供開放式的進化算法框架來實現多樣化的進化算法。其執行效率高於Matlab遺傳算法工具箱和Matlab第三方遺傳算法工具箱Gaot、gatbx、GEATbx,學習成本低。
Geatpy支持二進制/格雷碼編碼種群、實數值種群、整數值種群、排列編碼種群。支持輪盤賭選擇、隨機抽樣選擇、錦標賽選擇。提供單點交叉、兩點交叉、洗牌交叉、部分匹配交叉(PMX)、線性重組、離散重組、中間重組等重組算子。提供簡單離散變異、實數值變異、整數值變異、互換變異等變異算子。支持隨機重插入、精英重插入。支持awGA、rwGA、nsga2、快速非支配排序等多目標優化的庫函數、提供進化算法框架下的常用進化算法模板等。
看了tutorials之后,我選擇了sga_new_code_templet 這個模板庫

輸入的控制變量可以自己選擇是實數或整數(后面會提到這個參數)。以下面的例子為例,Phen為傳入的控制變量矩陣,它本身不需要定義具體數值。因為自變量的范圍在main.py里會定義。
-*- coding: utf-8 -*- """ aimfc.py - 目標函數demo 描述: Geatpy的目標函數遵循本案例的定義方法, 傳入種群表現型矩陣Phen, 以及可行性 列向量LegV 若沒有約束條件, 也需要返回LegV(種群個體的可行性列向量,若未定義懲罰函數,則可以不定義) 若要改變目標函數的輸入參數、 輸出參數的格式, 則需要修改或自定義算法模板 """ import numpy as np def aimfuc(Phen, LegV): x1 = Phen[:, [0]] x2 = Phen[:, [1]] f = 21.5 + x1 * np.sin(4 * np.pi * x1) + x2 * np.sin(20 * np.pi * x2) return [f, LegV] # -*- coding: utf-8 -*- """ 執行腳本main.py 描述: 該demo是展示如何計算無約束的單目標優化問題 本案例通過調用sga_new_code_templet算法模板來解決該問題 其中目標函數寫在aimfuc.py文件中 本案例調用了“sga_new_code_templet” 這個算法模板, 其詳細用法可利用help命 令查看, 或是在github下載並查看源碼 調用算法模板時可以設置drawing=2, 此時算法模板將在種群進化過程中繪制動畫, 但注意執行前要在Python控制台執行命令matplotlib qt5。 """ import numpy as np import geatpy as ga # 獲取函數接口地址 AIM_M = __import__('aimfuc') # 變量設置 x1 = [-3, 12.1] # 自變量1的范圍 x2 = [4.1, 5.8] # 自變量2的范圍 b1 = [1, 1] # 自變量1是否包含下界和上界(0:不包括,1:包括) b2 = [1, 1] # 自變量2是否包含上界 codes = [0, 0] # 自變量的編碼方式, 0表示采用標准二進制編碼 precisions = [4, 4] #自變量的精度(精度不宜設置太高, 否則影響搜索性能和效果) scales = [0, 0] # 是否采用對數刻度 ranges=np.vstack([x1, x2]).T # 生成自變量的范圍矩陣 borders = np.vstack([b1, b2]).T # 生成自變量的邊界矩陣 # 生成區域描述器 FieldD = ga.crtfld(ranges, borders, precisions, codes, scales) # 調用編程模板 [pop_trace, var_trace, times] = ga.sga_new_code_templet(AIM_M, 'aimfuc', None, None, FieldD, problem = 'R', maxormin = -1, MAXGEN = 1000, NIND = 100, SUBPOP = 1, GGAP = 0.8, selectStyle = 'sus', recombinStyle = 'xovdp', recopt = None, pm = None, distribute = True, drawing = 1)
在github上找到這個模板的代碼如下:
https://github.com/geatpy-dev/geatpy/blob/master/geatpy/source-code/templets/sga_new_code_templet.py
它的一些參數,里面有定義,可以在main.py里修改。
本模板實現改進單目標編程模板(二進制/格雷編碼),將父子兩代合並進行選擇,增加了精英保留機制 語法: 該函數除了參數drawing外,不設置可缺省參數。當某個參數需要缺省時,在調用函數時傳入None即可。 比如當沒有罰函數時,則在調用編程模板時將第3、4個參數設置為None即可,如: sga_new_code_templet(AIM_M, 'aimfuc', None, None, ..., maxormin) 輸入參數: AIM_M - 目標函數的地址,由AIM_M = __import__('目標函數所在文件名')語句得到 目標函數規范定義:[f,LegV] = aimfuc(Phen,LegV) 其中Phen是種群的表現型矩陣, LegV為種群的可行性列向量,f為種群的目標函數值矩陣 AIM_F : str - 目標函數名 PUN_M - 罰函數的地址,由PUN_M = __import__('罰函數所在文件名')語句得到 罰函數規范定義: newFitnV = punishing(LegV, FitnV) 其中LegV為種群的可行性列向量, FitnV為種群個體適應度列向量 一般在罰函數中對LegV為0的個體進行適應度懲罰,返回修改后的適應度列向量newFitnV PUN_F : str - 罰函數名 FieldD : array - 二進制/格雷碼種群區域描述器, 描述種群每個個體的染色體長度和如何解碼的矩陣,它有以下結構: [lens; (int) 每個控制變量編碼后在染色體中所占的長度 lb; (float) 指明每個變量使用的下界 ub; (float) 指明每個變量使用的上界 codes; (0:binary | 1:gray) 指明子串是怎么編碼的, 0為標准二進制編碼,1為各類編碼 scales; (0: rithmetic | 1:logarithmic) 指明每個子串是否使用對數或算術刻度, 1為使用對數刻度,2為使用算術刻度 lbin; (0:excluded | 1:included) ubin] (0:excluded | 1:included) lbin和ubin指明范圍中是否包含每個邊界。 選擇lbin=0或ubin=0,表示范圍中不包含相應邊界。 選擇lbin=1或ubin=1,表示范圍中包含相應邊界。 problem : str - 表明是整數問題還是實數問題,'I'表示是整數問題,'R'表示是實數問題 maxormin int - 最小最大化標記,1表示目標函數最小化;-1表示目標函數最大化 MAXGEN : int - 最大遺傳代數 NIND : int - 種群規模,即種群中包含多少個個體 SUBPOP : int - 子種群數量,即對一個種群划分多少個子種群 GGAP : float - 代溝,本模板中該參數為無用參數,僅為了兼容同類的其他模板而設 selectStyle : str - 指代所采用的低級選擇算子的名稱,如'rws'(輪盤賭選擇算子) recombinStyle: str - 指代所采用的低級重組算子的名稱,如'xovsp'(單點交叉) recopt : float - 交叉概率 distribute : bool - 是否增強種群的分布性(可能會造成收斂慢) pm : float - 重組概率 drawing : int - (可選參數),0表示不繪圖,1表示繪制最終結果圖。默認drawing為1 輸出參數: pop_trace : array - 種群進化記錄器(進化追蹤器), 第0列記錄着各代種群最優個體的目標函數值 第1列記錄着各代種群的適應度均值 第2列記錄着各代種群最優個體的適應度值 var_trace : array - 變量記錄器,記錄着各代種群最優個體的變量值,每一列對應一個控制變量 times : float - 進化所用時間 模板使用注意: 1.本模板調用的目標函數形如:[ObjV,LegV] = aimfuc(Phen,LegV), 其中Phen表示種群的表現型矩陣, LegV為種群的可行性列向量(詳見Geatpy數據結構) 2.本模板調用的罰函數形如: newFitnV = punishing(LegV, FitnV), 其中FitnV為用其他算法求得的適應度 若不符合上述規范,則請修改算法模板或自定義新算法模板 3.關於'maxormin': geatpy的內核函數全是遵循“最小化目標”的約定的,即目標函數值越小越好。 當需要優化最大化的目標時,需要設置'maxormin'為-1。 本算法模板是正確使用'maxormin'的典型范例,其具體用法如下: 當調用的函數傳入參數包含與“目標函數值矩陣”有關的參數(如ObjV,ObjVSel,NDSetObjV等)時, 查看該函數的參考資料(可用'help'命令查看,也可到官網上查看相應的教程), 里面若要求傳入前對參數乘上'maxormin',則需要乘上。 里面若要求對返回參數乘上'maxormin'進行還原, 則調用函數返回得到的相應參數需要乘上'maxormin'進行還原,否則其正負號就會被改變。 """
最后,實驗室師兄一開始給我安利了 Jmetal 這個庫(Java和Python兩個版本),下面是文檔網站鏈接,也可以在github上找到源碼,然后安裝。但是文檔寫的實在是不清晰,搞得我對它定義得參數一頭霧水。后面就放棄用它了。
https://jmetalpy.readthedocs.io/en/latest/examples/ea.html#moea-d
最近看論文發現有作者用的是pymoo這個庫和 pymop : This framework provides a collection of test problems in Python.
據說deap這個遺傳算法庫也不錯,不過我沒用過 :)