def __init__(self, agent_num: int, obs_shape: int, action_shape: int) -> None:
        """
        **Overview**:
            The definition of independent actor-critic network in policy gradient algorithms for multi-agent scenarios.
            Each agent owns an independent actor-critic network with its own parameters.
        """
        # PyTorch necessary requirements for extending ``nn.Module`` . Our network should also subclass this class.
        super(IndependentActorCriticNetwork, self).__init__()
        # Define ``agent_num`` independent actor-critic networks for each agent.
        # To reuse some attributes of ``nn.Module`` , we use ``nn.ModuleList`` to store these networks instead of Python native list.
        self.agent_num = agent_num
        self.actor_critic_networks = nn.ModuleList(
            [ActorCriticNetwork(obs_shape, action_shape) for _ in range(agent_num)]
        )

        **Overview**:
            The definition of independent actor-critic network in policy gradient algorithms for multi-agent scenarios.
            Each agent owns an independent actor-critic network with its own parameters.
        
chapter6_marl/marl_network.py