Advertisement
Guest User

Untitled

a guest
May 26th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import array
  3. import random
  4. import json
  5.  
  6. import numpy
  7. import matplotlib.pyplot as plt
  8.  
  9. from math import sqrt
  10.  
  11. from deap import algorithms
  12. from deap import base
  13. from deap import benchmarks
  14. from deap.benchmarks.tools import diversity, convergence, hypervolume
  15. from deap import creator
  16. from deap import tools
  17.  
  18. creator.create("FitnessMin", base.Fitness, weights=(-1.0, -1.0))
  19. creator.create("Individual", array.array, typecode='d', fitness=creator.FitnessMin)
  20.  
  21. toolbox = base.Toolbox()
  22.  
  23. BOUND_LOW, BOUND_UP = 0.0, 1.0
  24.  
  25. NDIM = 30
  26.  
  27. def uniform(low, up, size=None):
  28. try:
  29. return [random.uniform(a, b) for a, b in zip(low, up)]
  30. except TypeError:
  31. return [random.uniform(a, b) for a, b in zip([low] * size, [up] * size)]
  32.  
  33. toolbox.register("attr_float", uniform, BOUND_LOW, BOUND_UP, NDIM)
  34. toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.attr_float)
  35. toolbox.register("population", tools.initRepeat, list, toolbox.individual)
  36.  
  37. toolbox.register("evaluate", benchmarks.zdt1)
  38. toolbox.register("mate", tools.cxSimulatedBinaryBounded, low=BOUND_LOW, up=BOUND_UP, eta=20.0)
  39. toolbox.register("mutate", tools.mutPolynomialBounded, low=BOUND_LOW, up=BOUND_UP, eta=20.0, indpb=1.0/NDIM)
  40. toolbox.register("select", tools.selNSGA2)
  41.  
  42. def main(seed=None):
  43. random.seed(seed)
  44.  
  45. NGEN = 250
  46. MU = 100
  47. CXPB = 0.9
  48.  
  49. stats = tools.Statistics(lambda ind: ind.fitness.values)
  50. stats.register("min", numpy.min, axis=0)
  51. stats.register("max", numpy.max, axis=0)
  52.  
  53. logbook = tools.Logbook()
  54. logbook.header = "gen", "evals", "min", "max"
  55.  
  56. pop = toolbox.population(n=MU)
  57. pop_ini = pop[:]
  58.  
  59. invalid_ind = [ind for ind in pop if not ind.fitness.valid]
  60. fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
  61. for ind, fit in zip(invalid_ind, fitnesses):
  62. ind.fitness.values = fit
  63.  
  64. pop = toolbox.select(pop, len(pop))
  65.  
  66. record = stats.compile(pop)
  67. logbook.record(gen=0, evals=len(invalid_ind), **record)
  68. print(logbook.stream)
  69.  
  70. for gen in range(1, NGEN):
  71.  
  72. offspring = tools.selTournamentDCD(pop, len(pop))
  73. offspring = [toolbox.clone(ind) for ind in offspring]
  74.  
  75. for ind1, ind2 in zip(offspring[::2], offspring[1::2]):
  76. if random.random() <= CXPB:
  77. toolbox.mate(ind1, ind2)
  78.  
  79. toolbox.mutate(ind1)
  80. toolbox.mutate(ind2)
  81. del ind1.fitness.values, ind2.fitness.values
  82.  
  83. invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
  84. fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
  85. for ind, fit in zip(invalid_ind, fitnesses):
  86. ind.fitness.values = fit
  87.  
  88. pop = toolbox.select(pop + offspring, MU)
  89. record = stats.compile(pop)
  90. logbook.record(gen=gen, evals=len(invalid_ind), **record)
  91. print(logbook.stream)
  92.  
  93. print("Final population hypervolume is %f" % hypervolume(pop, [11.0, 11.0]))
  94.  
  95. return pop, pop_ini, logbook
  96.  
  97. if __name__ == "__main__":
  98. pop, pop_ini, stats = main(64)
  99.  
  100. fitnesses_ini = np.array([list(pop_ini[i].fitness.values) for i in range(len(pop_ini))])
  101. fitnesses = np.array([list(pop[i].fitness.values) for i in range(len(pop))])
  102.  
  103. plt.plot(fitnesses_ini[:,0], fitnesses_ini[:,1], "b.", label="Initial")
  104. plt.plot(fitnesses[:,0], fitnesses[:,1], "r.", label="Optimized" )
  105. plt.legend(loc="upper right")
  106. plt.title("fitnesses")
  107. plt.xlabel("f1")
  108. plt.ylabel("f2")
  109. plt.grid(True)
  110. plt.savefig("fitnesses.png", dpi=300)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement