1. 程式人生 > 實用技巧 >現代優化演算法——遺傳演算法

現代優化演算法——遺傳演算法

簡介

GA:根據群體搜尋技術,根據適者生存原則逐代進化,最終得到最優解或準最優解。

需要的操作

  • 產生初始群體
  • 求每個個體適應度,選擇優良個體
  • 父代優良個體兩兩配對,隨機交叉染色體基因並隨機變異某些染色體基因生成子代群體(變異操作是基於交叉後的染色體種群)

實現方法

  • 確定可行解域,確定編碼方法,用字串或數值串(基因序列)表示可行解域中的每一個解
  • 適應度函式度量每個解的好壞
  • 確定進化引數:群體規模M,交叉概率$p_c$,變異概率$p_m$,進化終止條件

分析

在傳統的遺傳演算法中:

  • 變異操作在交叉操作的基礎上進行,強調交叉作用,變異只是一個生物學機制;
  • 交叉操作中,常採用單點交叉/段交叉(隨機產生交叉位置),多點交叉,均勻交叉;
  • 變異操作中,變異運算元用 高斯分佈的隨即變異實現。

改進

  • 將變異操作從交叉操作中分離出來,使其成為並列於交叉操作的產生子代的尋優操作;
  • 交叉操作中,父代配對的個體採用“門當戶對”原則(排序,較優對較優),混沌序列確定交叉點,單點交叉;
  • 變異操作中,混沌序列確定變異染色體及變異位置。

使用方法


參考blog

使用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演算法箱演算法模板: