Python CMA-ES算法解决用户定义的函数和约束

Python CMA-ES Algorithm to solve user-defined function and constraints

我正在努力在 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 库,但无法开发一个有凝聚力的尝试。我找到了 their documentation less than intuitive. I also looked into the cma 包,但我不清楚如何实施约束。

我看到你与 DEAP 文档的斗争。尽管如此,我已经编写了自己的进化计算库,最近我一直在使用 DEAP 进行许多概念验证,我认为他们做得很好。

继续,让我们看看the complete example。如果您阅读文档,您会很舒服地查看代码。问题的大小是变量的数量,所以在你的情况下,如果我理解正确的话,你会有 N = 2 (x and y).

并且您需要自定义适应度函数而不是 benchamrks.rastrigin:

toolbox.register("evaluate", myownfunction)

约束未实现,但很容易完成。在适应度函数中,您可以使违反约束的个体无效(例如,通过分配非常高的适应度,如果最小化)并且在几代之后您的种群应该没有无效个体。

这将是使用 DEAP 的最简单方法,但是 deap.cma.Strategy class 可以扩展以 override/extend 任何方法,例如 generate 方法,以便所有个体在初始人口中是有效的。

在 python cma 包中您可以指定绑定约束:

import cma
opts = cma.CMAOptions()
opts.set("bounds", [[-2, None], [2, None]])
cma.fmin(cost_function, x_start, sigma_start, opts)

对于第二个约束,如前所述,它并不直接,但你确实可以为out-of-domain个候选解分配高适应度值。您只需要在此处调整 cost_function 即可。这些值可能非常高(高于可行域中的任何函数值)或取决于约束违反值。

several methods 来处理带有惩罚的约束。在你的情况下(小尺寸)你可以尝试最简单的。