我尝试使用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 中实现?
关于此的文档是否遗失或者我没找到它?
有人可以启发我吗?
答案 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
或
设置一个具有老化顶点图拓扑的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
或:
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>
答案 2 :(得分:0)
pagmo2从v2.11开始实施迁移,PR已完成并合并到master中。 pagmo1.x中存在的几乎所有功能都将还原。将来我们仍将添加更多拓扑,但是它们已经可以手动实现。在此处参考文档:https://esa.github.io/pagmo2/docs/cpp/cpp_docs.html
缺少教程和示例,将在不久的将来添加(欢迎帮助)