class WolfSheepPredation(Model): ''' Wolf-Sheep Predation Model ''' height = 20 width = 20 initial_sheep = 100 initial_wolves = 50 sheep_reproduce = 0.04 wolf_reproduce = 0.05 wolf_gain_from_food = 20 grass = False grass_regrowth_time = 30 sheep_gain_from_food = 4 verbose = False # Print-monitoring def __init__(self, height=20, width=20, initial_sheep=100, initial_wolves=50, sheep_reproduce=0.04, wolf_reproduce=0.05, wolf_gain_from_food=20, grass=False, grass_regrowth_time=30, sheep_gain_from_food=4): ''' Create a new Wolf-Sheep model with the given parameters. Args: initial_sheep: Number of sheep to start with initial_wolves: Number of wolves to start with sheep_reproduce: Probability of each sheep reproducing each step wolf_reproduce: Probability of each wolf reproducing each step wolf_gain_from_food: Energy a wolf gains from eating a sheep grass: Whether to have the sheep eat grass for energy grass_regrowth_time: How long it takes for a grass patch to regrow once it is eaten sheep_gain_from_food: Energy sheep gain from grass, if enabled. ''' # Set parameters self.height = height self.width = width self.initial_sheep = initial_sheep self.initial_wolves = initial_wolves self.sheep_reproduce = sheep_reproduce self.wolf_reproduce = wolf_reproduce self.wolf_gain_from_food = wolf_gain_from_food self.grass = grass self.grass_regrowth_time = grass_regrowth_time self.sheep_gain_from_food = sheep_gain_from_food self.schedule = RandomActivationByBreed(self) self.grid = MultiGrid(self.height, self.width, torus=True) self.datacollector = DataCollector({ "Wolves": lambda m: m.schedule.get_breed_count(Wolf), "Sheep": lambda m: m.schedule.get_breed_count(Sheep) }) # Create sheep: for i in range(self.initial_sheep): x = random.randrange(self.width) y = random.randrange(self.height) energy = random.randrange(2 * self.sheep_gain_from_food) sheep = Sheep(self.grid, (x, y), True, energy) self.grid.place_agent(sheep, (x, y)) self.schedule.add(sheep) # Create wolves for i in range(self.initial_wolves): x = random.randrange(self.width) y = random.randrange(self.height) energy = random.randrange(2 * self.wolf_gain_from_food) wolf = Wolf(self.grid, (x, y), True, energy) self.grid.place_agent(wolf, (x, y)) self.schedule.add(wolf) # Create grass patches if self.grass: for agent, x, y in self.grid.coord_iter(): fully_grown = random.choice([True, False]) if fully_grown: countdown = self.grass_regrowth_time else: countdown = random.randrange(self.grass_regrowth_time) patch = GrassPatch(fully_grown, countdown) self.grid.place_agent(patch, (x, y)) self.schedule.add(patch) self.running = True def step(self): self.schedule.step() self.datacollector.collect(self) if self.verbose: print([ self.schedule.time, self.schedule.get_breed_count(Wolf), self.schedule.get_breed_count(Sheep) ]) def run_model(self, step_count=200): if self.verbose: print('Initial number wolves: ', self.schedule.get_breed_count(Wolf)) print('Initial number sheep: ', self.schedule.get_breed_count(Sheep)) for i in range(step_count): self.step() if self.verbose: print('') print('Final number wolves: ', self.schedule.get_breed_count(Wolf)) print('Final number sheep: ', self.schedule.get_breed_count(Sheep))
class WolfSheep(Model): ''' Wolf-Sheep Predation Model ''' height = 20 width = 20 initial_sheep = 100 initial_wolves = 50 sheep_reproduce = 0.04 wolf_reproduce = 0.05 wolf_gain_from_food = 20 grass = False grass_regrowth_time = 30 sheep_gain_from_food = 4 verbose = False # Print-monitoring description = 'A model for simulating wolf and sheep (predator-prey) ecosystem modelling.' def __init__(self, height=20, width=20, initial_sheep=100, initial_wolves=50, sheep_reproduce=0.04, wolf_reproduce=0.05, wolf_gain_from_food=20, grass=False, grass_regrowth_time=30, sheep_gain_from_food=4): ''' Create a new Wolf-Sheep model with the given parameters. Args: initial_sheep: Number of sheep to start with initial_wolves: Number of wolves to start with sheep_reproduce: Probability of each sheep reproducing each step wolf_reproduce: Probability of each wolf reproducing each step wolf_gain_from_food: Energy a wolf gains from eating a sheep grass: Whether to have the sheep eat grass for energy grass_regrowth_time: How long it takes for a grass patch to regrow once it is eaten sheep_gain_from_food: Energy sheep gain from grass, if enabled. ''' super().__init__() # Set parameters self.height = height self.width = width self.initial_sheep = initial_sheep self.initial_wolves = initial_wolves self.sheep_reproduce = sheep_reproduce self.wolf_reproduce = wolf_reproduce self.wolf_gain_from_food = wolf_gain_from_food self.grass = grass self.grass_regrowth_time = grass_regrowth_time self.sheep_gain_from_food = sheep_gain_from_food self.schedule = RandomActivationByBreed(self) self.grid = MultiGrid(self.height, self.width, torus=True) self.datacollector = DataCollector( {"Wolves": lambda m: m.schedule.get_breed_count(Wolf), "Sheep": lambda m: m.schedule.get_breed_count(Sheep)}) # Create sheep: for i in range(self.initial_sheep): x = self.random.randrange(self.width) y = self.random.randrange(self.height) energy = self.random.randrange(2 * self.sheep_gain_from_food) sheep = Sheep(self.next_id(), (x, y), self, True, energy) self.grid.place_agent(sheep, (x, y)) self.schedule.add(sheep) # Create wolves for i in range(self.initial_wolves): x = self.random.randrange(self.width) y = self.random.randrange(self.height) energy = self.random.randrange(2 * self.wolf_gain_from_food) wolf = Wolf(self.next_id(), (x, y), self, True, energy) self.grid.place_agent(wolf, (x, y)) self.schedule.add(wolf) # Create grass patches if self.grass: for agent, x, y in self.grid.coord_iter(): fully_grown = self.random.choice([True, False]) if fully_grown: countdown = self.grass_regrowth_time else: countdown = self.random.randrange(self.grass_regrowth_time) patch = GrassPatch(self.next_id(), (x, y), self, fully_grown, countdown) self.grid.place_agent(patch, (x, y)) self.schedule.add(patch) self.running = True self.datacollector.collect(self) def step(self): self.schedule.step() # collect data self.datacollector.collect(self) if self.verbose: print([self.schedule.time, self.schedule.get_breed_count(Wolf), self.schedule.get_breed_count(Sheep)]) def run_model(self, step_count=200): if self.verbose: print('Initial number wolves: ', self.schedule.get_breed_count(Wolf)) print('Initial number sheep: ', self.schedule.get_breed_count(Sheep)) for i in range(step_count): self.step() if self.verbose: print('') print('Final number wolves: ', self.schedule.get_breed_count(Wolf)) print('Final number sheep: ', self.schedule.get_breed_count(Sheep))
class WolfSheepPredation(Model): ''' Wolf-Sheep Predation Model ''' verbose = False # Print-monitoring def __init__(self, height=20, width=20, initial_sheep=150, initial_wolves=10, sheep_reproduce=1, wolf_reproduce=40, wolf_gain_from_food=15, grass_regrowth_time=20, sheep_gain_from_food=4): ''' Create a new Wolf-Sheep model with the given parameters. Args: initial_sheep: Number of sheep to start with initial_wolves: Number of wolves to start with sheep_reproduce: Энергия для генерации новой овечки, забираемая у родителей wolf_reproduce: --//-- волчонка --//-- wolf_gain_from_food: Energy a wolf gains from eating a sheep grass_regrowth_time: How long it takes for a grass patch to regrow once it is eaten sheep_gain_from_food: Energy sheep gain from grass ''' # Set parameters self.height = height self.width = width self.initial_sheep = initial_sheep self.initial_wolves = initial_wolves self.sheep_reproduce = sheep_reproduce self.wolf_reproduce = wolf_reproduce self.wolf_gain_from_food = wolf_gain_from_food self.grass_regrowth_time = grass_regrowth_time self.sheep_gain_from_food = sheep_gain_from_food self.schedule = RandomActivationByBreed(self) self.grid = MultiGrid(self.height, self.width, torus=True) self.datacollector = DataCollector( {"Wolves": lambda m: m.schedule.get_breed_count(Wolf), "Sheep": lambda m: m.schedule.get_breed_count(Sheep)}) # Create sheep: for i in range(self.initial_sheep): x = random.randrange(self.width) y = random.randrange(self.height) energy = random.randrange(2 * self.sheep_gain_from_food) sheep = Sheep((x, y), self, True, energy) self.grid.place_agent(sheep, (x, y)) self.schedule.add(sheep) # Create wolves for i in range(self.initial_wolves): x = random.randrange(self.width) y = random.randrange(self.height) energy = random.randrange(2 * self.wolf_gain_from_food) wolf = Wolf((x, y), self, True, energy) self.grid.place_agent(wolf, (x, y)) self.schedule.add(wolf) # Create grass patches for agent, x, y in self.grid.coord_iter(): fully_grown = random.choice([True, False]) if fully_grown: countdown = self.grass_regrowth_time else: countdown = random.randrange(self.grass_regrowth_time) patch = GrassPatch((x, y), self, fully_grown, countdown) self.grid.place_agent(patch, (x, y)) self.schedule.add(patch) self.running = True def step(self): self.schedule.step() self.datacollector.collect(self) if self.verbose: print([self.schedule.time, self.schedule.get_breed_count(Wolf), self.schedule.get_breed_count(Sheep)]) def run_model(self, step_count=200): if self.verbose: print('Initial number wolves: ', self.schedule.get_breed_count(Wolf)) print('Initial number sheep: ', self.schedule.get_breed_count(Sheep)) for i in range(step_count): self.step() if self.verbose: print('') print('Final number wolves: ', self.schedule.get_breed_count(Wolf)) print('Final number sheep: ', self.schedule.get_breed_count(Sheep))
class WolfSheepPredation(Model): ''' Wolf-Sheep Predation Model ''' height = 20 width = 20 initial_sheep = 100 initial_wolves = 50 min_initial_age = -1 # set to -1 to indicate newborns, as on first step it will increment and become 0 sheep_initial_age_limit = Sheep.max_age * 0.75 wolf_initial_age_limit = Wolf.max_age * 0.75 sheep_reproduce = 0.04 wolf_reproduce = 0.05 wolf_gain_from_food = 20 grass = False grass_regrowth_time = 30 sheep_gain_from_food = 4 verbose = False # Print-monitoring description = 'A model for simulating wolf and sheep (predator-prey) ecosystem modelling.' def __init__(self, height=20, width=20, initial_sheep=100, initial_wolves=50, sheep_reproduce=0.04, wolf_reproduce=0.05, wolf_gain_from_food=20, grass=False, grass_regrowth_time=30, sheep_gain_from_food=4, sheep_initial_age_limit=Sheep.max_age * 0.75, wolf_initial_age_limit=Wolf.max_age * 0.75): ''' Create a new Wolf-Sheep model with the given parameters. Args: initial_sheep: Number of sheep to start with initial_wolves: Number of wolves to start with sheep_reproduce: Probability of each sheep reproducing each step wolf_reproduce: Probability of each wolf reproducing each step wolf_gain_from_food: Energy a wolf gains from eating a sheep grass: Whether to have the sheep eat grass for energy grass_regrowth_time: How long it takes for a grass patch to regrow once it is eaten sheep_gain_from_food: Energy sheep gain from grass, if enabled. ''' # Set parameters self.height = height self.width = width self.initial_sheep = initial_sheep self.initial_wolves = initial_wolves self.sheep_initial_age_limit = sheep_initial_age_limit self.wolf_initial_age_limit = wolf_initial_age_limit self.sheep_reproduce = sheep_reproduce self.wolf_reproduce = wolf_reproduce self.reproduces_by_type = dict([ (Sheep.__name__, sheep_reproduce), (Wolf.__name__, wolf_reproduce), ]) self.wolf_gain_from_food = wolf_gain_from_food self.grass = grass self.grass_regrowth_time = grass_regrowth_time self.sheep_gain_from_food = sheep_gain_from_food self.schedule = RandomActivationByBreed(self) self.grid = MultiGrid(self.height, self.width, torus=True) self.datacollector = DataCollector( {"Wolves": lambda m: m.schedule.get_breed_count(Wolf), "Sheep": lambda m: m.schedule.get_breed_count(Sheep)}) self.datacollector_ages = DataCollector( {"Wolves": lambda m: m.schedule.get_breed_average_age(Wolf), "Sheep": lambda m: m.schedule.get_breed_average_age(Sheep)}) # Create sheep: for i in range(self.initial_sheep): x = random.randrange(self.width) y = random.randrange(self.height) energy = random.randrange(2 * self.sheep_gain_from_food) age = random.randint(self.min_initial_age, sheep_initial_age_limit) sheep = Sheep((x, y), self, True, energy, age) self.grid.place_agent(sheep, (x, y)) self.schedule.add(sheep) # Create wolves for i in range(self.initial_wolves): x = random.randrange(self.width) y = random.randrange(self.height) energy = random.randrange(2 * self.wolf_gain_from_food) age = random.randint(self.min_initial_age, wolf_initial_age_limit) wolf = Wolf((x, y), self, True, energy, age) self.grid.place_agent(wolf, (x, y)) self.schedule.add(wolf) # Create grass patches if self.grass: for agent, x, y in self.grid.coord_iter(): fully_grown = random.choice([True, False]) if fully_grown: countdown = self.grass_regrowth_time else: countdown = random.randrange(self.grass_regrowth_time) patch = GrassPatch((x, y), self, fully_grown, countdown) self.grid.place_agent(patch, (x, y)) self.schedule.add(patch) self.running = True self.datacollector.collect(self) self.datacollector_ages.collect(self) def step(self): self.schedule.step() # collect data self.datacollector.collect(self) self.datacollector_ages.collect(self) if self.verbose: print([self.schedule.time, self.schedule.get_breed_count(Wolf), self.schedule.get_breed_count(Sheep)]) def run_model(self, step_count=200): if self.verbose: print('Initial number wolves: ', self.schedule.get_breed_count(Wolf)) print('Initial number sheep: ', self.schedule.get_breed_count(Sheep)) for i in range(step_count): self.step() if self.verbose: print('') print('Final number wolves: ', self.schedule.get_breed_count(Wolf)) print('Final number sheep: ', self.schedule.get_breed_count(Sheep)) def can_reproduce(self, agent, seed=None): """Indicates whether an agent can reproduce based on the probability for its type. Arguments: agent (Sheep|Wolf): agent to check if it can reproduce seed (int, optional): seed used to retrieve the random number used to determined if the agent can reproduce. This allows the same check to be called multiple times for the same agent without having different results """ if seed is not None: random.seed(seed) return random.random() < self.reproduces_by_type[type(agent).__name__]