超级简单的python遗传算法库。
primordialooze的Python项目详细描述
原始渗出物
python的简单遗传算法库
文档如下。
模拟
遗传算法模拟。一般工作流程如下:
importprimordialoozeaspoimportpandasimportmatplotlib.pyplotsim=po.Simulation(nagents,shape,fitnessfunction)bestagent,fitness=sim.run()print("The agent {} has the best fitness, which is: {}".format(bestagent,fitness))# Dump and plotfname="stats.csv"sim.dump_history_csv(fname)df=pandas.read_csv(fname)df=df.drop(['GenerationIndex'],axis=1)df.plot()plt.show()
统计
simulation类存储一个列表statistics
,其中包含类statistics
的实例。
统计信息类包含以下属性:
generationidx
,这是一个基于零的索引,指示此统计信息
实例用于哪个生成。maxval
,这是这一代人的最高健身分数。minval
,这是这一代人的最低健身分数。avgval
,这是这一代人的平均健身分数。
Simulation类还存储一个列表,其中包含每一代中最好的代理。
初始化
def__init__(self,population,shape,fitnessfunc,*,seedfunc=None,selectionfunc=None,crossoverfunc=None,mutationfunc=None,elitismfunc=None,nworkers=0,max_agents_per_generation=None,min_agents_per_generation=None)
参数
以下列表包含所需的参数。它们没有默认值 因为根据问题的不同,这些值会有很大的变化。
- 总体:第一代代理的数量。我们会产生这么多的代理
在初始生成中,每个都是一个numpy数组shape=
shape
。 它们将根据mutationfunc
进行变异,并对每一代进行评估 通过fitnessfunc
- 形状:总体中每个代理的形状。一定是这样的单子。特工的形状
必须是任意长度的1D数组,如
(7,)
- fitnessfunc:用于评估生成中每个代理的适合度的函数。
必须有签名:
fitnessfunc(代理)->;标量浮点
。这个函数 将在每一代对基因库中的每一种试剂进行评估。 如果这个函数很慢,那么使用多处理可能是有意义的,除非 基因库相当小。请参见nWorkers
关键字参数
这些参数包含(主要是)合理的默认值,但您必须确保 默认设置对您有效。您几乎肯定会想更改其中的一些以适应您的问题。
- seedfunc:用于创建第一代代理的函数。函数必须具有
形状"shape"的签名
seedfunc()->;代理程序。我们称之为这个函数
填充
次。当none
时,默认为均匀随机 在每个维度的范围内[-1.0,1.0). - selectionfunc:用于选择允许繁殖以创建
下一代。签名必须是
selectionfunc(填充、计算)->;选定的代理
, 其中population
是一个n维形状数组(Nagents,代理长度)。求值
是一个形状数组(Nagents,);求值[i]
包含population[i,:]
;所选代理的适应度值是一个n维数组 形状(选定的代理,代理长度),其中必须包含选定的代理。
并具有最高的计算值。未选择的代理 只是被丢弃,即它们不会出现在下一代(除非随机出现 作为交叉/变异的一部分重新创建)。 如果填充
和求值
预先排序,以便填充[0,:]
对应 到evalutaion[0]无
,则默认选择前10个百分点。 - 交叉函数:要使用的交叉函数。必须有签名
crossoverfunc(代理)->;新的代理
, 其中agents
是一个n维形状数组(选择的代理,代理长度)。 其中new_agents
必须是n维所有形状数组(Nagents,代理长度)。 此函数在使用选择函数确定 代理将进入新一代,此功能仅用于 选定的代理。通常,新的代理
将构成新一代的整体, 一个例外是如果使用精英主义(见下文),另一个例外是 如果突变功能将新的个体加入到基因库中,而不仅仅是突变 现有的。 如果无
,则默认为在 直到种群
代理(或者,如果elitismfunc
为none,则0.9*种群
)。 - 突变函数:用于将突变应用于基因库的函数。签名必须是
mutationfunc(agents)->;new_agents
,其中agents
是从crossoverfunc
和new_agents
必须是一个n维形状数组(nagents,agent_length)。 此函数应用于crossoverfunc
的结果。 当none
时,默认将0.05个代理中的每个值设置为随机值, 其中随机值是从平均值的高斯分布中提取的=被替换的值 标准偏差=0.25。 - elitismfunc:签名函数elitismfunc(生成索引)->;在[0.0,1.0]范围内浮动。
此函数获取生成的索引(0表示第一代,1表示第二代,等等)。
并返回表现最好的一部分,以保持对下一代的影响。
精英被复制,然后,在新的
生成是通过selectionfunc->;crossoverfunc->;mutationfunc管道创建的,它们是
重新引入基因库。这意味着如果上述管道生成100个代理
而精英主义则定为10人,新一代将由110名特工组成。如果这样
令人困惑的是,请参见
max_agents_per_generation
和min_agents_per_generation
。 当none
时,默认为一个函数,它只返回0.1(或10%)的基因库,而不管 生成。 - nWorkers:用于并行化适应度函数的进程数。这将默认为0,这将
意味着根本没有平行性。
无
将使用核心数。否则,应为正整数。 - 每一代的最大代理数:允许进入一代的最大代理数。如果选择,交叉,变异,
精英主义的职能处理不当,有可能
每代要更改的代理。虽然在某些情况下可能需要这样做,但是
通常不是。如果这个值是负的,我们会让后代变得专横
尺寸。如果非零,经过选择、交叉、变异和精英主义,我们将
只要候选人的人数不超过这个值,就把他们都带走。如果他们这样做了,
我们随机抽取这么多。
此值默认为
无
,这意味着我们使用填充
作为最大值。 - 每代最小代理数:允许生成新一代的最小代理数。如果选择,交叉,变异,
精英主义的职能处理不当,有可能
每代要更改的代理。虽然在某些情况下可能需要这样做,但是
通常不是。如果这个值是负数或零,我们将允许
缩小到零,然后模拟将停止。如果不为零,选择后,
交叉、变异和精英主义,我们将随机遍历候选代理
顺序,复制它们直到满足此值。注意,我们试图展开
在所有候选人中平均重复。
此值默认为
无
,这意味着我们使用填充
作为最小值。
defrun(self,niterations=100,fitness=None)
运行构造的模拟。
要么运行到niterations
通过,要么运行到最佳适应度fitness
或更高。
返回最佳代理及其适合度。
关键字参数
- 数值:要运行模拟的迭代次数。默认为100。如果
无
,
将使用fitness
(不能为none)。如果这和适应度都是
指定后,我们将在满足一个或另一个条件时立即停止。
- 适应度:要聚合的适应度级别。一旦一个或多个经纪人达到这个健康水平
或者更高,模拟将停止。默认为
无
。如果无
(默认值),
将使用niterations
(不能为none)。如果这和操作
指定后,我们将在满足一个或另一个条件时立即停止。
- 打印进度:如果
为真
(默认值),我们将在每次生成后打印进度指示。
返回
- 模拟结束后体能得分最高的代理。
- 此代理的适合性。
无
,
将使用fitness
(不能为none)。如果这和适应度都是
指定后,我们将在满足一个或另一个条件时立即停止。
无
。如果无
(默认值),
将使用niterations
(不能为none)。如果这和操作
指定后,我们将在满足一个或另一个条件时立即停止。
为真
(默认值),我们将在每次生成后打印进度指示。