Advertisement
Guest User

solver.py

a guest
Sep 11th, 2017
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.26 KB | None | 0 0
  1. import json
  2. import random
  3. import numpy as np
  4. from deap import algorithms
  5. from deap import base
  6. from deap import creator
  7. from deap import tools
  8.  
  9. class Evaluator(object):
  10.     def __init__(self, items, goal):
  11.         self.items = items
  12.         self.goal = goal
  13.     def __call__(self, candidate):
  14.         total_price = 0
  15.  
  16.         for i in xrange(len(candidate)):
  17.             total_price += candidate[i] * self.items[i]['price']
  18.  
  19.         if total_price > self.goal :
  20.             overspending = total_price - self.goal
  21.         else:
  22.             overspending = 0
  23.  
  24.         return (overspending, total_price)
  25.  
  26. with open('items.json') as f:
  27.     items = json.load(f)
  28.  
  29. with open('goal.json') as f:
  30.     goal = json.load(f)
  31.  
  32. evaluator = Evaluator(items, goal)
  33. upper_limit = 6
  34.  
  35. # Objectives are decreasing overspending and increasing total profit, in that
  36. # order
  37. creator.create('FitnessMulti', base.Fitness, weights=(-1, 1))
  38. creator.create('Individual', list, fitness=creator.FitnessMulti)
  39.  
  40. toolbox = base.Toolbox()
  41. toolbox.register('random_integer', lambda: random.randint(0, upper_limit))
  42. toolbox.register('individual',
  43.                  tools.initRepeat,
  44.                  creator.Individual,
  45.                  toolbox.random_integer,
  46.                  n = len(items))
  47. toolbox.register('population', tools.initRepeat, list, toolbox.individual)
  48. toolbox.register('evaluate', evaluator)
  49. toolbox.register('mate', tools.cxTwoPoint)
  50. toolbox.register('mutate', tools.mutUniformInt, low=0, up=upper_limit, indpb=0.05)
  51. toolbox.register('select', tools.selTournament, tournsize=3)
  52.  
  53. # random.seed(42)
  54.  
  55. NGEN = 1000
  56. CXPB = 0.5
  57. MUTPB = 0.2
  58.  
  59. pop = toolbox.population(n=100)
  60. hof = tools.ParetoFront()
  61.  
  62. pop, log = algorithms.eaSimple(pop, toolbox,
  63.                                cxpb=CXPB,
  64.                                mutpb=MUTPB,
  65.                                ngen=NGEN,
  66.                                halloffame=hof,
  67.                                verbose=True)
  68.  
  69. total_price = 0
  70. best_solution = hof[0]
  71.  
  72. print 'Items ordered:'
  73.  
  74. for i in xrange(len(best_solution)):
  75.     if best_solution[i] != 0:
  76.         print '%dx %s' % (best_solution[i], items[i]['name'])
  77.         total_price += best_solution[i] * items[i]['price']
  78.  
  79. print
  80. print 'Total price: $%.2f' % total_price
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement