1. 程式人生 > >geatpy - 遺傳和進化算法相關算子的庫函數(python)

geatpy - 遺傳和進化算法相關算子的庫函數(python)

1.5 docs dev strong 參考 num iss algorithm 下界

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

geatpy - 遺傳和進化算法相關算子的庫函數(python)