Esempio n. 1
0
        protected void OnTimedEvent()
        {
            if (ReplyWaitingList?.Any() != true)
            {
                return;
            }

            foreach (var message in ReplyWaitingList)
            {
                if ((Time.GlobalSimulationTime - message.RoutingTime) > 50 && message.RoutingTime != -1)
                {
                    if (message.ReceiverAgent is Ruler)
                    {
                        var adaptListMessage = AdaptingWaitingList.Find(tempMessage =>
                                                                        tempMessage.SenderAgentId == message.SenderAgentId &&
                                                                        tempMessage.ReceiverAgentId == message.ReceiverAgentId);

                        if (adaptListMessage == null)
                        {
                            AdaptingWaitingList.Add(message.Copy());
                            SendBroadcastMessage(this, this, BroadcastType.MessengersToRulersBroadcast,
                                                 MessagesContent.LostRuler, 1);
                        }

                        else
                        {
                            message.RoutingTime = Time.GlobalSimulationTime;
                            SendBroadcastMessage(this, this, BroadcastType.MessengersToRulersBroadcast,
                                                 MessagesContent.LostRuler, 2);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        public override void UpdateOneMillisecond()
        {
            base.UpdateOneMillisecond();
            var period = Config.Rnd.Next(10000, 10100);

            if (Time.GlobalSimulationTime % period == 0) // ping per 1sec
            {
                var messenger = FindNearestMessenger();
                if (messenger == null)
                {
                    return;
                }
                var ping = new Message()
                {
                    RoutingTime            = Time.GlobalSimulationTime,
                    SenderAgent            = this,
                    SenderAgentId          = AgentId,
                    CurrentSenderAgent     = this,
                    CurrentReceiverAgent   = messenger,
                    CurrentReceiverAgentId = messenger.AgentId,
                    ReceiverAgent          = LeaderAgent,
                    ReceiverAgentId        = LeaderAgent.AgentId,
                    MessageType            = BroadcastType.SendReceive,
                    MessageContent         = MessagesContent.Ping,
                    DataMessageText        = ""
                };
                SendMessage(ping);
                ReplyWaitingList.Add(ping);
            }

            CheckPingList();
        }
Esempio n. 3
0
        protected void CheckPingList()
        {
            var expiredPing = ReplyWaitingList.Find(m => Time.GlobalSimulationTime - m.RoutingTime > MaxPingDelay);

            if (expiredPing?.ReceiverAgent is Leader)
            {
                // Leader is lost
                var messenger = FindNearestMessenger();
                if (messenger != null)
                {
                    ReplyWaitingList.Remove(expiredPing); // remove to prevent duplicate request
                    if (expiredPing.ReceiverAgentId != LeaderAgent.AgentId)
                    {
                        return;
                    }
                    var ping = new Message()
                    {
                        RoutingTime            = Time.GlobalSimulationTime,
                        SenderAgent            = this,
                        SenderAgentId          = AgentId,
                        CurrentSenderAgent     = this,
                        CurrentReceiverAgent   = messenger,
                        CurrentReceiverAgentId = messenger.AgentId,
                        ReceiverAgent          = messenger,
                        ReceiverAgentId        = messenger.AgentId,
                        MessageType            = BroadcastType.SingleCast,
                        MessageContent         = MessagesContent.LostLeader,
                        DataMessageText        = LeaderAgent.AgentId
                    };
                    SendMessage(ping);
                }
            }
        }
Esempio n. 4
0
        protected void ProcessMessage(Message message)
        {
            if (message.MessageContent == MessagesContent.ReplyRulerNum)
            {
                if (message.RulerPingReply != null)
                {
                    if (AdaptingWaitingList.Count > 0)
                    {
                        foreach (var adaptingMessage in AdaptingWaitingList)
                        {
                            SendMessage(this, this, adaptingMessage.SenderAgent, adaptingMessage.SenderAgentId,
                                        BroadcastType.SingleCast, MessagesContent.ReplyRulerNum, message.RulerPingReply);

                            var replyListMessage = ReplyWaitingList.Find(tempMessage =>
                                                                         tempMessage.SenderAgent == adaptingMessage.SenderAgent);
                            ReplyWaitingList.Remove(replyListMessage);
                        }


                        AdaptingWaitingList.Clear();
                    }
                }
            }
            else if (message.MessageContent == MessagesContent.LostLeader) // reply worker to assign it to leader of team
            {
                var team        = Container.TeamList.Find(t => t.ActiveLeader.AgentId == message.DataMessageText);
                var tempMessage = new Message()
                {
                    SenderAgent        = this,
                    SenderAgentId      = AgentId,
                    CurrentSenderAgent = this,
                    ReceiverAgent      = message.SenderAgent,
                    ReceiverAgentId    = message.SenderAgent.AgentId,
                    MessageType        = BroadcastType.SingleCast,
                    MessageContent     = MessagesContent.AssignLeader,
                    DataMessageText    = "GetTeamData",
                    Data = team
                };
                SendMessage(tempMessage);
            }
            else if (message.MessageContent == MessagesContent.AssignLeader)
            {
                if (message.Data is Team team && message.SenderAgent is Leader leader)
                {
                    foreach (var worker in team.AgentsArray)
                    {
                        worker.LeaderAgent = leader;
                    }

                    Time.OursAdaptingTime = Time.GlobalSimulationTime;
                }
            }
        }
Esempio n. 5
0
        public override void OnMessage(Message message)
        {
            if (Status == State.Failed)
            {
                return;
            }

            if (message.MessageContent == MessagesContent.PingReply)
            {
                var index = ReplyWaitingList.FindIndex(m => m.ReceiverAgentId == message.SenderAgentId);
                if (index >= 0)
                {
                    ReplyWaitingList.RemoveAt(index);
                }
            }
            else if (message.MessageContent == MessagesContent.AssignLeader &&
                     message.Data is Team team)
            {
                // assign self as leader
                var leader = new Leader(team, Config, Position, "L" + AgentId, Container);
                team.LeadersHistory.Add(leader);
                team.AgentsArray.Remove(this);
                // aware other workers of this team
                var awareMessage = new Message()
                {
                    RoutingTime            = Time.GlobalSimulationTime,
                    SenderAgent            = leader,
                    SenderAgentId          = leader.AgentId,
                    CurrentSenderAgent     = this,
                    CurrentReceiverAgent   = message.SenderAgent,
                    CurrentReceiverAgentId = message.SenderAgent.AgentId,
                    ReceiverAgent          = message.SenderAgent,
                    ReceiverAgentId        = message.SenderAgent.AgentId,
                    MessageType            = BroadcastType.MessengerToWorkersBroadcast,
                    MessageContent         = MessagesContent.AssignLeader,
                    Data = team
                };
                SendMessage(awareMessage);
            }
        }
Esempio n. 6
0
        public override void OnMessage(Message message)
        {
            if (Status == State.Failed)
            {
                return;
            }

            if (message.ReceiverAgentId == AgentId)
            {
                ProcessMessage(message);
            }

            else if (message.ReceiverAgentId == "-1")
            {
                message.CurrentReceiverAgentId = "-1";
                message.CurrentSenderAgent     = this;
                message.CurrentSenderAgentId   = AgentId;
                message.RoutingList.Add(this);
                Container.ContainerMedia.SendMessage(message.Copy());
            }

            else if (Position.Position.CalculateDistance(message.ReceiverAgent.Position.Position) <= RadioRange)
            {
                if (message.MessageContent == MessagesContent.Ping)
                {
                    message.RoutingTime            = Time.GlobalSimulationTime;
                    message.CurrentReceiverAgentId = message.ReceiverAgentId;
                    message.CurrentReceiverAgent   = message.ReceiverAgent;
                    message.CurrentSenderAgentId   = AgentId;
                    message.CurrentSenderAgent     = this;

                    message.RoutingList.Add(this);
                    ReplyWaitingList.Add(message.Copy());
                    Container.ContainerMedia.SendMessage(message.Copy());
                }
                else if (message.MessageContent == MessagesContent.PingReply)
                {
                    message.CurrentReceiverAgentId = message.ReceiverAgentId;
                    message.CurrentReceiverAgent   = message.ReceiverAgent;
                    message.CurrentSenderAgentId   = AgentId;
                    message.CurrentSenderAgent     = this;
                    message.RoutingList.Add(this);
                    Container.ContainerMedia.SendMessage(message.Copy());
                    foreach (var pingMessage in ReplyWaitingList)
                    {
                        if (pingMessage.ReceiverAgent == message.SenderAgent)
                        {
                            ReplyWaitingList.Remove(pingMessage);
                            break;
                        }
                    }
                }

                else
                {
                    message.CurrentReceiverAgentId = message.ReceiverAgentId;
                    message.CurrentReceiverAgent   = message.ReceiverAgent;
                    message.CurrentSenderAgentId   = AgentId;
                    message.CurrentSenderAgent     = this;
                    message.RoutingList.Add(this);
                    Container.ContainerMedia.SendMessage(message.Copy());
                }
            }

            else
            {
                if (message.MessageContent == MessagesContent.PingReply)
                {
                    foreach (var pingMessage in ReplyWaitingList)
                    {
                        if (pingMessage.ReceiverAgent == message.SenderAgent)
                        {
                            ReplyWaitingList.Remove(pingMessage);
                            break;
                        }
                    }
                }


                var mAgent = FindNearestMessenger(Position, message.ReceiverAgent.Position, message);
                if (mAgent == null)
                {
                    RadioRange += 50;
                    OnMessage(message);
                    return;
                }
                message.CurrentReceiverAgentId = mAgent.AgentId;
                message.CurrentReceiverAgent   = mAgent;
                message.CurrentSenderAgent     = this;
                message.CurrentSenderAgentId   = AgentId;
                message.RoutingList.Add(this);
                Container.ContainerMedia.SendMessage(message.Copy());
            }
        }