您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python遺傳算法Geatpy工具箱怎么用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Python遺傳算法Geatpy工具箱怎么用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
遺傳算法是仿真生物遺傳學(xué)和自然選擇機(jī)理,通過(guò)人工方式所構(gòu)造的一類(lèi)搜索算法,從某種程度上說(shuō)遺傳算法是對(duì)生物進(jìn)化過(guò)程進(jìn)行的數(shù)學(xué)方式仿真。生物種群的生存過(guò)程普遍遵循達(dá)爾文進(jìn)化準(zhǔn)則,群體中的個(gè)體根據(jù)對(duì)環(huán)境的適應(yīng)能力而被大自然所選擇或淘汰。進(jìn)化過(guò)程的結(jié)果反映在個(gè)體的結(jié)構(gòu)上,其染色體包含若干基因,相應(yīng)的表現(xiàn)型和基因型的聯(lián)系體現(xiàn)了個(gè)體的外部特性與內(nèi)部機(jī)理間邏輯關(guān)系。通過(guò)個(gè)體之間的交叉、變異來(lái)適應(yīng)大自然環(huán)境。生物染色體用數(shù)學(xué)方式或計(jì)算機(jī)方式來(lái)體現(xiàn)就是一串?dāng)?shù)碼,仍叫染色體,有時(shí)也叫個(gè)體;適應(yīng)能力是對(duì)應(yīng)著一個(gè)染色體的一個(gè)數(shù)值來(lái)衡量;染色體的選擇或淘汰則按所面對(duì)的問(wèn)題是求最大還是最小來(lái)進(jìn)行。
API官方參考文檔
population參數(shù)【重要屬性:Chrom,Phen,Objv,CV,F(xiàn)itnV】
sizes : int - 種群規(guī)模,即種群的個(gè)體數(shù)目。
ChromNum : int - 染色體的數(shù)目,即每個(gè)個(gè)體有多少條染色體。
Encoding : str - 染色體編碼方式, 'BG':二進(jìn)制/格雷編碼; 'RI':實(shí)整數(shù)編碼,即實(shí)數(shù)和整數(shù)的混合編碼; 'P':排列編碼
Field : array - 譯碼矩陣
Chrom : array - 種群染色體矩陣,每一行對(duì)應(yīng)一個(gè)個(gè)體的一條染色體。
Lind : int - 種群染色體長(zhǎng)度。
ObjV : array - 種群目標(biāo)函數(shù)值矩陣,每一行對(duì)應(yīng)一個(gè)個(gè)體的目標(biāo)函數(shù)值,每一列對(duì)應(yīng)一個(gè)目標(biāo)
FitnV : array - 種群個(gè)體適應(yīng)度列向量,每個(gè)元素對(duì)應(yīng)一個(gè)個(gè)體的適應(yīng)度,最小適應(yīng)度為0
CV : array - CV(Constraint Violation Value)是用來(lái)定量描述違反約束條件程度的矩陣,每行對(duì)應(yīng)一個(gè)個(gè)體,每列對(duì)應(yīng)一個(gè)約束
Phen : array - 種群表現(xiàn)型矩陣(即種群各染色體解碼后所代表的決策變量所組成的矩陣)。
如果通過(guò)CV矩陣基于可行性法則進(jìn)行約束的設(shè)置,那么 不等式約束需要 ≤,等式約束 需要傳入abs( ) (因?yàn)樽裱翟酱?,適應(yīng)度越小的原則)
ea.Problem.init()中的lbin與ubin(決策變量范圍邊界矩陣)表示范圍區(qū)間的開(kāi)閉,1閉合0開(kāi)區(qū)間
Geatpy 結(jié)果參數(shù)介紹
success
: True or False, 表示算法是否成功求解。
stopMsg
: 存儲(chǔ)著算法停止原因的字符串。
optPop
: 存儲(chǔ)著算法求解結(jié)果的種群對(duì)象。如果無(wú)可行解,則optPop.sizes=0。optPop.Phen為決策變量矩陣,optPop.ObjV為目標(biāo)函數(shù)值矩陣。
lastPop
: 算法進(jìn)化結(jié)束后的最后一代種群對(duì)象。
Vars
: 等于optPop.Phen,此處即最優(yōu)解。若無(wú)可行解,則Vars=None。
ObjV
: 等于optPop.ObjV,此處即最優(yōu)解對(duì)應(yīng)的目標(biāo)函數(shù)值。若無(wú)可行解,ObjV=None。
CV
: 等于optPop.CV,此處即最優(yōu)解對(duì)應(yīng)的違反約束程度矩陣。若無(wú)可行解,CV=None。
startTime
: 程序執(zhí)行開(kāi)始時(shí)間。
endTime
: 程序執(zhí)行結(jié)束時(shí)間。
executeTime
: 算法 所用時(shí)間。
nfev
: 算法評(píng)價(jià)次數(shù)
gd
: (多目標(biāo)優(yōu)化且給定了理論最優(yōu)解時(shí)才有) GD指標(biāo)值。
igd
: (多目標(biāo)優(yōu)化且給定了理論最優(yōu)解時(shí)才有) IGD指標(biāo)值。
hv
: (多目標(biāo)優(yōu)化才有) HV指標(biāo)值。
spacing
: (多目標(biāo)優(yōu)化才有) Spacing指標(biāo)值。
解集:
header_regex = '|'.join(['{}'] * len(headers)) header_str = header_regex.format(*[str(key).center(width) for key, width in zip(headers, widths)]) print("=" * len(header_str)) print(header_str) print("-" * len(header_str))
gen: 進(jìn)化代數(shù)
eval:記錄評(píng)價(jià)次數(shù)
f\_opt: 當(dāng)代最優(yōu)個(gè)體的目標(biāo)函數(shù)值
f\_max=當(dāng)代種群最大函數(shù)值
f\_min 最小 f\_avg : 平均水平
f\_std: 標(biāo)準(zhǔn)約束水平
使用geatpy庫(kù)求解有向無(wú)環(huán)圖最短路
代碼【最短路】一:使用geatpy庫(kù)
import numpy as np import geatpy as ea class MyProblem(ea.Problem): # 繼承Problem父類(lèi) def __init__(self): name = 'Shortest_Path' # 初始化name(函數(shù)名稱(chēng),可以隨意設(shè)置) M = 1 # 初始化M(目標(biāo)維數(shù)) maxormins = [1] # 初始化maxormins(目標(biāo)最小最大化標(biāo)記列表,1:最小化該目標(biāo);-1:最大化該目標(biāo)) Dim = 10 # 初始化Dim(決策變量維數(shù)) varTypes = [1] * Dim # 初始化varTypes(決策變量的類(lèi)型,元素為0表示對(duì)應(yīng)的變量是連續(xù)的;1表示是離散的) lb = [0] * Dim # 決策變量下界 ub = [9] * Dim # 決策變量上界 lbin = [1] * Dim # 決策變量下邊界 1表示閉合區(qū)間,0表示開(kāi)區(qū)間 ubin = [1] * Dim # 決策變量上邊界 # 調(diào)用父類(lèi)構(gòu)造方法完成實(shí)例化 ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin) # 設(shè)置每一個(gè)結(jié)點(diǎn)下一步可達(dá)的結(jié)點(diǎn)(結(jié)點(diǎn)從1開(kāi)始數(shù),因此列表nodes的第0號(hào)元素設(shè)為空列表表示無(wú)意義) self.nodes = [[], [2, 3], [3, 4, 5], [5, 6], [7, 8], [4, 6], [7, 9], [8, 9], [9, 10], [10]] # 設(shè)置有向圖中各條邊的權(quán)重 self.weights = {'(1, 2)': 36, '(1, 3)': 27, '(2, 4)': 18, '(2, 5)': 20, '(2, 3)': 13, '(3, 5)': 12, '(3, 6)': 23, '(4, 7)': 11, '(4, 8)': 32, '(5, 4)': 16, '(5, 6)': 30, '(6, 7)': 12, '(6, 9)': 38, '(7, 8)': 20, '(7, 9)': 32, '(8, 9)': 15, '(8, 10)': 24, '(9, 10)': 13} def decode(self, priority): # 將優(yōu)先級(jí)編碼的染色體解碼得到一條從節(jié)點(diǎn)1到節(jié)點(diǎn)10的可行路徑 edges = [] # 存儲(chǔ)邊 path = [1] # 結(jié)點(diǎn)1是路徑起點(diǎn) while not path[-1] == 10: # 開(kāi)始從起點(diǎn)走到終點(diǎn) currentNode = path[-1] # 得到當(dāng)前所在的結(jié)點(diǎn)編號(hào) nextNodes = self.nodes[currentNode] # 獲取下一步可達(dá)的結(jié)點(diǎn)組成的列表 chooseNode = nextNodes[np.argmax( priority[np.array(nextNodes) - 1])] # 從NextNodes中選擇優(yōu)先級(jí)更高的結(jié)點(diǎn)作為下一步要訪問(wèn)的結(jié)點(diǎn),因?yàn)榻Y(jié)點(diǎn)從1數(shù)起,而下標(biāo)從0數(shù)起,因此要減去1 path.append(chooseNode) edges.append((currentNode, chooseNode)) return path, edges def aimFunc(self, pop): # 目標(biāo)函數(shù) pop.ObjV = np.zeros((pop.sizes, 1)) # 初始化ObjV for i in range(pop.sizes): # 遍歷種群的每個(gè)個(gè)體,分別計(jì)算各個(gè)個(gè)體的目標(biāo)函數(shù)值 priority = pop.Phen[i, :] path, edges = self.decode(priority) # 將優(yōu)先級(jí)編碼的染色體解碼得到訪問(wèn)路徑及經(jīng)過(guò)的邊 pathLen = 0 for edge in edges: key = str(edge) # 根據(jù)路徑得到鍵值,以便根據(jù)鍵值找到路徑對(duì)應(yīng)的長(zhǎng)度 if not key in self.weights: raise RuntimeError("Error in aimFunc: The path is invalid. (當(dāng)前路徑是無(wú)效的。)", path) pathLen += self.weights[key] # 將該段路徑長(zhǎng)度加入 pop.ObjV[i] = pathLen # 計(jì)算目標(biāo)函數(shù)值,賦值給pop種群對(duì)象的ObjV屬性 ## 執(zhí)行腳本 if __name__ == "__main__": # 實(shí)例化問(wèn)題對(duì)象 problem = MyProblem() # 構(gòu)建算法 algorithm = ea.soea_EGA_templet(problem, ea.Population(Encoding='RI', NIND=4), MAXGEN=10, # 最大進(jìn)化代數(shù) logTras=1) # 表示每隔多少代記錄一次日志信息 # 求解 res = ea.optimize(algorithm, verbose=True, drawing=1, outputMsg=False, drawLog=False, saveFlag=True, dirName='result') print('最短路程為:%s' % (res['ObjV'][0][0])) print('最佳路線為:') best_journey, edges = problem.decode(res['Vars'][0]) for i in range(len(best_journey)): print(int(best_journey[i]), end=' ') print()
關(guān)于“Python遺傳算法Geatpy工具箱怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Python遺傳算法Geatpy工具箱怎么用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。