geatpy
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
推薦一個(gè)博客:https://blog.csdn.net/qq_33353186 寫的很詳細(xì)!!
Geatpy提供了許多已實(shí)現(xiàn)的遺傳和進(jìn)化算法相關(guān)算子的庫(kù)函數(shù),如初始化種群、選擇、交叉、變異、重插入、多種群遷移、多目標(biāo)優(yōu)化非支配排序等,并且提供開放式的進(jìn)化算法框架來(lái)實(shí)現(xiàn)多樣化的進(jìn)化算法。其執(zhí)行效率高于Matlab遺傳算法工具箱和Matlab第三方遺傳算法工具箱Gaot、gatbx、GEATbx,學(xué)習(xí)成本低。
Geatpy支持二進(jìn)制/格雷碼編碼種群、實(shí)數(shù)值種群、整數(shù)值種群、排列編碼種群。支持輪盤賭選擇、隨機(jī)抽樣選擇、錦標(biāo)賽選擇。提供單點(diǎn)交叉、兩點(diǎn)交叉、洗牌交叉、部分匹配交叉(PMX)、線性重組、離散重組、中間重組等重組算子。提供簡(jiǎn)單離散變異、實(shí)數(shù)值變異、整數(shù)值變異、互換變異等變異算子。支持隨機(jī)重插入、精英重插入。支持awGA、rwGA、nsga2、快速非支配排序等多目標(biāo)優(yōu)化的庫(kù)函數(shù)、提供進(jìn)化算法框架下的常用進(jìn)化算法模板等。
看了tutorials之后,我選擇了sga_new_code_templet 這個(gè)模板庫(kù)
輸入的控制變量可以自己選擇是實(shí)數(shù)或整數(shù)(后面會(huì)提到這個(gè)參數(shù))。以下面的例子為例,Phen為傳入的控制變量矩陣,它本身不需要定義具體數(shù)值。因?yàn)樽宰兞康姆秶趍ain.py里會(huì)定義。
-*- coding: utf-8 -*-
"""
aimfc.py - 目標(biāo)函數(shù)demo
描述:
Geatpy的目標(biāo)函數(shù)遵循本案例的定義方法, 傳入種群表現(xiàn)型矩陣Phen, 以及可行性
列向量LegV
若沒有約束條件, 也需要返回LegV(種群個(gè)體的可行性列向量,若未定義懲罰函數(shù),則可以不定義)
若要改變目標(biāo)函數(shù)的輸入?yún)?shù)、 輸出參數(shù)的格式, 則需要修改或自定義算法模板
"""
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 -*-
"""
執(zhí)行腳本main.py
描述:
該demo是展示如何計(jì)算無(wú)約束的單目標(biāo)優(yōu)化問(wèn)題
本案例通過(guò)調(diào)用sga_new_code_templet算法模板來(lái)解決該問(wèn)題
其中目標(biāo)函數(shù)寫在aimfuc.py文件中
本案例調(diào)用了“sga_new_code_templet” 這個(gè)算法模板, 其詳細(xì)用法可利用help命
令查看, 或是在github下載并查看源碼
調(diào)用算法模板時(shí)可以設(shè)置drawing=2, 此時(shí)算法模板將在種群進(jìn)化過(guò)程中繪制動(dòng)畫,
但注意執(zhí)行前要在Python控制臺(tái)執(zhí)行命令matplotlib qt5。
"""
import numpy as np
import geatpy as ga
# 獲取函數(shù)接口地址
AIM_M = __import__('aimfuc')
# 變量設(shè)置
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表示采用標(biāo)準(zhǔn)二進(jìn)制編碼
precisions = [4, 4] #自變量的精度(精度不宜設(shè)置太高, 否則影響搜索性能和效果)
scales = [0, 0] # 是否采用對(duì)數(shù)刻度
ranges=np.vstack([x1, x2]).T # 生成自變量的范圍矩陣
borders = np.vstack([b1, b2]).T # 生成自變量的邊界矩陣
# 生成區(qū)域描述器
FieldD = ga.crtfld(ranges, borders, precisions, codes, scales)
# 調(diào)用編程模板
[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上找到這個(gè)模板的代碼如下:
https://github.com/geatpy-dev/geatpy/blob/master/geatpy/source-code/templets/sga_new_code_templet.py
它的一些參數(shù),里面有定義,可以在main.py里修改。
本模板實(shí)現(xiàn)改進(jìn)單目標(biāo)編程模板(二進(jìn)制/格雷編碼),將父子兩代合并進(jìn)行選擇,增加了精英保留機(jī)制
語(yǔ)法:
該函數(shù)除了參數(shù)drawing外,不設(shè)置可缺省參數(shù)。當(dāng)某個(gè)參數(shù)需要缺省時(shí),在調(diào)用函數(shù)時(shí)傳入None即可。
比如當(dāng)沒有罰函數(shù)時(shí),則在調(diào)用編程模板時(shí)將第3、4個(gè)參數(shù)設(shè)置為None即可,如:
sga_new_code_templet(AIM_M, 'aimfuc', None, None, ..., maxormin)
輸入?yún)?shù):
AIM_M - 目標(biāo)函數(shù)的地址,由AIM_M = __import__('目標(biāo)函數(shù)所在文件名')語(yǔ)句得到
目標(biāo)函數(shù)規(guī)范定義:[f,LegV] = aimfuc(Phen,LegV)
其中Phen是種群的表現(xiàn)型矩陣, LegV為種群的可行性列向量,f為種群的目標(biāo)函數(shù)值矩陣
AIM_F : str - 目標(biāo)函數(shù)名
PUN_M - 罰函數(shù)的地址,由PUN_M = __import__('罰函數(shù)所在文件名')語(yǔ)句得到
罰函數(shù)規(guī)范定義: newFitnV = punishing(LegV, FitnV)
其中LegV為種群的可行性列向量, FitnV為種群個(gè)體適應(yīng)度列向量
一般在罰函數(shù)中對(duì)LegV為0的個(gè)體進(jìn)行適應(yīng)度懲罰,返回修改后的適應(yīng)度列向量newFitnV
PUN_F : str - 罰函數(shù)名
FieldD : array - 二進(jìn)制/格雷碼種群區(qū)域描述器,
描述種群每個(gè)個(gè)體的染色體長(zhǎng)度和如何解碼的矩陣,它有以下結(jié)構(gòu):
[lens; (int) 每個(gè)控制變量編碼后在染色體中所占的長(zhǎng)度
lb; (float) 指明每個(gè)變量使用的下界
ub; (float) 指明每個(gè)變量使用的上界
codes; (0:binary | 1:gray) 指明子串是怎么編碼的,
0為標(biāo)準(zhǔn)二進(jìn)制編碼,1為各類編碼
scales; (0: rithmetic | 1:logarithmic) 指明每個(gè)子串是否使用對(duì)數(shù)或算術(shù)刻度,
1為使用對(duì)數(shù)刻度,2為使用算術(shù)刻度
lbin; (0:excluded | 1:included)
ubin] (0:excluded | 1:included)
lbin和ubin指明范圍中是否包含每個(gè)邊界。
選擇lbin=0或ubin=0,表示范圍中不包含相應(yīng)邊界。
選擇lbin=1或ubin=1,表示范圍中包含相應(yīng)邊界。
problem : str - 表明是整數(shù)問(wèn)題還是實(shí)數(shù)問(wèn)題,'I'表示是整數(shù)問(wèn)題,'R'表示是實(shí)數(shù)問(wèn)題
maxormin int - 最小最大化標(biāo)記,1表示目標(biāo)函數(shù)最小化;-1表示目標(biāo)函數(shù)最大化
MAXGEN : int - 最大遺傳代數(shù)
NIND : int - 種群規(guī)模,即種群中包含多少個(gè)個(gè)體
SUBPOP : int - 子種群數(shù)量,即對(duì)一個(gè)種群劃分多少個(gè)子種群
GGAP : float - 代溝,本模板中該參數(shù)為無(wú)用參數(shù),僅為了兼容同類的其他模板而設(shè)
selectStyle : str - 指代所采用的低級(jí)選擇算子的名稱,如'rws'(輪盤賭選擇算子)
recombinStyle: str - 指代所采用的低級(jí)重組算子的名稱,如'xovsp'(單點(diǎn)交叉)
recopt : float - 交叉概率
distribute : bool - 是否增強(qiáng)種群的分布性(可能會(huì)造成收斂慢)
pm : float - 重組概率
drawing : int - (可選參數(shù)),0表示不繪圖,1表示繪制最終結(jié)果圖。默認(rèn)drawing為1
輸出參數(shù):
pop_trace : array - 種群進(jìn)化記錄器(進(jìn)化追蹤器),
第0列記錄著各代種群最優(yōu)個(gè)體的目標(biāo)函數(shù)值
第1列記錄著各代種群的適應(yīng)度均值
第2列記錄著各代種群最優(yōu)個(gè)體的適應(yīng)度值
var_trace : array - 變量記錄器,記錄著各代種群最優(yōu)個(gè)體的變量值,每一列對(duì)應(yīng)一個(gè)控制變量
times : float - 進(jìn)化所用時(shí)間
模板使用注意:
1.本模板調(diào)用的目標(biāo)函數(shù)形如:[ObjV,LegV] = aimfuc(Phen,LegV),
其中Phen表示種群的表現(xiàn)型矩陣, LegV為種群的可行性列向量(詳見Geatpy數(shù)據(jù)結(jié)構(gòu))
2.本模板調(diào)用的罰函數(shù)形如: newFitnV = punishing(LegV, FitnV),
其中FitnV為用其他算法求得的適應(yīng)度
若不符合上述規(guī)范,則請(qǐng)修改算法模板或自定義新算法模板
3.關(guān)于'maxormin': geatpy的內(nèi)核函數(shù)全是遵循“最小化目標(biāo)”的約定的,即目標(biāo)函數(shù)值越小越好。
當(dāng)需要優(yōu)化最大化的目標(biāo)時(shí),需要設(shè)置'maxormin'為-1。
本算法模板是正確使用'maxormin'的典型范例,其具體用法如下:
當(dāng)調(diào)用的函數(shù)傳入?yún)?shù)包含與“目標(biāo)函數(shù)值矩陣”有關(guān)的參數(shù)(如ObjV,ObjVSel,NDSetObjV等)時(shí),
查看該函數(shù)的參考資料(可用'help'命令查看,也可到官網(wǎng)上查看相應(yīng)的教程),
里面若要求傳入前對(duì)參數(shù)乘上'maxormin',則需要乘上。
里面若要求對(duì)返回參數(shù)乘上'maxormin'進(jìn)行還原,
則調(diào)用函數(shù)返回得到的相應(yīng)參數(shù)需要乘上'maxormin'進(jìn)行還原,否則其正負(fù)號(hào)就會(huì)被改變。
"""
最后,實(shí)驗(yàn)室?guī)熜忠婚_始給我安利了 Jmetal 這個(gè)庫(kù)(Java和Python兩個(gè)版本),下面是文檔網(wǎng)站鏈接,也可以在github上找到源碼,然后安裝。但是文檔寫的實(shí)在是不清晰,搞得我對(duì)它定義得參數(shù)一頭霧水。后面就放棄用它了。
https://jmetalpy.readthedocs.io/en/latest/examples/ea.html
最近看論文發(fā)現(xiàn)有作者用的是pymoo這個(gè)庫(kù)和 pymop : This framework provides a collection of test problems in Python.
據(jù)說(shuō)deap這個(gè)遺傳算法庫(kù)也不錯(cuò),不過(guò)我沒用過(guò) :)
總結(jié)
- 上一篇: 春招实习_阿里一面
- 下一篇: 周杰伦新专辑只有6首新歌!网友边骂边买: