我正在努力在 python 中创建一个CMA-ES优化算法的简单示例。使用 CMA-ES 算法优化功能x**2 + 2*y**2 -4*x*y - 0.5*y
的最简化方法是什么-2<x<2
?-1<2*(x**2)*y<1
我查看了 DEAP 库,但无法进行有凝聚力的尝试。我发现他们的文档不够直观。我还查看了cma包,但我不清楚如何实现约束。
在 pythoncma
包中,您可以指定绑定约束:
import cma
opts = cma.CMAOptions()
opts.set("bounds", [[-2, None], [2, None]])
cma.fmin(cost_function, x_start, sigma_start, opts)
对于第二个约束,正如之前所说,它并不简单,但您确实可以为域外候选解决方案分配高适应度值。你只需要在cost_function
这里调音。这些值可能非常高(高于可行域中的任何函数值)或取决于约束违反值。
有几种方法可以处理带有惩罚的约束。在您的情况下(小尺寸),您可以尝试使用最简单的一种。
我看到您与 DEAP 文档的斗争。尽管如此,我已经编写了自己的进化计算库,最近我一直在使用 DEAP 进行许多概念验证,我认为他们在这方面做得很好。
继续,让我们看一下完整的示例。如果您阅读文档,您会很舒服地查看代码。问题大小是变量的数量,所以在你的情况下,如果我理解正确,你会有N = 2
(x 和 y)。
你需要你的自定义健身功能而不是benchamrks.rastrigin
:
toolbox.register("evaluate", myownfunction)
约束没有实现,但是很容易。在适应度函数中,您可以使违反约束的个体无效(例如,通过分配非常高的适应度,如果最小化),并且在几代人中您的人口应该没有无效。
这将是使用 DEAP 的最简单方法,但是可以扩展deap.cma.Strategy
该类以覆盖/扩展任何方法,例如,该generate
方法使初始种群中的所有个体都有效。