Dear all,
I am experimenting with a custom generator for NSGA-II, but I have some weird error when I try to pass it some arguments with a dictionary. This is the basic example of NSGA-II, for which my generator makes no sense, but I am able to reproduce the error:
from random import Random
from time import time
import inspyred
def nsga2generate(random, args) :
phenotype_len = args.get("phenotype_len", 3)
# extract random number in 1,400
individual_size = random.randint(1,400)
individual = [0] * individual_size
for i in range(0, individual_size) : individual[i] = random.randint(1, phenotype_len)
return individual
def main(prng=None, display=False):
if prng is None:
prng = Random()
prng.seed(time())
args = dict()
args["phenotype_len"] = 10
problem = inspyred.benchmarks.Kursawe(3)
ea = inspyred.ec.emo.NSGA2(prng)
ea.variator = [inspyred.ec.variators.blend_crossover,
inspyred.ec.variators.gaussian_mutation]
ea.terminator = inspyred.ec.terminators.generation_termination
final_pop = ea.evolve(generator=nsga2generate(prng, args),
#generator=nsga2generate
evaluator=problem.evaluator,
pop_size=100,
maximize=problem.maximize,
bounder=problem.bounder,
max_generations=80)
if display:
final_arc = ea.archive
print('Best Solutions: \n')
for f in final_arc:
print(f)
import pylab
x = []
y = []
for f in final_arc:
x.append(f.fitness[0])
y.append(f.fitness[1])
pylab.scatter(x, y, color='b')
pylab.savefig('{0} Example ({1}).pdf'.format(ea.__class__.__name__,
problem.__class__.__name__),
format='pdf')
pylab.show()
return ea
if __name__ == '__main__':
main(display=True)
If I just pass the generator with
generator=nsga2generate
everything works properly. However, with the current code, I get:
Traceback (most recent call last):
File "sample-nsga-ii.py", line 53, in <module>
main(display=True)
File "sample-nsga-ii.py", line 32, in main
max_generations=80)
File "/usr/local/lib/python3.5/dist-packages/inspyred/ec/emo.py", line 147, in evolve
return ec.EvolutionaryComputation.evolve(self, generator, evaluator, pop_size, seeds, maximize, bounder, **args)
File "/usr/local/lib/python3.5/dist-packages/inspyred/ec/ec.py", line 430, in evolve
cs = generator(random=self._random, args=self._kwargs)
TypeError: 'list' object is not callable
There is clearly something I am missing. Can you help me?
Thank you for your time.