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.

157 lines
4.8KB

  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 int getHistoryLength() { return historyLength; }
  40. public Track(int numberVehicles, float trackLength, float brakeProb, float maxVelocity, int waitTime, int historyLength) {
  41. this.trackLength = trackLength;
  42. this.brakeProb = brakeProb;
  43. this.maxVelocity = maxVelocity;
  44. this.vehicles = createVehiclesList(numberVehicles);
  45. this.vtrList = new LinkedList<>();
  46. this.sumAvgMemory = 0;
  47. this.sumDelAvgMemory = 0;
  48. this.overallAvg = 0;
  49. this.delayedAvg = 0;
  50. this.lastAvg = 0;
  51. this.historyLength = historyLength;
  52. this.waitTime = waitTime;
  53. this.steps = 0;
  54. this.listSemaphore = new Semaphore(1);
  55. }
  56. protected List<Vehicle> createVehiclesList(int numberVehicles){
  57. List<Vehicle> result = new ArrayList<>();
  58. for(int i=0;i<numberVehicles;i++){
  59. Vehicle vehicle = new Vehicle(i, i, this.maxVelocity, this.brakeProb, this.trackLength);
  60. result.add(vehicle);
  61. }
  62. return result;
  63. }
  64. public void setWaitTime(int waitTime) {
  65. this.waitTime = waitTime;
  66. }
  67. public void setBrakeProb(float brakeProb) {
  68. for (Vehicle v : this.vehicles) {
  69. v.setBrakeProb(brakeProb);
  70. }
  71. }
  72. public void setMaxVelocity(float maxVelocity) {
  73. for (Vehicle v : this.vehicles) {
  74. v.setMaxVelocity(maxVelocity);
  75. }
  76. }
  77. public void timeElapse() {
  78. for(int i=0; i<vehicles.size();i++) {
  79. Vehicle v = vehicles.get(i);
  80. int forerunnerIndex = i + 1;
  81. if (forerunnerIndex >= vehicles.size()) {
  82. forerunnerIndex -= vehicles.size();
  83. }
  84. Vehicle forerunner = vehicles.get(forerunnerIndex);
  85. float distanceForerunner = forerunner.getPosition() - v.getPosition() - 1;
  86. if(distanceForerunner < 0.0){
  87. distanceForerunner += this.trackLength;
  88. }
  89. v.updateVelocity(distanceForerunner);
  90. }
  91. try {
  92. this.listSemaphore.acquire();
  93. } catch (InterruptedException ex) {return;}
  94. List <VehicleTimeRecord> records = new ArrayList<>(vehicles.size());
  95. this.vtrList.add(records);
  96. if (this.vtrList.size() > this.historyLength) {
  97. this.vtrList.remove(0);
  98. }
  99. for(Vehicle v: vehicles){
  100. v.timeElapse();
  101. VehicleTimeRecord vtr = new VehicleTimeRecord(v.id, v.position, v.curVelocity, v.maxVelocity);
  102. records.add(vtr);
  103. }
  104. steps++;
  105. this.listSemaphore.release();
  106. update_avg();
  107. this.setChanged();
  108. //this.notifyObservers();
  109. this.clearChanged();
  110. //LockSupport.parkNanos(1);
  111. try {
  112. Thread.sleep(waitTime);
  113. } catch (InterruptedException ex) { }
  114. }
  115. public float avg_step(int step){
  116. float sum_step = 0;
  117. for (VehicleTimeRecord r : vtrList.get(step)) {
  118. sum_step += r.velocity;
  119. }
  120. return sum_step / vehicles.size();
  121. }
  122. protected void update_avg(){
  123. lastAvg = avg_step(vtrList.size()-1);
  124. if (this.steps > 10) {
  125. sumDelAvgMemory += lastAvg;
  126. delayedAvg = sumDelAvgMemory / (this.steps - 10);
  127. }
  128. sumAvgMemory += lastAvg;
  129. overallAvg = sumAvgMemory / this.steps;
  130. }
  131. public float avg_span(int start, int end){
  132. float sum_span = 0;
  133. for (int i=start; i <end;i++){
  134. sum_span += avg_step(i);
  135. }
  136. return sum_span / (end-start+1);
  137. }
  138. }