gaetpy库模板sga_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_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 秒