1. 程式人生 > >gaetpy庫模板sga_new_permut_templet簡單應用

gaetpy庫模板sga_new_permut_templet簡單應用

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_new_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 秒

1