1

在使用pygmo2 simulated_annealing()算法时archipelago,我发现似乎只有最初的冠军进化了,其他所有岛屿都保持不变。

考虑以下测试用例:

archi=pg.archipelago(n=1,algo=pg.de(),pop_size=10,prob=pg.rosenbrock(10),seed=32)
archi[0].get_population().get_f()
array([[ 1444075.45],
   [  769751.435],
   [ 1539132.29],
   [  867545.07],
   [ 1139524.14],
   [ 1294374.29],
   [ 1313308.78],
   [ 1402739.85],
   [ 1734627.42],
   [ 1329435.20]])

archi.evolve(); archi.wait()
archi[0].get_population().get_f()
array([[ 1444075.45],
   [  754109.13],
   [  946288.71],
   [  409444.50],
   [ 1139524.14],
   [ 1216399.25],
   [ 1313308.78],
   [ 1402739.85],
   [  834097.30],
   [  173612.94]])

但如果我使用 运行相同algo=pg.simulated_annealing(),那么初始的 population_f 为

array([[ 1408097.05],
   [ 1765715.34],
   [ 1547757.08],
   [ 1851529.02],
   [  440838.40],
   [ 1673630.76],
   [  867374.45],
   [ 2636693.48],
   [ 1809012.67],
   [  650619.19]])

成为,在一次调用之后evolve()

array([[  1408097.05],
   [  1765715.34],
   [  1547757.08],
   [  1851529.02],
   [  2.15709202],
   [  1673630.76],
   [  867374.45],
   [  2636693.48],
   [  1809012.67],
   [  650619.19]])

请注意,只有开始时适应度最小的岛才是唯一进化的岛。这发生在不同的问题、不同的算法和不同数量的岛屿上。看起来像一个错误?

4

1 回答 1

0

从开发人员那里得到这个:

这里没有什么奇怪的。一切都是预期的行为。

使用群岛和上面详述的算法存在几个问题。

如果您将群岛与 pg.de 和 pop_size=1 一起使用,则“发生错误”是意料之中的,因为 de 是基于人口的算法,并且至少需要大小为 4 的人口。

当群岛在岛上引发错误时,您可以通过调用 wait_check 方法检查这些异常。请参阅https://esa.github.io/pagmo2/docs/python/tutorials/using_archipelago.html#managing-exceptions。如果你这样做,你会看到例外很可能是“de需要至少4个人......”

模拟退火不是基于种群的,并且如文件所述,仅进化种群中的一个选定个体。这就是上面的代码显示的内容。

“注意只有适应度最小的岛”应该是“注意只有适应度最小的染色体”->这是sa应该做的。

“大多数适应度向量都使用 pg.de() 改变”-> 这也是 de 的预期行为。由于用户只进化了一代(使用默认参数)

于 2018-03-17T18:57:51.607 回答