使用类 population#
在pygmo中,population是用于存储某些问题(有时称为个体)的候选解的容器。因此,它包含一个问题和多个决策向量(染色体)以及适应度向量,每个向量都与一个唯一的ID相关联,以便进行一定程度的跟踪。
>>> import pygmo as pg
>>> prob = pg.problem(pg.rosenbrock(dim = 4))
>>> pop1 = pg.population(prob)
>>> pop2 = pg.population(prob, size = 5, seed= 723782378)
在上面的代码中,在简单导入pygmo包之后,我们首先从rosenbrock定义了一个问题,然后我们构建了两个种群(即两组候选解)。第一个种群pop1是空的,而第二个种群初始化为五个候选解,因此也导致了五次适应度评估。pop2中的候选解是在问题的边界内随机创建的,使用了作为kwarg传递的随机种子。
>>> print(len(pop1))
0
>>> print(pop1.problem.get_fevals())
0
>>> print(len(pop2))
5
>>> print(pop2.problem.get_fevals())
5
对population的全面检查是可能的,通常通过其方法或查看整个类的屏幕打印:
>>> print(pop2)
...
List of individuals:
#0:
ID: 10207561574636104601
Decision vector: [-0.777137, 7.91467, -4.31933, 5.92765]
Fitness vector: [470010]
#1:
ID: 15637512834538262525
Decision vector: [8.94985, 0.924838, 4.39905, -1.17683]
Fitness vector: [670339]
#2:
ID: 15983142956381075935
Decision vector: [-0.291054, 4.99031, 1.34008, -0.00609471]
Fitness vector: [58271.1]
#3:
ID: 9198455452901607935
Decision vector: [2.18419, -1.04727, 6.35101, 6.39632]
Fitness vector: [121365]
#4:
ID: 4553447107323210017
Decision vector: [7.50729, -1.14561, 5.98053, -3.48833]
Fitness vector: [487030]
个体,即新的候选解决方案可以通过调用其push_back()方法放入种群中:
>>> pop1.push_back(x = [0.1,0.2,0.3,0.4]) # correct size
>>> len(pop1) == 1
True
>>> pop1.problem.get_fevals() == 1
True
>>> pop1.push_back(x = [0.1,0.2,0.3]) # wrong size
Traceback (most recent call last):
File ".../lib/python3.6/doctest.py", line 1330, in __run
compileflags, 1), test.globs)
File "<doctest default[3]>", line 1, in <module>
pop1.push_back([0.1,0.2,0.3])
ValueError:
function: check_decision_vector
where: /Users/darioizzo/Documents/pagmo2/include/pagmo/problem.hpp, 1835
what: Length of decision vector is 3, should be 4
一些一致性检查由push_back()完成,例如对决策向量长度的检查。
注意
允许将超出边界框的决策向量推回种群中
上面的代码片段将触发适应度函数评估,因为决策向量总是与population中的适应度向量相关联。如果与染色体相关联的适应度向量已知,您仍然可以将其推回种群中,并通过输入以下内容避免触发适应度重新评估:
>>> pop1.push_back(x = [0.2,0.3,1.3,0.2], f = [11.2])
>>> len(pop1) == 2
True
>>> pop1.problem.get_fevals() == 1
True
在设计用户定义算法(UDAs)时,通常能够更改某些个别决策向量是非常重要的:
>>> pop1.problem.get_fevals() == 1
True
>>> print(pop1.get_x()[0])
[0.1 0.2 0.3 0.4]
>>> pop1.set_x(0, [1.,2.,3.,4.])
>>> pop1.problem.get_fevals() == 2
True
>>> print(pop1.get_f()[0])
[2705.]
>>> pop1.set_xf(0, [1.,2.,3.,4.], [8.43469444])
>>> pop1.problem.get_fevals() == 2
True
>>> print(pop1.get_f()[0])
[8.43469444]
注意
使用set_xf()方法或:func:~pygmo.population.push_back()可以避免触发适应度函数评估,但也可能向种群中注入虚假信息(即破坏问题所施加的决策向量与适应度向量之间的关系)。
可以从种群中提取出最佳个体:
>>> # The decision vector
>>> pop1.get_x()[pop1.best_idx()]
array([1., 2., 3., 4.])
>>> # The fitness vector
>>> pop1.get_f()[pop1.best_idx()]
array([8.43469444])
在种群中生活过的最佳个体,即冠军,也可以被提取为:
>>> # The decision vector
>>> pop1.champion_x
array([1., 2., 3., 4.])
>>> # The fitness vector
>>> pop1.champion_f
array([8.43469444])
注意
冠军并不一定与当前种群中的最佳个体相同,因为它实际上保留了所有曾经在种群中的过去个体的记忆。