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

Pygmo2: migration between islands in an archipelago during evolution

我正在尝试使用 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还没有实现吗?

关于此的文档是否丢失,或者我只是没有找到它?

谁能赐教一下?

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

The archipelago class is the main parallelization engine of pygmo. It essentially is a container of island able to initiate evolution (optimization tasks) in each island asynchronously while keeping track of the results and of the information exchange (migration) between the tasks ...

除了 thread_island-s(其中可能会发生一些自动推理并为 thread-safe UDI-s 强制执行),所有其他 island 类型 - { mp_island | ipyparallel_island }-s 确实创建了 GIL-independent 形式的并行性,但计算是通过 async-operated .evolve() 方法

在原始 PyGMO 中,archipelago class 是自动 .__init__()-ed 属性 topology = unconnected() ,除非明确指定,如 PyGMO 中所述,archipelago.__init__() 方法 有一个 call-interfaces 的元组(仅显示匹配一):

 __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


设置 Clustered Barabási-Albert,具有老化顶点图拓扑:

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

或:

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

最后,通过赋值将其设置到 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>

迁移框架还没有完全从 pagmo1 移植到 pagmo2。这里有一个 long-standing PR:

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

我们将在接下来的几个月内完成迁移框架的实施,希望能在夏初完成。

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

缺少教程和示例,将在近期添加(欢迎帮助)