using System; using System.Collections.Generic; //using System.Linq; using System.Web; using System.Text; namespace AtomicCityBusScheduler { public class Trip { public string name; public Route aRoute; public List c1ArrivalTime; public List cWaitTime; public Trip() { c1ArrivalTime = new List(); cWaitTime = new List(); } public List cRouteLocation { get { return aRoute.cLocation; } } public Boolean isAtDestNearTime(AtomicCityBusScheduler.Location aLocation, int aTime, int aTolerance) { for (int i = 0; i < cRouteLocation.Count; i++) { if (cRouteLocation[i] == aLocation) { int time = this.c1ArrivalTime[i]; if ((time < aTime) & (time >= aTime - aTolerance)) { return true; } } } return false; } public Boolean overlaps(Trip bTrip) { int lastTime = c1ArrivalTime[c1ArrivalTime.Count - 1]; int firstTime = c1ArrivalTime[0]; if ((lastTime > bTrip.c1ArrivalTime[0]) & (lastTime < bTrip.c1ArrivalTime[c1ArrivalTime.Count - 1])) { return true; } if ((firstTime > bTrip.c1ArrivalTime[0]) & (firstTime < bTrip.c1ArrivalTime[c1ArrivalTime.Count - 1])) { return true; } return false; } public List cTime(AtomicCityBusScheduler.Location aLocation) { List cTimeDest = new List(); for (int i = 0; i < cRouteLocation.Count; i++) { if (cRouteLocation[i] == aLocation) { cTimeDest.Add(c1ArrivalTime[i]); } } return cTimeDest; } public Trip Copy() { Trip answer = new Trip(); answer.aRoute = aRoute; answer.c1ArrivalTime = new List(); answer.c1ArrivalTime.AddRange(c1ArrivalTime); answer.cWaitTime = new List(); answer.cWaitTime.AddRange(cWaitTime); return answer; } public JoinedTrip Append1(Trip aTrip) { JoinedTrip answer = new JoinedTrip(); answer.cLocation.AddRange(this.cRouteLocation); answer.c1ArrivalTime.AddRange(this.c1ArrivalTime); answer.cWaitTime.AddRange(this.cWaitTime); if (this.cRouteLocation[this.cRouteLocation.Count - 1] == aTrip.cRouteLocation[0]) { int nLocation = aTrip.cRouteLocation.Count; for (int i = 1; i < nLocation; i++) {// skip first location to avoid duplication. answer.cLocation.Add(aTrip.cRouteLocation[i]); answer.c1ArrivalTime.Add(aTrip.c1ArrivalTime[i]); answer.cWaitTime.Add(aTrip.cWaitTime[i]); } } else { answer.cLocation.AddRange(aTrip.cRouteLocation); answer.c1ArrivalTime.AddRange(aTrip.c1ArrivalTime); answer.cWaitTime.AddRange(aTrip.cWaitTime); } return answer; } public JoinedTrip Append(Trip aTrip) { JoinedTrip answer = new JoinedTrip(); answer.cLocation.AddRange(this.cRouteLocation); answer.c1ArrivalTime.AddRange(this.c1ArrivalTime); answer.cWaitTime.AddRange(this.cWaitTime); answer.cLocation.AddRange(aTrip.cRouteLocation); answer.c1ArrivalTime.AddRange(aTrip.c1ArrivalTime); answer.cWaitTime.AddRange(aTrip.cWaitTime); int index = this.c1ArrivalTime.Count-1; answer.cWaitTime[index] = aTrip.c1ArrivalTime[0] - this.c1ArrivalTime[index]; return answer; } } public class TripPattern : Trip { public int repeatMinutes; public int firstRepeatTime; public int lastRepeatTime; public List cTrip; public TripPattern() : base() { } public List setcTrip() { cTrip = new List(); for (int time = firstRepeatTime; time <= lastRepeatTime; time = time + repeatMinutes) { Trip aTrip = new Trip(); List cTime = new List(); foreach (int aArrivalTime in c1ArrivalTime) { cTime.Add(time + aArrivalTime); } aTrip.c1ArrivalTime = cTime; aTrip.cWaitTime = this.cWaitTime; aTrip.aRoute = this.aRoute; aTrip.name = name; cTrip.Add(aTrip); } return cTrip; } public List yesterdaycTrip() { cTrip = new List(); for (int time = firstRepeatTime; time <= lastRepeatTime; time = time + repeatMinutes) { Trip aTrip = new Trip(); List cTime = new List(); foreach (int aArrivalTime in c1ArrivalTime) { cTime.Add(time + aArrivalTime); } aTrip.c1ArrivalTime = cTime; aTrip.cWaitTime = this.cWaitTime; aTrip.aRoute = this.aRoute; aTrip.name = name; cTrip.Add(aTrip); } return cTrip; } } public class JoinedTrip : Trip { public List cLocation; public JoinedTrip() : base() { cLocation = new List(); } public List startandEndTime(AtomicCityBusScheduler.Location startDest, AtomicCityBusScheduler.Location endDest, int aArrivalTime) { int endIndex = -1; for (int i = c1ArrivalTime.Count - 1; endIndex < 0; i--) { if ((cLocation[i] == endDest) & (c1ArrivalTime[i] < aArrivalTime)) { endIndex = i; } } int startIndex = -1; for (int i = endIndex - 1; (startIndex < 0) & (i >= 0); i--) { if (cLocation[i] == endDest) { endIndex = i; } if ((cLocation[i] == startDest) & (c1ArrivalTime[i] < c1ArrivalTime[endIndex])) { startIndex = i; } } int startTime = c1ArrivalTime[startIndex] + cWaitTime[startIndex]; int endTime = c1ArrivalTime[endIndex]; List startandEndTime = new List(); startandEndTime.Add(startTime); startandEndTime.Add(endTime); return startandEndTime; } } }