1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- from simulation.board import Board
- from simulation.logic.dumb_scouter import DumbScouter
- from simulation.logic.gatherer import Gatherer
- from simulation.logic.sensing_scouter import SensingScouter
- from simulation.logic.advanced_scouter import AdvancedScouter
- class FSMAnt(DumbScouter):
- """
- Knowledge used:
- - ["Harvesting"]["Min"]: (float) Min value an ant has to store to stop being starved
- - ["Harvesting"]["Max"]: (float) Max value an ant can carry
- - ["Harvesting"]["Eat"]: (float) Value an ant eat to do a step
- - ["Harvesting"]["Collect"]: (float) Value an ant collect by stepping on food
- - ["Gathering"]/["Scouting"]["Diagonal Moves"]: (bool) Allow ants to use diagonals to travel
- """
- # Multiplication factor for drop value (see blob variable) when an ant is starving
- RATIO_DROP_STARVE = 2
- def __init__(self, board, knowledge, x, y):
- """
- :type board: Board
- :type knowledge: dict
- :type x: int
- :type y: int
- """
- DumbScouter.__init__(self, board, knowledge, x, y)
- self.gatherer_logic = Gatherer(board, knowledge, x, y, self.knowledge["Gathering"]["Diagonal Moves"],
- self.knowledge["Gathering"]["Sightline"],
- self.knowledge["Gathering"]["Light Compute"])
- self.scouting_logic = AdvancedScouter(board, knowledge, x, y, self.knowledge["Scouting"]["Diagonal Moves"],
- self.knowledge["Scouting"]["Sightline"],
- self.knowledge["Scouting"]["Light Compute"])
- self.stored = self.knowledge["Harvesting"]["Min"]
- self.starving = False
- def move(self):
- if self.starving:
- self.gatherer_logic.move()
- self.x = self.gatherer_logic.x
- self.y = self.gatherer_logic.y
- else:
- self.scouting_logic.move()
- self.x = self.scouting_logic.x
- self.y = self.scouting_logic.y
- def init_gathering(self):
- self.gatherer_logic.reset()
- self.gatherer_logic.x = self.x
- self.gatherer_logic.y = self.y
- def init_scouting(self):
- self.scouting_logic.reset()
- self.scouting_logic.x = self.x
- self.scouting_logic.y = self.y
- def update(self):
- eat_ratio = self.knowledge["Harvesting"]["Eat"] * (Board.MAX_BLOB - self.board.get_blob(self.x, self.y)) \
- / Board.MAX_BLOB
- self.drop = self.knowledge["Scouters"]["Drop by eat"] * eat_ratio
- DumbScouter.update(self)
- if not self.starving:
- self.stored -= eat_ratio
- self.stored = max(0, self.stored)
- if self.board.has_food(self.x, self.y):
- if len(self.knowledge['food']) == 1:
- wanted = min(self.knowledge["Harvesting"]["Min"], self.knowledge["Harvesting"]["Max"] - self.stored)
- else:
- wanted = min(self.knowledge["Harvesting"]["Collect"], self.knowledge["Harvesting"]["Max"] - self.stored)
- received, finished = self.board.eat_food(self.x, self.y, wanted)
- self.stored += received
- if finished:
- self.knowledge['food'].remove((self.x, self.y))
- if self.stored == 0 and not self.starving:
- self.starving = True
- self.init_gathering()
- if self.stored >= self.knowledge["Harvesting"]["Min"] and self.starving:
- self.starving = False
- self.init_scouting()
|