Beispiel #1
0
        public event EnvironmentUpdated environmentUpdatedEvent; // un évènement indiquant qu’elle est terminée (la mise à jour).

        public WasteEnvironment(int _nbWaste, int _nbAgents, double _width, double _height, int _nbWasteTypes)
        {
            // Par : paramètre le nombre de déchets, d’agents, la taille de l’environnement et le nombre de types de déchets.
            if (randomGenerator == null)
            {
                randomGenerator = new Random();
            }
            MAX_WIDTH  = _width;
            MAX_HEIGHT = _height;

            // Creation des dechets.
            wasteList = new List <Waste>();
            for (int i = 0; i < _nbWaste; i++)
            {
                Waste waste = new Waste(randomGenerator.NextDouble() * MAX_WIDTH, randomGenerator.NextDouble() * MAX_HEIGHT, randomGenerator.Next(_nbWasteTypes));
                wasteList.Add(waste);
            }

            // Creation des agents.
            agents = new List <WasteAgent>();
            for (int i = 0; i < _nbAgents; i++)
            {
                WasteAgent agent = new WasteAgent(randomGenerator.NextDouble() * MAX_WIDTH, randomGenerator.NextDouble() * MAX_HEIGHT, this);
                agents.Add(agent);
            }
        }
        internal void UpdateDirection(List <Waste> _wasteList)
        {
            /* Où aller ?*/
            // Trie : Tous les dechets pour lesquels l'agent se trouve dans la zone d'influence.
            List <Waste> inZone = _wasteList.Where(x => DistanceTo(x) < x.Zone).OrderBy(x => DistanceTo(x)).ToList();

            Waste goal;

            if (load == null)                   // Si nous ne portons aucune charge
            {
                goal = inZone.FirstOrDefault(); // Nous nous dirigeons vers le dechet le plus proche.
            }
            else // Sinon
            {
                goal = inZone.Where(x => x.Type == load.Type).FirstOrDefault();                 // Nous nous dirigeons vers le Tas le plus proche ayant le meme type que le dechet porté.
            }

            /* Avons-nous un but ?*/
            if (goal == null || busy)             // Nous avons aucun element dans inZone (l'agent ne se trouve dans aucune zone d'influence) | element venant juste d'etre recupéré ou posé.
            {
                // Pas de but, se déplacer aléatoirement
                if (env.randomGenerator.NextDouble() < CHANGE_DIRECTION_PROB)
                {
                    speedX = env.randomGenerator.NextDouble() - 0.5;
                    speedY = env.randomGenerator.NextDouble() - 0.5;
                }
                if (busy && goal == null)
                {
                    busy = false;
                }
            }
            else             // Nous avons au moins un element dans inZone (l'agent se trouve dans une zone d'influence).
            {
                // Aller au but
                speedX = goal.PosX - PosX;
                speedY = goal.PosY - PosY;

                // But atteint ? Prendre ou déposer une charge
                if (DistanceTo(goal) < STEP)
                {
                    if (load == null) // Porte pas de charge.
                    {
                        if (env.randomGenerator.NextDouble() < goal.ProbaToTake())
                        {
                            load = env.TakeWaste(goal);                             // Retrait de la charge a l'environnement et stockage dans load.
                        }
                    }
                    else // Porte une charge.
                    {
                        env.SetWaste(goal); // Ajout de la charge a l'environnement.
                        load = null;
                    }
                    busy = true;                     // ne pas redéposer de suite l’objet récupéré ou de reprendre un élément que l’on viendrait juste de poser
                }
            }

            Normalize(); // On normalise.
        }
Beispiel #3
0
 internal Waste TakeWaste(Waste _goal)
 {
     if (_goal.Size == 1)               // s’il n’y a qu’un élément.
     {
         wasteList.Remove(_goal);       // On supprime alors le tas de la liste des déchets.
         return(_goal);                 //  l’agent va le récupérer
     }
     else                               // Si par contre le tas contient plusieurs éléments.
     {
         _goal.Decrease();              // on va juste le décrémenter.
         Waste load = new Waste(_goal); // renvoyer un nouvel élément créé par copie (et donc ayant une charge de 1).
         return(load);
     }
 }
Beispiel #4
0
 // indiquer qu’un agent a déposé un nouvel élément sur un tas existant : incrémenter la taille du tas visé.
 internal void SetWaste(Waste _goal)
 {
     _goal.Increase();
 }