現代優化演算法——遺傳演算法
阿新 • • 發佈:2020-11-27
簡介
GA:根據群體搜尋技術,根據適者生存原則逐代進化,最終得到最優解或準最優解。
需要的操作
- 產生初始群體;
- 求每個個體適應度,選擇優良個體
- 父代優良個體兩兩配對,隨機交叉染色體基因並隨機變異某些染色體基因生成子代群體(變異操作是基於交叉後的染色體種群)
實現方法
- 確定可行解域,確定編碼方法,用字串或數值串(基因序列)表示可行解域中的每一個解
- 適應度函式度量每個解的好壞
- 確定進化引數:群體規模M,交叉概率$p_c$,變異概率$p_m$,進化終止條件
分析
在傳統的遺傳演算法中:
- 變異操作在交叉操作的基礎上進行,強調交叉作用,變異只是一個生物學機制;
- 交叉操作中,常採用單點交叉/段交叉(隨機產生交叉位置),多點交叉,均勻交叉;
- 變異操作中,變異運算元用 高斯分佈的隨即變異實現。
改進
- 將變異操作從交叉操作中分離出來,使其成為並列於交叉操作的產生子代的尋優操作;
- 交叉操作中,父代配對的個體採用“門當戶對”原則(排序,較優對較優),混沌序列確定交叉點,單點交叉;
- 變異操作中,混沌序列確定變異染色體及變異位置。
使用方法
使用python第三方庫geatpy,利用演算法模板進行遺傳進化求解
框架使用
示例:
程式碼
import geatpy as ea import numpy as np class MyProblem(ea.Problem): def __init__(self): name="Problem_12.1" # 問題名稱 M=1 # 目標維度 maxormins=[1] # 目標最小最大化標記,1:最小化該目標;-1:最大化該目標 Dim=2 # 決策變數維度 varTypes=[0]*Dim # 決策變數型別,0:連續性;1:離散型 lb=[-100]*Dim # 決策變數下界 ub=[100]*Dim # 決策變數上界 lbin=[1]*Dim # 是否包括決策變數上界 ubin=[1]*Dim # 是否包括決策變數下界 # 呼叫父類構造方法完成例項化 ea.Problem.__init__(self,name,M,maxormins,Dim,varTypes,lb,ub,lbin,ubin) def aimFunc(self,pop): # 目標函式 x1=pop.Phen[:,[0]] x2=pop.Phen[:,[1]] f=(x1-2)**2+(x2-1)**2 CV1=-x1+2*x2-1 CV2=-x1*x1/4+x2*x2-1 CV=np.hstack((CV1,CV2)) pop.CV=CV # 約束矩陣(注意<=0表示滿足,越大越不滿足) pop.ObjV=f # 目標函式 # 例項化問題變數 problem=MyProblem() '''----------------------種群設定--------------------------------------''' Encoding='BG' # 編碼方式,BG表示二進位制/格雷編碼 NIND=100 # 種群規模 Field=ea.crtfld(Encoding,problem.varTypes,problem.ranges,problem.borders) # 區域描述器 population=ea.Population(Encoding,Field,NIND) #生成初始種群 '''-----------------------演算法模板呼叫------------------------------------''' myAlgo=ea.soea_EGA_templet(problem,population)# 例項化演算法模板物件 myAlgo.MAXGEN=200 # 最大進化代數 myAlgo.logTras=1 #每隔多少代記錄日誌,0表示不記錄 myAlgo.verbose=True # 是否列印日誌資訊 myAlgo.drawing=1 # 繪圖方式,1:繪製結果圖 2:繪製目標空間過程動畫 3:繪製決策空間過程動畫 ''''----------------------呼叫演算法模板進行種群進化------------------------------''' [BestIndi, population]=myAlgo.run() # 執行演算法模板,得到最優個體及最後一代種群 BestIndi.save() # 儲存最優個體資訊至檔案 '''--------------------------輸出結果----------------------------------------''' print('用時:%f 秒' % myAlgo.passTime) print('評價次數:%d 次' % myAlgo.evalsNum) if BestIndi.sizes != 0: print('最優的目標函式值為:%s' % BestIndi.ObjV[0][0]) print('最優的控制變數值為:') for i in range(BestIndi.Phen.shape[1]): print(BestIndi.Phen[0, i]) else: print("未找到可行解")
執行結果
用時:0.145813 秒
評價次數:19801 次
最優的目標函式值為:5.92308989399086e-10
最優的控制變數值為:
1.9999990463252288
0.9999756812933356
分析
geatpy演算法箱演算法模板: