WasteEnvironment.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Collections.Generic;
  3. namespace MultiAgentSystemPCL
  4. {
  5. public delegate void EnvironmentUpdated(List<Waste> _waste, List<WasteAgent> _agents);
  6. public class WasteEnvironment
  7. {
  8. List<Waste> wasteList;
  9. List<WasteAgent> agents;
  10. public Random randomGenerator;
  11. double MAX_WIDTH;
  12. double MAX_HEIGHT;
  13. protected int nbIterations = 0;
  14. public event EnvironmentUpdated environmentUpdatedEvent;
  15. public WasteEnvironment(int _nbWaste, int _nbAgents, double _width, double _height, int _nbWasteTypes)
  16. {
  17. if (randomGenerator == null)
  18. {
  19. randomGenerator = new Random();
  20. }
  21. MAX_WIDTH = _width;
  22. MAX_HEIGHT = _height;
  23. wasteList = new List<Waste>();
  24. for (int i = 0; i < _nbWaste; i++)
  25. {
  26. Waste waste = new Waste(randomGenerator.NextDouble() * MAX_WIDTH, randomGenerator.NextDouble() * MAX_HEIGHT, randomGenerator.Next(_nbWasteTypes));
  27. wasteList.Add(waste);
  28. }
  29. agents = new List<WasteAgent>();
  30. for (int i = 0; i < _nbAgents; i++)
  31. {
  32. WasteAgent agent = new WasteAgent(randomGenerator.NextDouble() * MAX_WIDTH, randomGenerator.NextDouble() * MAX_HEIGHT, this);
  33. agents.Add(agent);
  34. }
  35. }
  36. public void Update()
  37. {
  38. foreach (WasteAgent agent in agents)
  39. {
  40. agent.UpdateDirection(wasteList);
  41. agent.UpdatePosition(MAX_WIDTH, MAX_HEIGHT);
  42. }
  43. nbIterations++;
  44. if (nbIterations % 500 == 0)
  45. {
  46. wasteList.Reverse();
  47. }
  48. if (environmentUpdatedEvent != null)
  49. {
  50. environmentUpdatedEvent(wasteList, agents);
  51. }
  52. }
  53. internal Waste TakeWaste(Waste _goal)
  54. {
  55. if (_goal.Size == 1)
  56. {
  57. wasteList.Remove(_goal);
  58. return _goal;
  59. }
  60. else
  61. {
  62. _goal.Decrease();
  63. Waste load = new Waste(_goal);
  64. return load;
  65. }
  66. }
  67. internal void SetWaste(Waste _goal)
  68. {
  69. _goal.Increase();
  70. }
  71. }
  72. }