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

使用自定义Agent类构建双种群Erdos-Renyi图的报错排查与实现咨询

问题分析与解决方案

错误原因

你遇到的TypeError是因为自定义的man/woman类继承自Mesa的Agent基类,但没有正确实现__init__方法的参数签名。Mesa的Agent基类要求__init__必须接收unique_id(唯一标识)和model(所属模型实例)两个参数,而你的man类的__init__没有定义这两个参数,导致调用man(i+1, self)时参数不匹配。

完整实现代码

1. 导入依赖

import numpy as np
import networkx as nx
from mesa import Agent, Model
from mesa.time import RandomActivation
from mesa.datacollection import DataCollector

2. 定义Agent子类(man/woman)

class man(Agent):
    def __init__(self, unique_id, model):
        # 必须先调用父类的初始化方法
        super().__init__(unique_id, model)
        # 生成正态分布的m、n属性,可自行调整均值和标准差
        self.m = np.random.normal(loc=0, scale=1)
        self.n = np.random.normal(loc=0, scale=1)

    def step(self):
        # 可添加节点的行为逻辑,例如更新属性、交互等
        pass

class woman(Agent):
    def __init__(self, unique_id, model):
        super().__init__(unique_id, model)
        self.m = np.random.normal(loc=0, scale=1)
        self.n = np.random.normal(loc=0, scale=1)

    def step(self):
        pass

3. 定义ER网络模型(network_ER)

class network_ER(Model):
    def __init__(self, N=50, p=0.1):
        super().__init__()
        self.N = N
        self.p = p  # ER图的边概率
        self.schedule = RandomActivation(self)
        
        # 创建两个独立的ER图:一个放man,一个放woman
        self.man_graph = nx.erdos_renyi_graph(n=N//2, p=p)
        self.woman_graph = nx.erdos_renyi_graph(n=N//2, p=p)

        # 创建man节点并添加到模型和man图中
        for node_id in self.man_graph.nodes():
            agent = man(unique_id=node_id, model=self)
            self.schedule.add(agent)
            # 将Agent实例绑定到图的节点属性,方便后续调用
            self.man_graph.nodes[node_id]["agent"] = agent

        # 创建woman节点并添加到模型和woman图中
        # 为避免ID冲突,woman的unique_id从N//2开始
        for idx, node_id in enumerate(self.woman_graph.nodes()):
            agent_id = idx + N//2
            agent = woman(unique_id=agent_id, model=self)
            self.schedule.add(agent)
            self.woman_graph.nodes[node_id]["agent"] = agent

        # 可选:添加数据收集器,用于记录属性
        self.datacollector = DataCollector(
            agent_reporters={"m": "m", "n": "n"}
        )

    def step(self):
        # 收集数据
        self.datacollector.collect(self)
        # 执行所有Agent的step方法
        self.schedule.step()

4. 测试代码

# 初始化模型
model = network_ER(N=50, p=0.1)
# 执行一步模拟
model.step()

# 验证两个图是否独立
print("Man图节点数:", len(model.man_graph.nodes()))
print("Woman图节点数:", len(model.woman_graph.nodes()))
print("Man图与Woman图是否有重叠节点:", bool(set(model.man_graph.nodes()) & set(model.woman_graph.nodes())))
# 查看任意节点的属性
sample_man = model.man_graph.nodes[0]["agent"]
print("Sample man的m属性:", sample_man.m)

关键说明

  • Agent初始化:所有继承自mesa.Agent的类必须在__init__中接收unique_id和model,并调用super().__init__(unique_id, model),否则会触发参数不匹配错误。
  • 双ER图构建:通过networkx.erdos_renyi_graph分别创建男女两个独立图,节点ID不重叠,确保初始状态下两个图完全断开。
  • 节点与Agent绑定:将Agent实例存储在图的节点属性中,方便后续在模型中通过图结构调用Agent的属性和方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:10:29