3

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

是否缺少有关此的文档,或者我只是没有找到它?

有人可以启发我吗?

4

3 回答 3

1

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

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

于 2019-10-01T22:00:22.437 回答
0

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

该类archipelagopygmo. 它本质上是一个容器,能够在每个异步中启动进化(优化任务),同时跟踪结果和任务之间的信息交换(迁移 ......island island

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

在最初PyGMOarchipelago该类是.__init__()使用属性自动编辑的topology = unconnected(),除非明确指定,如文档中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

在此处输入图像描述


设置具有老化顶点图拓扑的集群 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>
于 2018-03-15T07:26:35.293 回答
0

迁移框架尚未完全从 pagmo1 移植到 pagmo2。这里有一个长期存在的 PR:

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

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

于 2018-03-16T12:26:21.193 回答