/// <summary> /// Runs the ModeChoice model on the given household /// </summary> /// <param name="h">The household to run on</param> public bool Run(ITashaHousehold h) { // Compute the error terms and feasibility of non shared modes ComputeErrorTerms(h); //there are no "trip chains" so return true for (int i = 0; i < this.HouseholdIterations; i++) { // To start with Generate the LogLikelyhoods if (i == 0) { foreach (var person in h.Persons) { person.CalculateLoglikelihood(); } } else { // on ever other one just update the utilities h.UpdateUtilities(); } ModeChoiceHousehold.ModeAssignmentHouseHold result = h.ResolveConflicts(); //assign the best mode to each trip to prep for pass 3 if (result == ModeChoiceHousehold.ModeAssignmentHouseHold.ADVANCED_CASE) { List <ITripChain> l = h.AllTripChains(); IVehicleType[] vt = ModeChoiceHousehold.FindBestPossibleAssignment(l, new List <IVehicle>(h.Vehicles)); if (vt != null) { AssignBestMode(h, vt); } else { // TODO: should assign best possible vehicle even if // someone cannot execute their tripchain since they can // be passengers return(false); } } else if (result == ModeChoiceHousehold.ModeAssignmentHouseHold.SIMPLE_CASE) { AssignBestMode(h); } else if (result == ModeChoiceHousehold.ModeAssignmentHouseHold.NULL_SET) { ReleaseModeSets(h); return(false); } //pass 3 h.MultiPersonMode(); //finally store it to the list of "generated" realities DoAssignment(h, i); } ReleaseModeSets(h); return(true); }
/// <summary> /// Assigns the best mode to each trip in the trip chain for use in pass 3. (No Conflict Vers.) /// </summary> /// <param name="household"></param> private void AssignBestMode(ITashaHousehold household) { foreach (var person in household.Persons) { foreach (var tripChain in person.TripChains) { ModeSet[] tripset = (ModeSet[])tripChain["BestForVehicle"]; ModeSet bestSet; var trips = tripChain.Trips; if ((bestSet = tripset[ModeChoiceHousehold.BestVehicle(tripset)]) != null) { for (int i = 0; i < bestSet.Length; i++) { trips[i].Mode = bestSet.ChosenMode[i]; } } } } }