首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用deap编码tsp问题的求值函数

使用deap编码tsp问题的求值函数
EN

Stack Overflow用户
提问于 2019-11-07 08:11:18
回答 1查看 333关注 0票数 0

我在一本名为Deap by Example的书中找到了一个解决方案,其中作者通过使用GA和Deap库来解决TSP问题,到目前为止,我的代码如下:

代码语言:javascript
复制
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()

当我运行它时,我得到的错误如下:

代码语言:javascript
复制
fitnessTSP() missing 2 required positional arguments: 'x' and 'y'

我试图传递这些参数,但我不知道如何处理函数应该获取的参数ind。例如,我尝试过这样做:

代码语言:javascript
复制
toolbox.register("evaluate",fitnessTSP("individual",x,y))

我如何修复这段代码?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-11-08 00:26:54

问题来自您注册evaluate函数的方式。要传递参数'x''y',您可以这样做

代码语言:javascript
复制
toolbox.register("evaluate", fitnessTSP, x=x, y=y)

您在问题中没有提到这一点,但是适应度函数必须返回一个元组。为此,您可以将适应度函数的最后一行设置为

代码语言:javascript
复制
return dist,

否则,一旦修复了第一个问题,就会出现另一个错误。

这将使您的完整代码成为

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58740193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档