参考:geatpy库
问题描述
MAX = x+10sin(5x)+7cos(4x)
0<=x<=10
创建一个目标函数
创建一个目标函数脚本文件,保存为aimfuc.py,用于接口的实现。代码如下:
import numpy as np
def aimfuc(Phen,LegV):
x = Phen[:,[0]]
f = x + 10*np.sin(5*x) + 7*np.cos(4*x)
return [f,LegV]
使用sga_new_code_templet模板进行求解
代码如下:
import numpy as np
import geatpy as ga
AIM_M = __import__('aimfuc')
x=[0,10] #变量范围
b=[1,1] #变量是否包含边界,1是,0不是。此处包含上下边界
codes=[0] #编码方式0,使用标准二进制编码
precisions=[4] #精度,小数点后4位
scales=[0] #刻度方式0,算数刻度
ranges=np.vstack([x]).T #变量范围,两行,每一列代表一个变量,第一行代表变量的上界,第二行代表变量的下界
borders=np.vstack([b]).T #变量是否,两行,每一列代表一个变量,第一行代表变量的上界,第二行代表变量的下界
fieldd=ga.crtfld(ranges,borders,precisions,codes,scales) #区域描述器
[pop_trace,var_trcae,times]=ga.sga_new_code_templet(AIM_M,'aimfuc',None,None,fieldd,problem='R',maxormin=-1,MAXGEN=100,NIND=50,SUBPOP=1,GGAP=0.65,selectStyle='sus',recombinStyle='xovdp',recopt=None,pm=0.05,distribute=True,drawing=1)
sga_new_code_templet模板调用格式(来自源码)
调用格式sga_new_code_templet(AIM_M, AIM_F, PUN_M, PUN_F, FieldD, problem, maxormin, MAXGEN, NIND, SUBPOP, GGAP, selectStyle, recombinStyle, recopt, pm, distribute, drawing = 1)
输入参数:
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 - 进化所用时间
运行结果