geatpy庫模板sga_mps_real_templet簡單應用
阿新 • • 發佈:2018-12-08
sga_mps_real_templet
多種群獨立進化單目標程式設計模板(實值編碼)
問題
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] exIdx = np.unique(np.hstack([idx1])) # 得到非可行解在種群中的下標 LegV[exIdx] = 0 # 對非可行解作出標記,使其在可行性列向量中對應的值為0 return [f, LegV]
程式碼(main)
# -*- coding: utf-8 -*- """ 執行指令碼main.py 描述: 該demo是展示如何計算帶等式約束的單目標優化問題: max=2*x1+3*x2; x1+2*x2<=8; 4*x1<=16; 4*x2<=12; 其中目標函式和約束條件寫在aimfuc.py檔案中,適應度罰函式寫在罰函式檔案punishing.py中 本案例通過降維的方法,將等式約束化成了不等式約束,大大拓寬了可行解的空間,方便遺傳演算法求解 此外,本案例展示了利用多種群競爭的進化演算法模板sga_mpc_real_templet瞭解決該問題。 """ import numpy as np import geatpy as ga # 獲取函式介面地址 AIM_M = __import__('aimfuc') PUN_M = __import__('punishing') # 變數設定 x1 = [0, 4] # 自變數1的範圍 x2 = [0, 3] # 自變數2的範圍 b1 = [1, 1] # 自變數1是否包含下界 b2 = [1, 1] # 自變數2是否包含上界 ranges = np.vstack([x1, x2]).T # 生成自變數的範圍矩陣 borders = np.vstack([b1, b2]).T # 生成自變數的邊界矩陣 precisions = [4] * 2 # 在二進位制/格雷碼編碼中代表自變數的編碼精度,當控制變數是連續型時,根據crtfld參考資料,該變數只表示邊界精度,故設定為一定的正數即可 newRanges = ga.meshrng(ranges, gridnum=2) # 對控制變數範圍進行網格化,網格邊長為2 # 生成網格化後的區域描述器集合 FieldDRs = [] for i in range(len(newRanges)): FieldDRs.append(ga.crtfld(newRanges[i], borders, precisions)) # 呼叫程式設計模板 [pop_trace, var_trace, times] = ga.sga_mpc_real_templet(AIM_M, 'aimfuc', PUN_M, 'punishing', FieldDRs, problem='R', maxormin=-1, MAXGEN=100, NIND=50, SUBPOP=1, GGAP=0.9, selectStyle='tour', recombinStyle='xovdprs', recopt=0.95, pm=0.65, distribute=True, drawing=1)
結果
最優的目標函式值為:13.956462415814329
最優的控制變數值為:
4.0
1.98548747193811
有效進化代數:100
最優的一代是第 69 代
時間已過 3.666006326675415 秒