超级简单的 Python 遗传算法库。
项目描述
原始软泥
用于 Python 的 Dirt 简单遗传算法库
文档如下。
模拟
遗传算法模拟。一般的工作流程是:
import primordialooze as po
import pandas
import matplotlib.pyplot
sim = po.Simulation(nagents, shape, fitnessfunction)
bestagent, fitness = sim.run()
print("The agent {} has the best fitness, which is: {}".format(bestagent, fitness))
# Dump and plot
fname = "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。该类Statistics包含以下属性:
generationidx,这是从零开始的索引,指示此Statistics实例用于哪一代。maxval,这是这一代的最大适应度得分。minval,这是这一代的最低适应度得分。avgval,这是这一代人的平均适应度得分。
Simulation 类还存储了一个列表best_agents,其中包含每一代的最佳代理。
在里面
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)
精氨酸
以下列表包含所需的参数。这些没有默认值,因为这些值会根据问题发生巨大变化。
- population : 第一代代理的数量。我们将在初始生成中生成这么多代理,每个代理都是一个 shape= 的 Numpy 数组
shape。它们将根据 进行变异mutationfunc,并通过 评估每一代fitnessfunc。 - shape:总体中每个代理的形状。必须是类似列表的。代理的形状必须是任何长度的一维数组,例如
(7,). - Fitnessfunc:用于评估一代中每个代理的适应度的函数。必须有签名:
fitnessfunc(agent) -> scalar float。该功能将在每一代基因库中的每个代理上进行评估。如果这个函数很慢,那么使用多处理可能是有意义的,除非基因库非常小。见nworkers。
关键字参数
这些参数包含(大部分)合理的默认值,但您绝对应该确保这些默认值适合您。您几乎肯定会想要更改其中的一些以适应您的问题。
- seedfunc:用于创建第一代代理的函数。该函数必须具有签名
seedfunc() -> agent of shape 'shape'。我们称这个函数population为时间。时None,默认为在每个维度的 [-1.0, 1.0) 范围内均匀随机。 - selectionfunc:用于选择允许繁殖以创建下一代的代理的功能。签名必须是
selectionfunc(population, evaluations) -> selected_agents,其中population是一个n维形状数组(nagents, agent_length),evaluations是一个形状数组(nagents,);evaluations[i]包含 的适应度值population[i, :];selected_agents是一个形状为 (nagents_selected, agent_length) 的 n 维数组,其中必须包含选定的代理。population和evaluations被预先排序,使得population[0, :],对应于evalutaion[0]并具有最高的评价值。未被选中的智能体被简单地丢弃,即它们不会出现在下一代中(除非作为交叉/变异的一部分再次随机创建)。如果None,则默认选择前百分之十。 - crossoverfunc : 要使用的交叉函数。必须有签名
crossoverfunc(agents) -> new_agents,其中agents是形状的n维数组(nselected_agents,agent_length),其中new_agents必须是形状的n维数组(nagents,agent_length)。在使用选择功能确定哪些代理将进入新一代之后应用此功能,并且此功能专门用于那些选定的代理。通常,new_agents将构成整个新一代,一个例外是如果使用精英主义(见下文),另一个例外是突变功能是否将新个体添加到基因库中,而不仅仅是突变现有个体。如果None,则默认为从育种代理中随机选择的对上使用的 2 点交叉,直到population代理(或者,如果elitismfunc是 None,0.9 * population)。 - mutationfunc:用于将突变应用于基因库的函数。签名必须是
mutationfunc(agents) -> new_agents,其中agents是从返回的值,crossoverfunc并且new_agents必须是形状为 (nagents, agent_length) 的 n 维数组。此函数适用于 的结果crossoverfunc。当 时None,默认将代理的 0.05 中的每个值设置为随机值,其中随机值是从均值 = 被替换的值和标准差 = 0.25 的高斯分布中得出的。 - elitismfunc:签名函数
elitismfunc(generation_index) -> float in range [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,这意味着根本没有并行性。
None将使用核心数。否则,应该是一个正整数。 - max_agents_per_generation:允许进入一代的最大代理。如果选择、交叉、变异和精英功能处理不当,每代智能体的数量可能会发生变化。虽然在某些情况下可能需要这样做,但通常并非如此。如果这个值为负,我们将允许世代增长到任意大小。如果它是非零的,经过选择、交叉、变异和精英主义,我们将选取所有候选者,只要它们的数量不超过这个值。如果他们这样做,我们会随机抽取这么多。该值默认为
None,这意味着我们使用population最大值。 - min_agents_per_generation:允许生成新一代的最少代理。如果选择、交叉、变异和精英功能处理不当,每代智能体的数量可能会发生变化。虽然在某些情况下可能需要这样做,但通常并非如此。如果这个值是负数或零,我们将允许世代收缩到零,之后模拟将停止。如果它不为零,则在选择、交叉、变异和精英主义之后,我们将以随机顺序循环遍历候选代理,复制它们直到满足该值。请注意,我们试图在所有候选者中平均分布重复。该值默认为
None,这意味着我们使用population最小值。
跑
def run(self, niterations=100, fitness=None)
运行构建的模拟。
要么跑到niterations过去,要么跑到最佳适应度达到fitness或更高。返回最佳代理及其适应度。
关键字参数
- niterations:运行模拟的迭代次数。默认为 100。如果
None,fitness将被使用(并且不能是 None)。如果这两个都fitness指定了,我们将在满足一个或另一个条件时立即停止。 - 健身:要收敛的健身水平。只要一个或多个智能体达到此适应度或更高,模拟就会停止。默认为
None. 如果None(默认),niterations将被使用(并且不能是无)。如果niterations指定了这个和,我们将在满足一个或另一个条件时立即停止。 - printprogress:如果
True(默认),我们将在每一代之后打印一个进度指示。
退货
- 模拟结束后适应度得分最高的智能体。
- 该代理的适应度。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
内置分布
primordialooze-0.4.0-py3-none-any.whl
(12.8 kB
查看哈希)