/// <summary> /// Is this trip feasible? /// </summary> /// <param name="trip">The trip</param> /// <returns>is it feasible</returns> public bool Feasible(ITrip trip) { //trip.Attach("go-access-station", -2); if (!trip.TripChain.Person.Licence || trip.TripChain.Person.Household.Vehicles.Length == 0) { return(false); } if (trip.OriginalZone.Distance(trip.DestinationZone) < goData.MinDistance) { return(false); } bool feasible = false; int[] accessStations = goData.GetClosestStations(trip.OriginalZone.ZoneNumber); int egressStationNum = goData.GetClosestStations(trip.DestinationZone.ZoneNumber)[0]; //same closest stations, skip it if (accessStations[0] == egressStationNum || egressStationNum == -1) { return(false); } ITransitStation egressStation = goData.GetStation(egressStationNum); int[] feasibleStations = new int[accessStations.Length]; int i = 0; foreach (int access in accessStations) { float duration, frequencyAtStart; duration = goData.GetAutoTime(trip.OriginalZone.ZoneNumber, access); frequencyAtStart = goData.GetGoFrequency(access, egressStation.StationNumber, trip.ActivityStartTime.ToFloat()); ITransitStation accessStation = goData.GetStation(access); if ( ((duration > 0) & (access != egressStationNum) & (frequencyAtStart > 0) & (access != -1) ) && duration + trip.ActivityStartTime.ToFloat() > goData.StartTime && duration + trip.ActivityStartTime.ToFloat() < goData.EndTime ) { feasible = true; feasibleStations[i++] = access; } } Array.Resize <int>(ref feasibleStations, i); trip.Attach("feasible-go-stations", feasibleStations); return(feasible); }
/// <summary> /// Calculating if an egress trip is feasible /// Assuming the go access Calculate V was called before this function /// </summary> /// <param name="trip">the trip</param> /// <returns>is this trip feasible?</returns> public bool Feasible(ITrip trip) { if (!trip.TripChain.Person.Licence || trip.TripChain.Person.Household.Vehicles.Length == 0) { return(false); } if (trip.OriginalZone.Distance(trip.DestinationZone) < GOData.MinDistance) { return(false); } int[] accessStations = GOData.GetClosestStations(trip.OriginalZone.ZoneNumber); int accessStation = -1; int egressStation = LatestAccessStation(trip.TripChain, trip, out ITrip accessTrip); if (egressStation == -1) { return(false); //there was no access prior to this egress } Time time = Time.Zero; foreach (int station in accessStations) { if ((time = new Time(GOData.GetTransitAccessTime(trip.OriginalZone.ZoneNumber, station))) > Time.Zero) { accessStation = station; } } if ((accessStation == -1)) { if (Walking == null) { return(false); } else { foreach (var station in accessStations) { ITransitStation transitStation = GOData.GetStation(station); if (transitStation.ClosestZone == -1) { continue; } ITrip intermediateTrip = TashaRuntime.CreateTrip(trip.TripChain, trip.OriginalZone, TashaRuntime.ZoneSystem.Get(transitStation.ClosestZone), Activity.Intermediate, trip.ActivityStartTime); if (Walking.Feasible(intermediateTrip)) { time = Walking.TravelTime(intermediateTrip.OriginalZone, intermediateTrip.DestinationZone, intermediateTrip.ActivityStartTime); trip.Attach("Walking", intermediateTrip); accessStation = station; //found a walking trip no need to look further break; } } } } if (time == Time.Zero) { return(false); } Time duration = time; //if there was an access before this egress if (egressStation == accessStation // ReSharper disable once CompareOfFloatsByEqualityOperator || GOData.GetGoFrequency(accessStation, egressStation, trip.ActivityStartTime.ToFloat()) == 0 || duration + trip.ActivityStartTime < new Time(GOData.StartTime) || duration + trip.ActivityStartTime > new Time(GOData.EndTime) ) { return(false); } return(true); }
/// <summary> /// Calculating if an egress trip is feasible /// Assuming the go access Calculate V was called before this function /// </summary> /// <param name="trip">the trip</param> /// <returns>is this trip feasible?</returns> public bool Feasible(ITrip trip) { if (!trip.TripChain.Person.Licence || trip.TripChain.Person.Household.Vehicles.Length == 0) { return(false); } if (trip.OriginalZone.Distance(trip.DestinationZone) < goData.MinDistance) { return(false); } int[] accessStations = goData.GetClosestStations(trip.OriginalZone.ZoneNumber); int accessStation = -1; ITrip accessTrip; int egressStation = LatestAccessStation(trip.TripChain, trip, out accessTrip); if (egressStation == -1) { return(false); //there was no access prior to this egress } Time time = Time.Zero; foreach (int station in accessStations) { if ((time = new Time(goData.GetTransitAccessTime(trip.OriginalZone.ZoneNumber, station))) > Time.Zero) { accessStation = station; } } if ((accessStation == -1) & (Walking == null)) { return(false); } if (accessStation == -1) { //No Feasible access station by Transit so attempt walk trip //no feasible accessStation when going by transit, try walking foreach (var station in accessStations) { ITransitStation transitStation = goData.GetStation(station); if (transitStation.ClosestZone == -1) { continue; } ITrip intermediateTrip = this.TashaRuntime.CreateTrip(trip.TripChain, trip.OriginalZone, this.TashaRuntime.ZoneSystem.Get(transitStation.ClosestZone), Activity.Intermediate, trip.ActivityStartTime); if (Walking.Feasible(intermediateTrip)) { time = Walking.TravelTime(intermediateTrip.OriginalZone, intermediateTrip.DestinationZone, intermediateTrip.ActivityStartTime); trip.Attach("Walking", intermediateTrip); accessStation = station; //found a walking trip no need to look further break; } } } if (time == Time.Zero) { return(false); } Time duration = time; //if there was an access before this egress if (egressStation == accessStation || goData.GetGoFrequency(accessStation, egressStation, trip.ActivityStartTime.ToFloat()) == 0 || duration + trip.ActivityStartTime < new Time(this.goData.StartTime) || duration + trip.ActivityStartTime > new Time(this.goData.EndTime) ) { return(false); } return(true); }