如何修复" gp.generate尝试添加原语但没有可用的"?

时间:2015-04-13 03:00:38

标签: python genetic-programming deap

我正在尝试用DEAP构建一个类型化的遗传编程解决方案。

我用黑白照片启动程序。白色三角形和不同三角形的3个顶点。希望程序能够提出一个程序,将给定三角形的顶点移近照片中的顶点。我提供随机常量,算术原语添加,减法等,if-then-else。并在给定坐标处测试is_black和is_white。

我已经设置了所有原语,但我一直遇到这个错误,这似乎告诉我要添加更多原语,这些原语提供或消费(不确定哪个?!)照片。

我发现错误很困难,因为:

  • 我有使用照片作为输入的基元。
  • 具有将照片作为输出生成的基元。
  • 我不想变身照片,只是消耗它。

我认为获胜的程序将是一长串命令,例如“if(10,10)是黑色添加(3,2)到顶点1”,有点令人作呕。

但也许有些东西我不能正确理解deap的工作原理。我如何克服这样的错误消息?

  File "/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/random.py", line 255, in choice
    raise IndexError('Cannot choose from an empty sequence')
IndexError: The gp.generate function tried to add a primitive of type '<class 'triangles.Photo'>', but there is none available.

此错误通常在gp.gengrow尝试生成起始填充时触发。

可能/可能没有关系的是,我没有太多关于终端的方式:我不清楚它们如何适用于我的问题。

我希望能听到蟋蟀,但是如果有人真正对这个问题感兴趣并想看到代码,或者至少是原始集合,我可以将其粘贴或粘贴在某个地方。认为它已经足够漫无边际了;虽然我专注于一个特定的错误信息,但我认为这也是我对GP / DEAP工作的一般性(不)认识的错误。

1 个答案:

答案 0 :(得分:1)

我找到了解决此问题的方法。

当我只在终端中需要输入类型时(就像你一样)我创建了一个身份函数:

pset.addPrimitive(idem, [MyClass], MyClass)

它创建了具有正确深度的嵌套idem的长分支:idem(idem(idem(x)))...

然后我将原始字符串化,用一个&#39; x&#39;替换所有这些嵌套的idems。并使用deap.gp.PrimitiveTree.from_string(string,pset)再次转换为primitivetree中的字符串。

它不优雅,它不是pythonic,但它对我有用。