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. }
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); } }
// 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(); }