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

时间:2016-05-18 14:41:35

标签: python algorithm optimization genetic deap

我正在努力在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不够直观。我也查看了cma包,但我不清楚如何实现约束。

2 个答案:

答案 0 :(得分:2)

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

继续,让我们来看看the complete example。如果您阅读文档,您将很容易看到代码。问题大小是变量的数量,因此在您的情况下,如果我理解正确,您将拥有N = 2(x和y)。

您需要自定义健身功能而不是benchamrks.rastrigin

toolbox.register("evaluate", myownfunction)

约束没有实现,但是一项简单的任务。在适应度函数中,您可以使违反约束的个体无效(例如,通过指定非常高的适应度,如果最小化),并且在几代中,您的群体应该没有残留物。

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

答案 1 :(得分:1)

在python protected void Page_Load(object sender, EventArgs e) { BindData(); } public void BindData() { string strConnection = @"Data Source=.\sa;Initial Catalog=Northwind;Integrated Security=SSPI;"; SqlConnection con = new SqlConnection(strConnection); con.Open(); SqlCommand cmd = new SqlCommand("select ProductId, ProductName, SupplierId from Products", con); DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(ds); int rowcount = ds.Tables[0].Rows.Count; int remainingCount = 10 - (rowcount % 10); for (int i = 0; i < remainingCount; i++) { DataRow row = ds.Tables[0].NewRow(); ds.Tables[0].Rows.Add(row); } GridView1.DataSource = ds; GridView1.DataBind(); con.Close(); } protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridView1.PageIndex = e.NewPageIndex; BindData(); } 包中,您可以指定绑定约束:

cma

对于第二个约束,如前所述,这并不简单,但是您确实可以为域外候选解决方案分配高适用性值。您只需要在这里调整import cma opts = cma.CMAOptions() opts.set("bounds", [[-2, None], [2, None]]) cma.fmin(cost_function, x_start, sigma_start, opts) 。这些值可能很高(高于可行域中的任何函数值),或者取决于约束违反值。

several methods处以罚款来约束。如果是小型尺寸,则可以尝试最简单的尺寸。