我正在尝试使用 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/

    10-11 20:47