我正在尝试使用 DEAP 构建一个类型化的遗传编程解决方案。
我用一张黑白三角形和不同三角形的 3 个顶点的照片开始程序。希望该程序能够提出一个程序,将给定三角形的顶点移近照片中的顶点。我为它提供随机常量、算术原语加、减等,if-then-else。并在给定坐标处测试 is_black 和 is_white 。
我已经设置了所有原语,但我一直遇到这个错误,这似乎是在告诉我添加更多提供或使用(不确定是哪个?!)照片的原语。
我发现这个错误很困难,因为:
我认为获胜的程序将是一长串命令,例如“如果 (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 工作方式的普遍(不)理解是错误的。
最佳答案
我找到了解决这个问题的方法。
当我只在终端中需要输入类型时(就像你一样),我创建了一个标识函数:
pset.addPrimitive(idem, [MyClass], MyClass)
它创建了正确深度的嵌套 idem 的长分支:idem(idem(idem(x)))...
然后我对原始树进行字符串化,用单个“x”替换所有这些嵌套的同义词,并使用 deap.gp.PrimitiveTree.from_string(string, pset) 再次转换原始树中的字符串。
它不优雅,也不是 Pythonic,但对我有用。
关于python - 如何修复 "gp.generate tried to add a primitive but there is none available"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29597252/