解决20维Schwefel问题#

在本教程中,我们将使用许多不同的算法来解决20维的Schwefel问题。这样的UDP在类schwefel中编码。脚本的结果是右侧的图表,该图表将在几秒钟内生成,并报告了25次运行中一些默认实例的pygmo求解器的平均值。其余的图表展示了两组最成功算法的一些单次重复。

../_images/schwefel_20.png ../_images/sea_schwefel_20.png ../_images/sa_schwefel_20.png
>>> import pygmo as pg
>>> # The user-defined problem
>>> udp = pg.schwefel(dim = 20)
>>> # The pygmo problem
>>> prob = pg.problem(udp)

>>> # For a number of generation based algorithms we can use a similar script to run and average over 25 runs.
>>> udas = [pg.sade(gen=500), pg.de(gen=500), pg.de1220(gen=500), pg.pso(gen=500), pg.bee_colony(gen=250, limit=20)]
>>> for uda in udas: 
...     logs = []
...     for i in range(25):
...         algo = pg.algorithm(uda)
...         algo.set_verbosity(1) # regulates both screen and log verbosity
...         pop = pg.population(prob, 20)
...         pop = algo.evolve(pop)
...         logs.append(algo.extract(type(uda)).get_log())
...     logs = np.array(logs)
...     avg_log = np.average(logs,0)
...     plt.plot(avg_log[:,1],avg_log[:,2]-418.9829*20 , label=algo.get_name())

>>> # For simulated annealing, since we will be using some reannealing we have to code a different script (and we will
>>> # also not take any average for brevity)
>>> logs = []
>>> algo = pg.algorithm(pg.simulated_annealing(10, 0.01, 5))
>>> algo.set_verbosity(10)
>>> pop = pg.population(prob, 20)
>>> for i in range(5): 
...     pop = algo.evolve(pop)
...     logs.append(algo.extract(pg.simulated_annealing).get_log())
>>> for i in range(5): 
...      plt.plot([l[0]+2000*i for l in logs[i]],[l[1]-418.9829*20 for l in logs[i]],"brown")
>>> plt.plot([0,0],[1,1],"brown", label=algo.get_name()) 

>>> # For the simple evolutionary startegy we also need ad hoc code
>>> logs = []
>>> algo = pg.algorithm(pg.sea(gen = 10000))
>>> algo.set_verbosity(100)
>>> pop = pg.population(prob, 1)
>>> pop = algo.evolve(pop) 
>>> logs = algo.extract(pg.sea).get_log() 
>>> plt.plot([l[1] for l in logs],[l[2]-418.9829*20 for l in logs], label = algo.get_name()) 

>>> # We then add details to the plot
>>> plt.legend() 
>>> plt.yticks([-8000,-7000,-6000,-5000,-4000,-3000,-2000,-1000,0]) 
>>> plt.grid()