在CEC2006问题上进行扩展蚁群优化的基准测试#

在本教程中,我们将展示如何使用pygmo运行gaco算法,并使用在加拿大温哥华举行的CEC-06约束实参数优化特别会议上使用的测试问题套件进行基准测试。

所有的CEC 2006问题都是盒约束的、连续的、单目标约束问题,并且由pygmo在类cec2006中作为UDP(用户定义问题)提供。 我们现在想要对三种用户定义的算法进行基准测试。由于这是一个约束问题,我们需要一个能够处理约束的UDA(用户定义算法)。在这方面,我们可以利用pygmo的元算法cstrs_self_adaptive, 以允许任何UDA用于约束问题。因此,我们将对扩展的蚁群优化算法gaco、相同的算法以及自适应的差分进化算法sade进行基准测试,两者都结合了自适应的约束处理技术。

特别是,我们将在24个CEC2006问题中的6个问题上使用上述三个UDAs(即问题:13、14、15、16、17、18)。这些问题的最佳已知适应度可以在技术报告:“CEC 2006约束实参数优化特别会议的问题定义和评估标准”中找到,作者是J. J. Liang等人,2006年。 为了在这些问题上运行UDAs,我们可以编写以下代码:

>>> import pygmo as pg
>>> #we first save the best known solutions in a vector:
>>> real_minima=[0.0539415140, -47.7648884595, 961.7150222899, -1.9051552586, 8853.5396748064, -0.8660254038]
>>> #we instantiate the problems
>>> problems=[pg.cec2006(13), pg.cec2006(14), pg.cec2006(15), pg.cec2006(16), pg.cec2006(17), pg.cec2006(18)]
>>> for index in range(0,6):
...       #we extract the problem of the case:
...       udp = problems[index]
...       prob = pg.problem(udp)
...       #Instantiate pagmo algorithms:
...       uda_gaco = pg.gaco(550, 100, 1.0, real_minima[index], 0.0, 200, 7, 10000, 10000, 0.0, False, 23)
...       uda_cstrs_sade=pg.cstrs_self_adaptive(40,pg.sade(10, 2, 1, 1e-6, 1e-6, False, 23))
...       uda_cstrs_gaco=pg.cstrs_self_adaptive(40,pg.gaco(10, 125, 1.0, real_minima[index], 0.0, 8, 7, 10000, 10000, 0.0, False, 23))
...       algo_gaco=pg.algorithm(uda_gaco)
...       algo_cstrs_sade=pg.algorithm(uda_cstrs_sade)
...       algo_cstrs_gaco=pg.algorithm(uda_cstrs_gaco)
...       #Set the seed for reproducibility purposes:
...       algo_gaco.set_seed(23)
...       algo_cstrs_sade.set_seed(23)
...       algo_cstrs_gaco.set_seed(23)
...       #Instantiate populations:
...       pop_gaco = pg.population(prob, size=100, seed=23)
...       pop_cstrs_sade = pg.population(prob, size=125, seed=23)
...       pop_cstrs_gaco = pg.population(prob, size=125, seed=23)
...       #Set verbosity:
...       algo_gaco.set_verbosity(5)
...       algo_cstrs_sade.set_verbosity(1)
...       algo_cstrs_gaco.set_verbosity(1)
...       #Run the evolution:
...       pop_gaco=algo_gaco.evolve(pop_gaco)
...       pop_cstrs_sade=algo_cstrs_sade.evolve(pop_cstrs_sade)
...       pop_cstrs_gaco=algo_cstrs_gaco.evolve(pop_cstrs_gaco)
...       #Extract the log:
...       uda_gaco=algo_gaco.extract(pg.gaco)
...       uda_sa_sade=algo_cstrs_sade.extract(pg.cstrs_self_adaptive)
...       uda_sa_gaco=algo_cstrs_gaco.extract(pg.cstrs_self_adaptive)
...       #The logs are saved for each problem:
...       if (index==0):
...           log_gaco_P13=uda_gaco.get_log()
...           log_sa_sade_P13=uda_sa_sade.get_log()
...           log_sa_gaco_P13=uda_sa_gaco.get_log()
...       elif (index==1):
...           log_gaco_P14=uda_gaco.get_log()
...           log_sa_sade_P14=uda_sa_sade.get_log()
...           log_sa_gaco_P14=uda_sa_gaco.get_log()
...       elif (index==2):
...           log_gaco_P15=uda_gaco.get_log()
...           log_sa_sade_P15=uda_sa_sade.get_log()
...           log_sa_gaco_P15=uda_sa_gaco.get_log()
...       elif (index==3):
...           log_gaco_P16=uda_gaco.get_log()
...           log_sa_sade_P16=uda_sa_sade.get_log()
...           log_sa_gaco_P16=uda_sa_gaco.get_log()
...       elif (index==4):
...           log_gaco_P17=uda_gaco.get_log()
...           log_sa_sade_P17=uda_sa_sade.get_log()
...           log_sa_gaco_P17=uda_sa_gaco.get_log()
...       elif (index==5):
...           log_gaco_P18=uda_gaco.get_log()
...           log_sa_sade_P18=uda_sa_sade.get_log()
...           log_sa_gaco_P18=uda_sa_gaco.get_log()

