4

我正在尝试使用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 工作的一般(不)欣赏是错误的。

4

2 回答 2

1

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

当我仅在终端中需要输入类型时(如您所做的那样),我创建了一个标识函数:

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

这会创建正确深度的嵌套 idem 的长分支: idem(idem(idem(x)))...

然后我对原始树进行字符串化,用单个“x”替换所有嵌套的同义词,并再次使用 deap.gp.PrimitiveTree.from_string(string, pset) 转换原始树中的字符串。

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

于 2015-06-16T09:59:27.860 回答
0

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

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

我在这里的评论中发现了一些关于这个问题的见解;generateDEAP 函数的修改版本。

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

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

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

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

于 2015-05-03T04:45:10.853 回答