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 来处理带有惩罚的约束。在你的情况下(小尺寸)你可以尝试最简单的。
我正在努力在 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 来处理带有惩罚的约束。在你的情况下(小尺寸)你可以尝试最简单的。