gaetpy庫模板sga_permut_templet簡單應用
阿新 • • 發佈:2018-12-08
sga_new_permut_temple
改進的單目標程式設計模板(排列編碼)。
排列編碼即每條染色體的基因都是無重複正整數的編碼方式。
為什麼使用排列編碼
二進位制編碼和實數編碼等傳統方法在個體間交叉、變異操作中存在通道數目發生改變的侷限性。
問題
max=2*x1+3*x2;
x1+2*x2<=8;
4*x1<=16;
4*x2<=12;
程式碼(aimfuc)
import numpy as np def aimfuc(Phen, LegV): x1 = Phen[:, [0]] x2 = Phen[:, [1]] f = 2 * x1 + 3 * x2 # 約束條件 idx1 = np.where(x1 + 2 * x2 > 8)[0] idx2 = np.where(4*x1 > 16)[0] idx3 = np.where(4*x2 > 12)[0] exIdx = np.unique(np.hstack([idx1, idx2, idx3])) # 得到非可行解在種群中的下標 LegV[exIdx] = 0 # 對非可行解作出標記,使其在可行性列向量中對應的值為0 return [f, LegV]
程式碼(main)
import geatpy as ga # 獲取函式介面地址 AIM_M = __import__('aimfuc') # 引數設定 NVAR = 5 # 排列編碼的染色體長度 VarLen = 5 # 排列集合的大小,等於5表示排列集合為{1,2,3,4,5} # 呼叫程式設計模板,其中recombinStyle要設定為'xovpm',對於排列編碼問題,必須採用xovpm(部分匹配交叉)的重組方式 [pop_trace, var_trace, times] = ga.sga_permut_templet(AIM_M, 'aimfuc', None, None, NVAR, VarLen, maxormin=-1, MAXGEN=50, NIND=50, SUBPOP=1, GGAP=0.9, selectStyle='etour', recombinStyle='xovpm', recopt=0.9, pm=0.1, distribute=True, drawing=1)
結果
最優的目標函式值為:14.0
最優的控制變數值為:
4.0
2.0
5.0
1.0
3.0
有效進化代數:50
最優的一代是第 1 代
時間已過 1.1906023025512695 秒