Python 俾格莫2:进化过程中群岛间的迁移
我试图使用Python库Pygmo2()来并行化一个优化问题 据我所知,并行化可以通过群岛(在本例中为mp_岛)实现 作为一个简单的工作示例,来自官方网站的其中一个教程可用于: 我提取了代码: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
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>