超级简单的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是从 crossoverfuncnew_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_generationmin_agents_per_generation。 当none时,默认为一个函数,它只返回0.1(或10%)的基因库,而不管 生成。
  • nWorkers:用于并行化适应度函数的进程数。这将默认为0,这将 意味着根本没有平行性。将使用核心数。否则,应为正整数。
  • 每一代的最大代理数:允许进入一代的最大代理数。如果选择,交叉,变异, 精英主义的职能处理不当,有可能 每代要更改的代理。虽然在某些情况下可能需要这样做,但是 通常不是。如果这个值是负的,我们会让后代变得专横 尺寸。如果非零,经过选择、交叉、变异和精英主义,我们将 只要候选人的人数不超过这个值,就把他们都带走。如果他们这样做了, 我们随机抽取这么多。 此值默认为,这意味着我们使用填充作为最大值。
  • 每代最小代理数:允许生成新一代的最小代理数。如果选择,交叉,变异, 精英主义的职能处理不当,有可能 每代要更改的代理。虽然在某些情况下可能需要这样做,但是 通常不是。如果这个值是负数或零,我们将允许 缩小到零,然后模拟将停止。如果不为零,选择后, 交叉、变异和精英主义,我们将随机遍历候选代理 顺序,复制它们直到满足此值。注意,我们试图展开 在所有候选人中平均重复。 此值默认为,这意味着我们使用填充作为最小值。
< h3 >运行< /H3>
defrun(self,niterations=100,fitness=None)

运行构造的模拟。

要么运行到niterations通过,要么运行到最佳适应度fitness或更高。 返回最佳代理及其适合度。

关键字参数
  • 数值:要运行模拟的迭代次数。默认为100。如果将使用fitness(不能为none)。如果这和适应度都是 指定后,我们将在满足一个或另一个条件时立即停止。
  • 适应度:要聚合的适应度级别。一旦一个或多个经纪人达到这个健康水平 或者更高,模拟将停止。默认为。如果(默认值), 将使用niterations(不能为none)。如果这和操作 指定后,我们将在满足一个或另一个条件时立即停止。
  • 打印进度:如果为真(默认值),我们将在每次生成后打印进度指示。

返回

  • 模拟结束后体能得分最高的代理。
  • 此代理的适合性。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Apache Flink外部Jar   创建和强制转换对象数组时发生java错误   Java,添加数组   具有相同包结构和类的java JAR   java Jenkins未能构建Maven项目   java为什么一个forloop比另一个更快,尽管它们做的“一样”?   servlets在将“/”站点迁移到Java EE包时处理contextpath引用   无法解析java MavReplugin:2.21或其某个依赖项   泛型如何编写比较器来泛化Java中的两种类型的对象?   java Android Emulator未在netbeans上加载   多线程Java使用线程对数组中的数字求和:在同步块中使用新变量作为锁:差异   java如何在JSP/servlet中设置<input>标记的值?