Skip to main content

PyPI 包包含进化算法的对立学习算子和种群初始化器

项目描述

反对学习算子和种群初始化器

PyPI 版本 下载 下载 下载

在 https://gitter.im/opp-op-pop-init/community 加入聊天

OPP定位学习OP erators和POP ulation INIT ializers 是 Python 包,其中包含进化算法的对立学习算子和种群初始化器。

安装

pip install OppOpPopInit

或者

pip3 install OppOpPopInit

关于反对派运营商

在几种进化算法中,创建与当前人口的某些部分相反的对面以更好地探索搜索空间可能很有用。通常它用于搜索过程的乞求(第一次种群初始化)和每隔几代以递减的概率F。此外,最好从人群中创造出更糟糕的物体的对立面。有关更多信息,请参阅本文

这个包提供了几个用于创建反对派的算子(反对派算子)和使用不同分布函数和反对派算子为每个维度创建起始人口的方法!

进口

你可以从这个包中导入什么:

from OppOpPopInit import OppositionOperators # available opposition operators as static class
from OppOpPopInit import SampleInitializers  # available population initializers as static class

# main function which creates random population
# using initializers and oppositors
from OppOpPopInit import init_population 

还有一个用于绘制图片的小模块,如下所示

import OppOpPopInit.plotting

接口协议

边框

在数学优化任务的整个部分中,可能解决方案的最佳皮肤是使用变量的一维向量(x1, x2, ..., xn),其中每个变量x都可以来自某个区域[xmin, xmax]genericalgorithm2 包和这个包都针对这种情况。

因此,这里的许多函数都接受参数minimumsmaximums这意味着每个使用维度的可用区域的下限和上限(边界)。minimums并且maximums应该是整数或实数序列或只有一个数字,但它们不能都是数字,如果它们都是序列,它们必须具有相同的长度。

创作者反对者的格式

创建者是创建随机样本的函数(取决于边界)。在代码中,创建者可以是任何可以调用的对象,例如带有签名() -> np.ndarray( Callable[[], np.ndarray]) 的函数。

反对者是获取np.ndarray样本并将其相反形式返回为np.ndarray. 因此,如果对象可以像(np.ndarray) -> np.ndarray( Callable[[np.ndarray], np.ndarray]) 一样调用,则在代码中是一个反对者。

可用的反对派运营商

清单

* OppositionOperators.Continual.abs * OppositionOperators.Continual.modular * OppositionOperators.Continual.quasi * OppositionOperators.Continual.quasi_reflect * OppositionOperators.Continual.over * OppositionOperators.Continual.Partial-- 用于对搜索区域的每个子集使用多个反对运算符。* OppositionOperators.Discrete.integers_by_order-- 类似于abs运算符,但用于整数值

* OppositionOperators.CombinedOppositor-- 用于对具有连续或混合任务的每个维度使用现有的对立运算符。请参阅下面的示例

你可以使用模式创建自己的反对者:

def oppositor(sample: np.ndarray) -> np.ndarray:
  # some code
  return new_sample

还有用于非常特殊的离散任务OppositionOperators.Discrete._index_by_orderOppositionOperators.Discrete.value_by_order构造函数,具有可用的有效值集(如[-1, 0, 1, 5, 15]),但强烈建议将此任务转换为索引数组任务(并使用OppositionOperators.Discrete.integers_by_order),如下所示:

# available values
vals = np.array([1, 90. -45, 3, 0.7, 3.4, 12])

valid_array_example = np.array([1, 1, 1, 3, -45])

# function
def optimized_func(arr: np.ndarray) -> float:
    #some code
    return result

# recommented way for optimization algorithm
indexes = np.arange(vals.size)

def new_optimized_functio(new_arr):
    arr = np.array([vals[i] for i in new_arr])
    return optimized_func(arr)

# and forth u are using indexes format for your population

print(
  new_optimized_functio(
    np.array([0, 0, 1, 4])
  )
)

例子

abs反对者

代码

modular反对者

代码

quasi反对者

代码

quasi_reflect反对者

代码

over反对者

代码

integers_by_order反对者

代码

更多示例

代码

部分/联合反对者

如果你想对一个维度子集使用一些反对者(例如索引 0、1、3)和其他子集的其他反对者(例如索引 2、4、5) - 你需要创建PartialCombined反对者。它们之间的区别在于,您需要现有的反对者与他们制作组合反对者,而您需要反对者制造者来制作部分反对者。因此,Partialoppositor 通常更易于使用,但Combined更灵活。

要创建Combined反对者,请使用如下代码:

oppositor = OppositionOperators.CombinedOppositor(
  [
    (sequece of indexes to apply, oppositor_for_this_dimentions),
    (sequece of indexes to apply, oppositor_for_this_dimentions),
    ...
    (sequece of indexes to apply, oppositor_for_this_dimentions)
  ]
)

要创建Partial反对者使用代码:

oppositor = OppositionOperators.PartialOppositor(
    minimums=minimumns,
    maximums=maximums,
    indexes_to_opp_creator=[
        (sequece of indexes to apply, oppositor_creator),
        (sequece of indexes to apply, oppositor_creator)
    ]
)