在这种情况下,我们使用100个个体的种群和550代来运行gaco,而我们使用cstrs_self_adaptive运行gacosade进行40次迭代,每次迭代有10代和125个个体在种群中。 我们现在可以在半对数图中绘制结果,y轴是最佳适应度的绝对值减去已知最佳适应度,x轴是函数评估次数。为此,我们编写以下代码:

>>> import matplotlib as mlp 
>>> import matplotlib.pyplot as plt 
>>> fig, axes = plt.subplots(nrows=3, ncols=2, sharex='col', sharey='row', figsize=(15,15)) 

>>> axes[0,0].semilogy([entry[1] for entry in log_gaco_P13], [abs(entry[2]-real_minima[0]) for entry in log_gaco_P13],'k--', label = 'gaco') 
>>> axes[0,0].semilogy([entry[1] for entry in log_sa_sade_P13], [abs(entry[2]-real_minima[0]) for entry in log_sa_sade_P13],'r--', label = 'self adaptive with sade') 
>>> axes[0,0].semilogy([entry[1] for entry in log_sa_gaco_P13], [abs(entry[2]-real_minima[0]) for entry in log_sa_gaco_P13], 'b--', label = 'self adaptive with gaco') 
>>> axes[0,0].legend(loc='upper right') 
>>> axes[0,0].set_title('P13: pop=200 and 125') 

>>> axes[0,1].semilogy([entry[1] for entry in log_gaco_P14], [abs(entry[2]-real_minima[1]) for entry in log_gaco_P14],'k--', label = 'gaco') 
>>> axes[0,1].semilogy([entry[1] for entry in log_sa_sade_P14], [abs(entry[2]-real_minima[1]) for entry in log_sa_sade_P14],'r--', label = 'self adaptive with sade') 
>>> axes[0,1].semilogy([entry[1] for entry in log_sa_gaco_P14], [abs(entry[2]-real_minima[1]) for entry in log_sa_gaco_P14], 'b--', label = 'self adaptive with gaco') 
>>> axes[0,1].legend(loc='upper right') 
>>> axes[0,1].set_title('P14: pop=200 and 125') 

>>> axes[1,0].semilogy([entry[1] for entry in log_gaco_P15], [abs(entry[2]-real_minima[2]) for entry in log_gaco_P15],'k--', label = 'gaco') 
>>> axes[1,0].semilogy([entry[1] for entry in log_sa_sade_P15], [abs(entry[2]-real_minima[2]) for entry in log_sa_sade_P15],'r--', label = 'self adaptive with sade') 
>>> axes[1,0].semilogy([entry[1] for entry in log_sa_gaco_P15], [abs(entry[2]-real_minima[2]) for entry in log_sa_gaco_P15], 'b--', label = 'self adaptive with gaco') 
>>> axes[1,0].legend(loc='upper right') 
>>> axes[1,0].set_title('P15: pop=200 and 125') 

>>> axes[1,1].semilogy([entry[1] for entry in log_gaco_P16], [abs(entry[2]-real_minima[3]) for entry in log_gaco_P16],'k--', label = 'gaco') 
>>> axes[1,1].semilogy([entry[1] for entry in log_sa_sade_P16], [abs(entry[2]-real_minima[3]) for entry in log_sa_sade_P16],'r--', label = 'self adaptive with sade') 
>>> axes[1,1].semilogy([entry[1] for entry in log_sa_gaco_P16], [abs(entry[2]-real_minima[3]) for entry in log_sa_gaco_P16], 'b--', label = 'self adaptive with gaco') 
>>> axes[1,1].legend(loc='upper right') 
>>> axes[1,1].set_title('P16: pop=200 and 125') 

>>> axes[2,0].semilogy([entry[1] for entry in log_gaco_P17], [abs(entry[2]-real_minima[4]) for entry in log_gaco_P17],'k--', label = 'gaco') 
>>> axes[2,0].semilogy([entry[1] for entry in log_sa_sade_P17], [abs(entry[2]-real_minima[4]) for entry in log_sa_sade_P17],'r--', label = 'self adaptive with sade') 
>>> axes[2,0].semilogy([entry[1] for entry in log_sa_gaco_P17], [abs(entry[2]-real_minima[4]) for entry in log_sa_gaco_P17], 'b--', label = 'self adaptive with gaco') 
>>> axes[2,0].legend(loc='upper right') 
>>> axes[2,0].set_title('P17: pop=200 and 125') 

>>> axes[2,1].semilogy([entry[1] for entry in log_gaco_P18], [abs(entry[2]-real_minima[5]) for entry in log_gaco_P18],'k--', label = 'gaco') 
>>> axes[2,1].semilogy([entry[1] for entry in log_sa_sade_P18], [abs(entry[2]-real_minima[5]) for entry in log_sa_sade_P18],'r--', label = 'self adaptive with sade') 
>>> axes[2,1].semilogy([entry[1] for entry in log_sa_gaco_P18], [abs(entry[2]-real_minima[5]) for entry in log_sa_gaco_P18], 'b--', label = 'self adaptive with gaco') 
>>> axes[2,1].legend(loc='upper right') 
>>> axes[2,1].set_title('P18: pop=200 and 125') 

>>> for ax in axes.flat: 
...       ax.set(xlabel='fevals', ylabel='log10(|f-f*|)') 
...       ax.grid() 

结果图可以在下图中看到:

CEC2006-TUTORIAL