You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
4.1KB

  1. package de.hems.trafficsim;
  2. import java.util.ArrayList;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.Observable;
  6. public class Track extends Observable {
  7. protected List<Vehicle> vehicles;
  8. protected List<List<VehicleTimeRecord>> vtrList;
  9. protected float trackLength;
  10. protected float sumAvgMemory;
  11. protected float sumDelAvgMemory;
  12. protected int historyLength;
  13. protected float overallAvg;
  14. protected float delayedAvg;
  15. protected float lastAvg;
  16. protected int waitTime;
  17. protected float maxVelocity;
  18. protected float brakeProb;
  19. public List<List<VehicleTimeRecord>> getVtrList() { return vtrList; }
  20. public float getOverallAvg() {
  21. return overallAvg;
  22. }
  23. public float getLastAvg() {
  24. return lastAvg;
  25. }
  26. public float getDelayedAvg() { return delayedAvg; }
  27. public List<Vehicle> getVehicles() {
  28. return vehicles;
  29. }
  30. public float getTrackLength() {
  31. return trackLength;
  32. }
  33. public Track(int numberVehicles, float trackLength, float brakeProb, float maxVelocity, int waitTime) {
  34. this.trackLength = trackLength;
  35. this.brakeProb = brakeProb;
  36. this.maxVelocity = maxVelocity;
  37. this.vehicles = createVehiclesList(numberVehicles);
  38. this.vtrList = new LinkedList<>();
  39. this.sumAvgMemory = 0;
  40. this.sumDelAvgMemory = 0;
  41. this.overallAvg = 0;
  42. this.delayedAvg = 0;
  43. this.lastAvg = 0;
  44. this.historyLength = 25;
  45. this.waitTime = waitTime;
  46. }
  47. protected List<Vehicle> createVehiclesList(int numberVehicles){
  48. List<Vehicle> result = new ArrayList<>();
  49. for(int i=0;i<numberVehicles;i++){
  50. Vehicle vehicle = new Vehicle(i, i, this.maxVelocity, this.brakeProb, this.trackLength);
  51. result.add(vehicle);
  52. }
  53. return result;
  54. }
  55. public void setWaitTime(int waitTime) {
  56. this.waitTime = waitTime;
  57. }
  58. public void setBrakeProb(float brakeProb) {
  59. for (Vehicle v : this.vehicles) {
  60. v.setBrakeProb(brakeProb);
  61. }
  62. }
  63. public void setMaxVelocity(float maxVelocity) {
  64. for (Vehicle v : this.vehicles) {
  65. v.setMaxVelocity(maxVelocity);
  66. }
  67. }
  68. public void timeElapse() {
  69. for(int i=0; i<vehicles.size();i++) {
  70. Vehicle v = vehicles.get(i);
  71. int forerunnerIndex = i + 1;
  72. if (forerunnerIndex >= vehicles.size()) {
  73. forerunnerIndex -= vehicles.size();
  74. }
  75. Vehicle forerunner = vehicles.get(forerunnerIndex);
  76. float distanceForerunner = forerunner.getPosition() - v.getPosition() - 1;
  77. if(distanceForerunner < 0.0){
  78. distanceForerunner += this.trackLength;
  79. }
  80. v.updateVelocity(distanceForerunner);
  81. }
  82. List <VehicleTimeRecord> records = new ArrayList<>(vehicles.size());
  83. this.vtrList.add(records);
  84. for(Vehicle v: vehicles){
  85. v.timeElapse();
  86. VehicleTimeRecord vtr = new VehicleTimeRecord(v.id, v.position, v.curVelocity, v.maxVelocity);
  87. records.add(vtr);
  88. }
  89. update_avg();
  90. this.setChanged();
  91. this.notifyObservers();
  92. this.clearChanged();
  93. try {
  94. Thread.sleep(waitTime);
  95. } catch (InterruptedException ex) { }
  96. }
  97. public float avg_step(int step){
  98. float sum_step = 0;
  99. for (VehicleTimeRecord r : vtrList.get(step)) {
  100. sum_step += r.velocity;
  101. }
  102. return sum_step / vehicles.size();
  103. }
  104. protected void update_avg(){
  105. lastAvg = avg_step(vtrList.size()-1);
  106. if (this.vtrList.size() > 10) {
  107. sumDelAvgMemory += lastAvg;
  108. delayedAvg = sumDelAvgMemory / (vtrList.size() - 10);
  109. }
  110. sumAvgMemory += lastAvg;
  111. overallAvg = sumAvgMemory / vtrList.size();
  112. }
  113. public float avg_span(int start, int end){
  114. float sum_span = 0;
  115. for (int i=start; i <end;i++){
  116. sum_span += avg_step(i);
  117. }
  118. return sum_span / (end-start+1);
  119. }
  120. }