问题描述:
其中,-10<=xi<=10, i=1,2,3..n,当n=1,2,3和4时分别有3、18、81和324个不同的全局最优解。
设计算法(可以是任何算法)并编写程序,可做n=1、2、3、4或部分或所有情况,得到全局最优解越多越好,用十进制编码,解的精确度至少到小数点后8位。
这是Shubert函数最优解问题,《演化优化及其在微分方程反问题中的应用》一文中提出了GMLE_DD算法。
GLME算法:全局-局部混合演化算法(Global-Local Mixed Evolutionary算法),演化分两个阶段进行,在第一阶段,既全局演化阶段,由郭涛算法产生若干哥小区域,第二个阶段,局部演化,采用精英演化算法在各个小区域中来演化出问题的解。
GLME_DD算法是在GLME算法的基础上,将整个区域分为q个区域,再在每个区域中使用GLME算法。
由于并行计算考试的需要,对论文中提出的方法进行了实现,在这里共享出来,C++实现,算法得到的最优解及执行时间如下表所示。源代码和算法执行结果是n = 4时的情况。
n = 1 | n = 2 | n = 3 | n = 4 | |
获得最优解的个数 | 3 | 18 | 81 | 324 |
最优值 | -12.870885493870 | -186.730908831023 | -2709.093505572829 | -39303.550054363128 |
GLME_DD算法运行时间 | 0.054秒 | 0.519秒 | 3.397秒 | 33.917秒 |
代码是基于基本的遗传算法的框架写的,有一些不足之处,比如在筛选最优解时并不一定能得出完全不重复的解,主要是没有把握好对重复解的判断,希望有兴趣的同学帮忙修正,其他不足之处欢迎拍砖。