agent.py 2.00 KiB
import sys
from ast import literal_eval
from typing import Dict
from tool.schedulable import Schedulable
class Agent(Schedulable):
def __init__(self, identifier: int) -> None:
self.id = identifier
Schedulable.__init__(self, client_id="Agent" + str(self.id))
self.subscribe("scheduler/agent/wakeup", self.wake_up)
self.neighbors = []
self.next_neighbors = []
self.subscribe("amas/agent/" + str(self.id) + "/neighbor", self.add_neighbor)
self.on_initialization()
self.publish("cycle_done", "")
print("init done")
def on_initialization(self):
pass
def add_neighbor(self, client, userdata, message):
print(message.payload.decode("utf-8"))
result = literal_eval(message.payload.decode("utf-8"))
self.next_neighbors.append(result)
def log(self, message: str) -> None:
self.client.publish(
"agent/" + str(self.id) + "/log",
"[AGENT] " + str(self.id) + " : " + message
)
return
def publish(self, topic: str, message) -> None:
self.client.publish("agent/" + str(self.id) + "/" + topic, message)
def on_cycle_begin(self):
self.log("on_cycle_begin")
def on_perceive(self):
self.log("on_perceive")
def on_decide(self):
self.log("on_decide")
def on_act(self):
self.log("on_act")
def on_cycle_end(self):
self.log("on_cycle_end")
def send_metric(self) -> Dict:
return {"id": self.id}
def run(self):
while not self.exit_bool:
self.wait()
if self.exit_bool:
return
self.on_cycle_begin()
self.on_perceive()
self.on_decide()
self.on_act()
self.on_cycle_end()
self.publish("metric", str(self.send_metric()))
self.publish("cycle_done", "")
if __name__ == '__main__':
print("id agent: ", int(sys.argv[1]))
a = Agent(int(sys.argv[1]))
a.run()