例子:

import numpy as np
from OppOpPopInit import OppositionOperators

# 5 dim population

min_bound = np.array([-8, -3, -5.7, 0, 0])
max_bound = np.array([5, 4, 4, 9, 9])

# population points
points = np.array([
  [1, 2, 3, 4, 7.5],
  [1.6, -2, 3.9, 0.4, 5],
  [1.1, 3.2, -3, 4, 5],
  [4.1, 2, 3, -4, 0.5]
])

# saved indexes for oppositors
first_op_indexes = np.array([0, 2])
second_op_indexes = np.array([1, 3])

oppositor = OppositionOperators.CombinedOppositor(
  [
    (first_op_indexes, OppositionOperators.Continual.abs(
      minimums=min_bound[first_op_indexes],
      maximums=max_bound[first_op_indexes],
    )),
    (second_op_indexes, OppositionOperators.Continual.over(
      minimums=min_bound[second_op_indexes],
      maximums=max_bound[second_op_indexes],
    ))
  ]
)

# or 

oppositor = OppositionOperators.PartialOppositor(
    minimums=min_bound,
    maximums=max_bound,
    indexes_to_opp_creator=[
        (first_op_indexes, OppositionOperators.Continual.abs),
        (second_op_indexes, OppositionOperators.Continual.over)
    ]
)

# as u see, it's not necessary to oppose population by all dimensions, here we won't oppose by last dimension

oppositions = OppositionOperators.Reflect(points, oppositor)

print(oppositions)

# array([[-4.        ,  1.84589799, -4.7       ,  5.04795851,  7.5       ],
#       [-4.6       , -0.74399971, -5.6       ,  7.49178902,  5.        ],
#       [-4.1       ,  0.54619162,  1.3       ,  6.14214043,  5.        ],
#       [-7.1       , -2.59648698, -4.7       ,  0.95770904,  0.5       ]])

另一个示例代码

RandomPartialOppositor

该软件包最令人惊奇的功能之一是RandomPartialOppositor. 它允许您将多个反对者应用于维度区域的随机子集,并在应用后进行一些计数后更改这些子集。这意味着您只能将一个此反对者应用于多个样本并获得结果,就像您将几个部分反对者应用于此样本的一部分一样。

RandomPartialOppositor使用此结构创建反对者:

oppositor = OppositionOperators.RandomPartialOppositor(
    [
        (count_of_random_dimensions, repeate_config_during_steps, avalable_indexes, oppositor_creator),
        (count_of_random_dimensions, repeate_config_during_steps, avalable_indexes, oppositor_creator),
        ...
        (count_of_random_dimensions, repeate_config_during_steps, avalable_indexes, oppositor_creator)
    ],
    minimums,
    maximums
)

查看最简单的使用示例

反射法

用于使用OppositionOperators.Reflect(samples, oppositor)一些反对者反对样本数组。samples这里的参数是具有大小样本*维度的二维数组。

最佳选择的反思

有一种OppositionOperators.ReflectWithSelectionBest(population_samples, oppositor, eval_func, samples_scores = None, more_is_better = False)方法可以反映人口(大小)并从现有对象中N选择最佳对象。它有参数:N2N

  • population_samples: 2D numpy 数组;反映人口。
  • oppositor: 功能; 申请反对者。
  • eval_func: 功能; 人口/任务的优化功能。
  • samples_scores: None/1D numpy 数组,可选;反映人口的分数(如果计算 - 没有必要再次计算)。默认值为None.
  • more_is_better:逻辑的,可选的;目标——最大化功能。默认值为False.

查看示例

人口初始化器

简单随机种群

就像oppositors operators有一些构造函数用于创建起始人口的创建者:

  • SampleInitializers.RandomInteger(minimums, maximums)-- 返回函数,它将返回和之间的随机整数minimums向量maximums
  • SampleInitializers.Uniform(minimums, maximums)-- 返回函数,它将返回均匀分布之间的随机向量minimumsmaximums来自均匀分布的随机向量
  • SampleInitializers.Normal(minimums, maximums, sd = None)-- 返回函数,它将返回正态分布之间的随机向量minimumsmaximums来自正态分布的随机向量

你可以创建你的初始化函数:

def func() -> np.ndarray:
    # code
    return valid_sample_array 

还可以为每个维度子集SampleInitializers.Combined(minimums, maximums, indexes, creator_initializers)生成具有不同构造函数的总体!

用于使用. creator_kSampleInitializers.CreateSamples(creator, k)

RandomInteger

代码

Uniform

代码

Normal

代码

Mixed

代码

反对的人群

用于init_population(total_count, creator, oppositors = None)创建一定大小的种群,total_count其中一些对象是由构建的,creator而其他对象是通过将每个反对者应用oppositors到起始对象来构建的。

代码

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

OppOpPopInit-2.0.0.tar.gz (13.5 kB 查看哈希

已上传 source

内置分布

OppOpPopInit-2.0.0-py3-none-any.whl (15.0 kB 查看哈希

已上传 py3