如何解决"gp.generate tried to add a primitive but there is none available"?



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

我用一张黑白三角形的照片和不同三角形的 3 个顶点开始程序。 希望程序能想出一个程序,将给定三角形的顶点移近照片中的顶点。 我为它提供随机常数、算术原语加减法等,如果-那么-否则。并在给定坐标处测试is_black和is_white。

我已经设置了所有原语,但我不断遇到此错误,这似乎告诉我添加更多提供或消费(不确定哪个?!

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

  • 我有使用照片作为输入的基元。
  • 我没有将照片作为输出的基元。
  • 我不想变形照片,只是消费它。

我认为获胜的程序将是一长串命令,例如"如果 (10,10) 是黑色的,将 (3,2) 加到 vertex 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(x)))...

然后我字符串化原始树,用单个"x"替换所有这些嵌套的 idem,并使用 deap.gp.PrimitiveTree.from_string(string, pset) 再次转换原始树中的字符串。

它不优雅,也不蟒蛇,但它对我有用。

首先,我发现如果我添加一堆整数终端,错误就会消失。 在一个例子中,我只是添加了一堆整数。

for i in range(0, PLANE_SIZE):
pset.addTerminal(i, int, name=str(i))

我在这里的评论中找到了一些关于这个问题的见解; DEAP功能的修改版本generate

这完全与树的层数或深度有关:genGrow要求返回所需类型加上正确深度的东西。

有时它需要一个层(终端)中的"int"结果,有时它需要一个消耗两层(一个函数)的 int 结果。

因此,"NONE AVAILABLE"消息:它没有与插入树所需的类型和深度相匹配的可用消息。

我还没有使用过它,但我的理解是上面的要点实现了一个更灵活的生成函数;它愿意不那么严格地确保树是完全平衡的,并且会插入任何适合所需类型的内容,即使它与要求的深度不完全匹配。

相关内容

最新更新