我很难让deap.tools.mutUniformInt变异函数起作用。为了解决这个问题,我将示例/ga/onemax.py的第62行改为
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)至
toolbox.register("mutate", tools.mutUniformInt, 0, 1, indpb=0.05)onemax.py示例现在失败了:
C:\Users\mshiv\DEAP>python onemax.py
Start of evolution
Evaluated 300 individuals
-- Generation 1 --
Traceback (most recent call last):
File "C:\Users\mshiv\DEAP\onemax.py", line 161, in <module>
main()
File "C:\Users\mshiv\DEAP\onemax.py", line 128, in main
toolbox.mutate(mutant)
File "C:\Users\mshiv\AppData\Local\Programs\Python\Python39\lib\site-packages\deap\tools\mutation.py", line 159, in mutUniformInt
size = len(individual)
TypeError: object of type 'int' has no len()这两个变异器都应该对一个个体进行操作,这在onemax.py中被定义为一个列表,那么为什么mutFlipBit要工作,但是mutUniformInt似乎接收单个参数为int,而不是list?
在DEAP代码中穿插时,我发现mutUniformInt接收参数的顺序是无序的,即它们被传入为(低、向上、个体、indpb),而函数本身被定义为
def mutUniformInt(个人、低、向上、索引):
我是不是把这个突变函数记错了?
我修改的onemax示例的来源:
https://github.com/DEAP/deap/blob/master/examples/ga/onemax.py
发布于 2021-09-01 15:47:26
NVM -在这里找到了答案:
https://groups.google.com/g/deap-users/c/4sw2_Al4YFI/m/EvUiq70IBAAJ
正确的语法应该是:
toolbox.register("mutate", tools.mutUniformInt, low=0, up=1, indpb=0.05)https://stackoverflow.com/questions/69004533
复制相似问题