我正在尝试用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工作的一般性(不)认识的错误。
答案 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,但它对我有用。