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.

156 lines
4.7KB

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