Python 俾格莫2:进化过程中群岛间的迁移

Python 俾格莫2:进化过程中群岛间的迁移,python,optimization,parallel-processing,pygmo,Python,Optimization,Parallel Processing,Pygmo,我试图使用Python库Pygmo2()来并行化一个优化问题 据我所知,并行化可以通过群岛(在本例中为mp_岛)实现 作为一个简单的工作示例,来自官方网站的其中一个教程可用于: 我提取了代码: class toy_problem: def __init__(self, dim): self.dim = dim def fitness(self, x): return [sum(x), 1 - sum(x*x), - sum(x)] de

我试图使用Python库Pygmo2()来并行化一个优化问题

据我所知,并行化可以通过群岛(在本例中为mp_岛)实现

作为一个简单的工作示例,来自官方网站的其中一个教程可用于:

我提取了代码:

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)
查看旧版本库()的文档,孤岛之间的迁移似乎是孤岛并行化模型的一个基本特性。 而且,据我所知,像进化算法这样的优化算法离不开它

然而,在Pygmo2的文档中,我找不到如何执行迁移

它是在一个群岛上自动发生的吗

它是否取决于所选的算法

它还没有在Pygmo2中实现吗

这方面的文件还没有找到,还是我没有找到


有人能给我点化一下吗?

IMHO,
PyGMO2/pagmo
文档正在确认功能的存在

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

除了
thread_island
-s(其中可能会发生一些自动推理并强制执行线程安全UDI-s)之外,所有其他
island
类型-
{mp_island | ipyparallel_island}
-s都会创建一种独立于GIL的并行形式,然而,计算是通过异步操作的
.evolve()方法执行的

在原始的
PyGMO
中,除非明确指定,否则
PyGMO
类是自动
\uuuu init\uuuu()
-ed属性
topology=unconnected()
,如
PyGMO
中所述,具有
群岛的调用接口元组(仅显示匹配项):


设置具有老化顶点的群集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

或:

最后,通过赋值将其设置到类实例属性中:

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>
archi=pg.群岛(n=32,
algo=a_cstrs_sa,
prob=p_玩具,
pop_尺寸=70
)#建造一个群岛
archi.topology=topo#将拓扑设置为
##以上选定、预定义

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


我们将在未来几个月内完成迁移框架的实施,有望在今年夏天初完成。

pagmo2从v2.11开始实施迁移,PR已经完成并合并到master中。pagmo1.x中的几乎所有功能都已恢复。我们今后仍将添加更多拓扑,但已经可以手工实现,请参见此处单据:


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

好吧,谢谢你的回答。我也读了这篇文章,但我仍然不知道我是否必须积极地为迁移做些什么,以及在迁移自动发生的情况下它到底在做什么。请通过
.evolve()进行测试
在一个孤立的
岛屿上,分别在
群岛上,解决完全相同的问题,并比较取得的结果质量和运行时间,以查看相同的问题+他们都使用的相同优化方法,但每个问题都在不同的GMO上-{resources,“topology”}生成结果在时间上确实匹配&结果的质量是否相同。
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
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>