//Simplify IDM public static double IDM(IDMVehicle self, IDMVehicle front) { double vehicleLength = Simulator.VehicleManager.vehicleLength; double minSafeDistance = Simulator.VehicleManager.vehicleLength / 2; double safeTime = Simulator.VehicleManager.vehicleSafeTime; double vehicleAccelerationFactor = ((Simulator.VehicleManager.vehicleAccelerationFactor_KMH * 1000) / 3600); double vehicleBrakeFactor = ((Simulator.VehicleManager.vehicleBrakeFactor_KMH * 1000) / 3600); double speedLimit = Simulator.VehicleManager.vehicleMaxSpeed_KMH; double deltaV = .0, netD = 0, sFunction = 0, velocity = 0; if (front == null) { velocity = vehicleAccelerationFactor * (1 - Math.Pow(self.vehicle_speed_KMH / speedLimit, 4)); } else { deltaV = self.vehicle_speed_KMH - front.vehicle_speed_KMH; netD = front.location - self.location - vehicleLength; if (netD < minSafeDistance) netD = minSafeDistance; sFunction = minSafeDistance + self.vehicle_speed_KMH * safeTime + (self.vehicle_speed_KMH * deltaV / (2 * Math.Sqrt(vehicleAccelerationFactor * vehicleBrakeFactor))); velocity = vehicleAccelerationFactor * (1 - Math.Pow(self.vehicle_speed_KMH / speedLimit, 4) - Math.Pow(sFunction / netD, 2)); } velocity = Math.Round(velocity, 1, MidpointRounding.AwayFromZero); if (velocity < 0 && (velocity * -1) > vehicleBrakeFactor) velocity = vehicleBrakeFactor * -1; double nextSpeed = self.vehicle_speed_KMH + velocity; if (nextSpeed < 0) nextSpeed = 0; return nextSpeed; }
public int ReservationTime(int vehicles) { double vehicleLength = Simulator.VehicleManager.vehicleLength; double minSafeDistance = Simulator.VehicleManager.vehicleLength / 2; int signalLocation = System.Convert.ToInt16(vehicles * (vehicleLength + minSafeDistance)); List<IDMVehicle> vehicleQueue = new List<IDMVehicle>(); //Initial vehicles on the road int reservationTime = 0; for (int ID = 0; ID < vehicles; ID++) { IDMVehicle vehicle = new IDMVehicle(); vehicle.vehicle_ID = ID; vehicle.location = System.Convert.ToInt16(signalLocation - (ID * (vehicleLength + minSafeDistance) + minSafeDistance)); vehicleQueue.Add(vehicle); } //Calculate do { reservationTime++; //All vehicles run for (int i = 0; i < vehicleQueue.Count; i++) { if (i == 0) { vehicleQueue[i].Run(null); } else { vehicleQueue[i].Run(vehicleQueue[i - 1]); } } } while (vehicleQueue[vehicleQueue.Count() - 1].location < (signalLocation + vehicleLength)); //If the last vehicle exit, end return reservationTime; }
public void Run(IDMVehicle front) { double nextSpeed = ReservationTimeCalculation.IDM(this, front); int runDistance = System.Convert.ToInt16(Math.Round(((((vehicle_speed_KMH + nextSpeed) / 2) * 10 / 36)), 0, MidpointRounding.AwayFromZero)); location += runDistance; this.vehicle_speed_KMH = nextSpeed; speedRecord.Add(vehicle_speed_KMH); }