Skip to main content

超级简单的 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 查看哈希)

已上传 py3