Pular para o conteúdo principal

Simulação Multiagente — Conceitos

O Synapsys trata cada componente da simulação (planta, controlador, observador) como um agente independente. Agentes se comunicam por mensagens, não por chamadas de função — o que permite rodar cada componente em um processo, thread ou máquina separada.

Por que agentes?

O modelo monolítico (tudo no mesmo script) e simples, mas tem limitações:

  • Difícil de testar componentes isoladamente
  • Não escala para sistemas distribuídos (HIL, redes de controladores)
  • Impossível introduzir atraso de rede realista entre planta e controlador

Com agentes:

[ PlantAgent ]  <->  [ SharedMemory / ZMQ ]  <->  [ ControllerAgent ]
Processo A Barramento Processo B

FIPA ACL

O Synapsys usa um subconjunto do padrão FIPA ACL (Agent Communication Language) para mensagens estruturadas entre agentes.

from synapsys.agents import ACLMessage, Performative

msg = ACLMessage(
performative=Performative.INFORM,
sender="planta",
receiver="controlador",
content={"y": 3.14},
)

reply = msg.reply(Performative.REQUEST, content={"u": 1.5})
PerformativeSignificado
INFORMInforma um fato (ex: estado da planta)
REQUESTSolicita uma ação (ex: calcular u)
AGREEAceita um pedido
REFUSERecusa um pedido
FAILUREReporta falha na execucao
SUBSCRIBESolicita atualizações periodicas

Sincronismo

O SyncEngine controla como o tempo avanca dentro de cada agente.

from synapsys.agents import SyncEngine, SyncMode

# Wall-clock: executa em tempo real, com sleep para cadenciar os ticks
sync = SyncEngine(mode=SyncMode.WALL_CLOCK, dt=0.01) # 100 Hz

# Lock-step: avanca so quando chamado explicitamente (deterministico)
sync = SyncEngine(mode=SyncMode.LOCK_STEP, dt=0.01)

Wall-clock vs lock-step

WALL_CLOCKLOCK_STEP
VelocidadeTempo real (limitado por dt)Tão rápido quanto possível
SincroniaCada agente no seu ritmoAcoplado por barreira externa
Atraso de redeSimulado naturalmenteTransparente
ReprodutibilidadeNão-determinísticoDeterminístico
UsoTestes de robustez, HILValidacao matemática

Ciclo de vida do agente

          start()
|
setup() <- inicializa recursos
|
+--------+---------+
| while running: |
| step() | <- um tick da simulacao
| sync.tick() | <- avanca o relogio
+--------+---------+
|
teardown() <- libera recursos

O transporte não e fechado pelo agente — seu ciclo de vida e gerenciado pelo código que criou o agente.