Pygmo2:进化过程中群岛之间的迁移

时间:2018-03-15 01:27:10

标签: python optimization parallel-processing pygmo

我尝试使用Python库 Pygmo2 https://esa.github.io/pagmo2/index.html)来并行化优化问题。

据我了解,可以使用群岛群岛实现并行化(在本例中为 mp_island )。

作为一个最小的工作示例,官方网站的其中一个教程可以提供:https://esa.github.io/pagmo2/docs/python/tutorials/using_archipelago.html

我提取了代码:

class toy_problem:
    def __init__(self, dim):
        self.dim = dim

    def fitness(self, x):
        return [sum(x), 1 - sum(x*x), - sum(x)]

    def gradient(self, x):
        return pg.estimate_gradient(lambda x: self.fitness(x), x)

    def get_nec(self):
        return 1

    def get_nic(self):
        return 1

    def get_bounds(self):
        return ([-1] * self.dim, [1] * self.dim)

    def get_name(self):
        return "A toy problem"

    def get_extra_info(self):
        return "\tDimensions: " + str(self.dim)

import pygmo as pg
a_cstrs_sa = pg.algorithm(pg.cstrs_self_adaptive(iters=1000))
p_toy = pg.problem(toy_problem(50))
p_toy.c_tol = [1e-4, 1e-4]
archi = pg.archipelago(n=32,algo=a_cstrs_sa, prob=p_toy, pop_size=70)

print(archi)
archi.evolve()
print(archi)

查看旧版本库(http://esa.github.io/pygmo/documentation/migration.html)的文档,岛之间的迁移似乎是岛并行化模型的基本特征。 另外,据我所知,如果没有它,优化算法(如进化算法)就无法运作。

但是,在 Pygmo2 的文档中,我无法找到如何执行迁移。

它是在群岛中自动发生的吗?

是否依赖于所选算法?

是否尚未在 Pygmo2 中实现?

关于此的文档是否遗失或者我没找到它?

有人可以启发我吗?

3 个答案:

答案 0 :(得分:1)

迁移框架还没有从pagmo1完全移植到pagmo2。这里有一个长期的公关开放:

https://github.com/esa/pagmo2/pull/102

我们将在未来几个月内完成迁移框架的实施,希望在夏季开始之前。

答案 1 :(得分:0)

恕我直言, PyGMO2/pagmo 文档确认 migration 功能存在。

  

archipelago 类是pygmo的主要并行化引擎。它本质上是 island 的容器,能够在每个 island中启动 evolution (优化任务) 异步同时跟踪结果和之间的信息交换(迁移 ......

除了thread_island - s(其中可能发生一些自动推理并强制执行线程安全的UDI-s),所有其他 island 类型 - { mp_island | ipyparallel_island } -s确实创建了与GIL无关的并行形式,但计算是通过异步操作的 .evolve() 方法执行的/ p>

在原始PyGMO中, archipelago 类是自动.__init__() - 使用属性topology = unconnected()编辑,除非明确指定,如< strong> PyGMO ,为archipelago.__init__()方法设置了一个调用接口元组(仅显示匹配的一个)

 __init__( <PyGMO.algorithm> algo,
           <PyGMO.problem>   prob,
           <int>             n_isl,
           <int>             n_ind [, topology            = unconnected(),
                                      distribution_type   = point_to_point,
                                      migration_direction = destination
                                      ]
           )

但是,补充一点,可以重新定义默认值,以便满足一个人的PyGMO进化过程偏好:

topo = topology.erdos_renyi( nodes = 100,
                             p     = 0.03
                             )              # Erdos-Renyi ( random ) topology

enter image description here


设置一个具有老化顶点图拓扑的ClusteredBarabási-Albert:

topo = topology.clustered_ba( m0    =    3,
                              m     =    3,
                              p     =    0.5,
                              a     = 1000,
                              nodes =    0
                              )            # clustered Barabasi-Albert,
   #                                       # with Ageing vertices topology

enter image description here

或:

topo = topology.watts_strogatz( nodes = 100,
                                p     =   0.1
                                )             # Watts-Strogatz ( circle
                                              #                + links ) topology

enter image description here

最后,通过赋值将其设置为class-instance属性:

archi = pg.archipelago( n        = 32,
                        algo     = a_cstrs_sa,
                        prob     = p_toy,
                        pop_size = 70
                        )              # constructs an archipelago
archi.topology = topo                  # sets the topology to the
#                                      # above selected, pre-defined <topo>

答案 2 :(得分:0)

pagmo2从v2.11开始实施迁移,PR已完成并合并到master中。 pagmo1.x中存在的几乎所有功能都将还原。将来我们仍将添加更多拓扑,但是它们已经可以手动实现。在此处参考文档:https://esa.github.io/pagmo2/docs/cpp/cpp_docs.html

缺少教程和示例,将在不久的将来添加(欢迎帮助)