我在一本名为Deap by Example的书中找到了一个解决方案,其中作者通过使用GA和Deap库来解决TSP问题,到目前为止,我的代码如下:
import sys
import array
import random
import numpy as np
import matplotlib.pyplot as plt
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
def fitnessTSP(ind,x,y):
diffx=np.diff(x[ind])
diffy=np.diff(y[ind])
dist=np.sum(diffx**2-diffy**2)
return dist
def main():
numCities=10
random.seed(169)
x=np.random.rand(numCities)
y=np.random.rand(numCities)
print (x)
print (y)
plt.plot(x,y)
plt.show
creator.create("fitness_func",base.Fitness,weights=(-1,0))
creator.create("Individual",array.array,typecode='i',fitness=creator.fitness_func)
toolbox=base.Toolbox()
toolbox.register("indices",random.sample,range(numCities),numCities)
toolbox.register("individual",tools.initIterate,creator.Individual,toolbox.indices)
toolbox.register("population",tools.initRepeat,list,toolbox.individual)
toolbox.register("mate",tools.cxOrdered)
toolbox.register("mutate",tools.mutShuffleIndexes,indpb=0.05)
toolbox.register("select",tools.selTournament,tournsize=3)
toolbox.register("evaluate",fitnessTSP)
pop=toolbox.population(n=300)
best=tools.HallOfFame(1)
algorithms.eaSimple(pop,toolbox,0.7,0.2,140,halloffame=best)
if __name__=="__main__":
main()当我运行它时,我得到的错误如下:
fitnessTSP() missing 2 required positional arguments: 'x' and 'y'我试图传递这些参数,但我不知道如何处理函数应该获取的参数ind。例如,我尝试过这样做:
toolbox.register("evaluate",fitnessTSP("individual",x,y))我如何修复这段代码?
谢谢
发布于 2019-11-08 00:26:54
问题来自您注册evaluate函数的方式。要传递参数'x'和'y',您可以这样做
toolbox.register("evaluate", fitnessTSP, x=x, y=y)您在问题中没有提到这一点,但是适应度函数必须返回一个元组。为此,您可以将适应度函数的最后一行设置为
return dist,否则,一旦修复了第一个问题,就会出现另一个错误。
这将使您的完整代码成为
import sys
import array
import random
import numpy as np
import matplotlib.pyplot as plt
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
def fitnessTSP(ind,x,y):
diffx=np.diff(x[ind])
diffy=np.diff(y[ind])
dist=np.sum(diffx**2-diffy**2)
return dist,
def main():
numCities=10
random.seed(169)
x=np.random.rand(numCities)
y=np.random.rand(numCities)
print (x)
print (y)
plt.plot(x,y)
plt.show
creator.create("fitness_func",base.Fitness,weights=(-1,0))
creator.create("Individual",array.array,typecode='i',fitness=creator.fitness_func)
toolbox=base.Toolbox()
toolbox.register("indices",random.sample,range(numCities),numCities)
toolbox.register("individual",tools.initIterate,creator.Individual,toolbox.indices)
toolbox.register("population",tools.initRepeat,list,toolbox.individual)
toolbox.register("mate",tools.cxOrdered)
toolbox.register("mutate",tools.mutShuffleIndexes,indpb=0.05)
toolbox.register("select",tools.selTournament,tournsize=3)
toolbox.register("evaluate",fitnessTSP, x=x, y=y)
pop=toolbox.population(n=300)
best=tools.HallOfFame(1)
algorithms.eaSimple(pop,toolbox,0.7,0.2,140,halloffame=best)
if __name__=="__main__":
main()https://stackoverflow.com/questions/58740193
复制相似问题