использование deap для кодирования проблем с tsp с помощью функции оценки - PullRequest
0 голосов
/ 07 ноября 2019

Я следовал решению, которое я нашел в книге под названием Deap by Example, в которой автор решил TSP с помощью GA с библиотекой Deap, поэтому мой код выглядит следующим образом:

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))

Как я могу исправить этот код?

Спасибо

1 Ответ

0 голосов
/ 07 ноября 2019

Проблема связана с тем, как вы регистрируете функцию 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()
...