fsm_ant.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from simulation.board import Board
  2. from simulation.logic.dumb_scouter import DumbScouter
  3. from simulation.logic.gatherer import Gatherer
  4. from simulation.logic.sensing_scouter import SensingScouter
  5. from simulation.logic.advanced_scouter import AdvancedScouter
  6. class FSMAnt(DumbScouter):
  7. """
  8. Knowledge used:
  9. - min_harvest: (float) Min value an ant has to store to stop being starved
  10. - max_harvest: (float) Max value an ant can carry
  11. - eat: (float) Value an ant eat to do a step
  12. - harvest: (float) Value an ant collect by stepping on food
  13. - use_diagonal: (bool) Allow ants to use diagonals to travel
  14. """
  15. # Multiplication factor for drop value (see blob variable) when an ant is starving
  16. RATIO_DROP_STARVE = 2
  17. def __init__(self, board, knowledge, x, y):
  18. """
  19. :type board: Board
  20. :type knowledge: dict
  21. :type x: int
  22. :type y: int
  23. """
  24. DumbScouter.__init__(self, board, knowledge, x, y)
  25. self.gatherer_logic = Gatherer(board, knowledge, x, y, self.knowledge["use_diagonal"])
  26. self.scouting_logic = AdvancedScouter(board, knowledge, x, y, self.knowledge["use_diagonal"])
  27. self.stored = self.knowledge["min_harvest"]
  28. self.starving = False
  29. self.init_drop = self.knowledge['drop']
  30. def move(self):
  31. if self.starving:
  32. self.gatherer_logic.move()
  33. self.x = self.gatherer_logic.x
  34. self.y = self.gatherer_logic.y
  35. else:
  36. self.scouting_logic.move()
  37. self.x = self.scouting_logic.x
  38. self.y = self.scouting_logic.y
  39. def init_gathering(self):
  40. self.gatherer_logic.reset()
  41. self.gatherer_logic.x = self.x
  42. self.gatherer_logic.y = self.y
  43. def init_scouting(self):
  44. self.scouting_logic.reset()
  45. self.scouting_logic.x = self.x
  46. self.scouting_logic.y = self.y
  47. self.drop = self.init_drop
  48. def update(self):
  49. # if self.harvest > 0 and self.starving:
  50. # self.drop = FSMAnt.RATIO_DROP_STARVE * self.init_drop
  51. self.drop = self.init_drop * self.stored
  52. DumbScouter.update(self)
  53. if not self.starving:
  54. self.stored -= self.knowledge["eat"]
  55. self.stored = max(0, self.stored)
  56. if self.board.has_food(self.x, self.y):
  57. if len(self.knowledge['food']) == 1:
  58. wanted = min(self.knowledge["min_harvest"], self.knowledge["max_harvest"] - self.stored)
  59. else:
  60. wanted = min(self.knowledge["harvest"], self.knowledge["max_harvest"] - self.stored)
  61. received, finished = self.board.eat_food(self.x, self.y, wanted)
  62. self.stored += received
  63. if finished:
  64. self.knowledge['food'].remove((self.x, self.y))
  65. if self.stored == 0 and not self.starving:
  66. self.starving = True
  67. self.init_gathering()
  68. if self.stored >= self.knowledge["min_harvest"] and self.starving:
  69. self.starving = False
  70. self.init_scouting()