You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Mesa(Python)智能体仅在特定时间步执行繁殖动作?

解决牡蛎智能体季节性繁殖问题

核心修改方向

  • 让智能体获取模型当前的“天数”:利用Mesa调度器的steps属性记录总步数(每一步对应一天),通过取模运算得到当年的具体天数。
  • 添加季节性繁殖判断:在原有繁殖条件基础上,增加“当前天数处于203-209区间”的限制。
  • 修复代码参数错误:原繁殖逻辑中创建幼体时传入了多余参数,需调整幼体初始化逻辑。

修改后完整代码

import mesa
import random

class Oyster(mesa.Agent):
    """具有随机初始能量和年龄的牡蛎智能体"""
   
    def __init__(self, unique_id, model):
         super().__init__(unique_id, model)
         self.age = random.randint(0, 3649)  # 初始年龄0-9岁(按365天/年计算)
         self.energy = random.randint(1,10)

    def step(self):
        living = True
        self.age += 1
        self.energy += random.randint(-5, 5)
       
        # 死亡判断
        if self.energy < 0 or self.age > 3650:  # 设定寿命为10年
            self.model.grid.remove_agent(self)
            self.model.schedule.remove(self)
            living = False
        
        # 繁殖逻辑:仅在每年203-209天,且满足存活、能量充足、成年条件时触发
        current_day_of_year = (self.model.schedule.steps % 365) + 1
        if living and self.energy >= 1.5 and self.age > 365 and 203 <= current_day_of_year <= 209:
            # 随机生成1-6个幼体
            for _ in range(random.randint(1,6)):
                baby_oyster = Oyster(self.model.next_id(), self.model)
                baby_oyster.age = 0  # 幼体初始年龄设为0
                baby_oyster.energy = random.randint(1,5)  # 幼体初始能量低于成体
                self.model.grid.place_agent(baby_oyster, self.pos)
                self.model.schedule.add(baby_oyster)

class OysterModel(mesa.Model):
    """包含多个牡蛎智能体的模型"""

    def __init__(self, N, width, height):
        self.num_agents = N
        self.grid = mesa.space.MultiGrid(width, height, True)
        self.schedule = mesa.time.RandomActivation(self)
        self.running = True
        
        # 创建初始智能体
        for i in range(self.num_agents):
            a = Oyster(i, self)
            self.schedule.add(a)
            # 将智能体放置在随机网格位置
            x = self.random.randrange(self.grid.width)
            y = self.random.randrange(self.grid.height)
            self.grid.place_agent(a, (x, y))

    def step(self):
        """模型推进一天"""
        self.schedule.step()

关键细节说明

  1. 获取当年天数:

    current_day_of_year = (self.model.schedule.steps % 365) + 1
    

    self.model.schedule.steps是模型运行的总步数,每调用一次model.step()步数加1。对365取模得到0-364的数值,加1后转换为1-365的当年天数,符合日常计数逻辑。

  2. 繁殖条件限制:
    在原有存活、能量、年龄条件之外,新增203 <= current_day_of_year <= 209判断,确保繁殖仅在指定时间段触发。

  3. 幼体初始化修复:
    原代码创建幼体时错误传入了成体的能量和年龄参数,修改为创建后单独设置幼体的年龄(0岁)和初始能量,更符合生物逻辑。

内容的提问来源于stack exchange,提问作者ifoxfoot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:55:29