knapsackExample.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # main imports
  2. import logging
  3. import os
  4. import random
  5. # module imports
  6. from macop.algorithms.IteratedLocalSearch import IteratedLocalSearch as ILS
  7. from macop.solutions.BinarySolution import BinarySolution
  8. from macop.evaluators.EvaluatorExample import evaluatorExample
  9. from macop.operators.mutators.SimpleMutation import SimpleMutation
  10. from macop.operators.mutators.SimpleBinaryMutation import SimpleBinaryMutation
  11. from macop.operators.crossovers.SimpleCrossover import SimpleCrossover
  12. from macop.operators.crossovers.RandomSplitCrossover import RandomSplitCrossover
  13. from macop.operators.policies.RandomPolicy import RandomPolicy
  14. from macop.operators.policies.UCBPolicy import UCBPolicy
  15. from macop.checkpoints.BasicCheckpoint import BasicCheckpoint
  16. if not os.path.exists('data'):
  17. os.makedirs('data')
  18. # logging configuration
  19. logging.basicConfig(format='%(asctime)s %(message)s', filename='data/example.log', level=logging.DEBUG)
  20. random.seed(42)
  21. elements_score = [ random.randint(1, 20) for _ in range(30) ]
  22. elements_weight = [ random.randint(2, 5) for _ in range(30) ]
  23. def knapsackWeight(_solution):
  24. weight_sum = 0
  25. for index, elem in enumerate(_solution.data):
  26. weight_sum += elements_weight[index] * elem
  27. return weight_sum
  28. # default validator
  29. def validator(_solution):
  30. if knapsackWeight(_solution) <= 80:
  31. return True
  32. else:
  33. False
  34. # define init random solution
  35. def init():
  36. return BinarySolution([], 30).random(validator)
  37. def evaluator(_solution):
  38. fitness = 0
  39. for index, elem in enumerate(_solution.data):
  40. fitness += (elements_score[index] * elem)
  41. return fitness
  42. filepath = "data/checkpoints.csv"
  43. def main():
  44. operators = [SimpleBinaryMutation(), SimpleMutation(), SimpleCrossover(), RandomSplitCrossover()]
  45. policy = UCBPolicy(operators)
  46. algo = ILS(init, evaluator, operators, policy, validator, _maximise=True)
  47. algo.addCheckpoint(_class=BasicCheckpoint, _every=5, _filepath=filepath)
  48. bestSol = algo.run(10000)
  49. print('Solution score is {}'.format(evaluator(bestSol)))
  50. print('Solution weigth is {}'.format(knapsackWeight(bestSol)))
  51. if __name__ == "__main__":
  52. main()