private List<SimulationObject> GenerateHousholdsComposite(SpatialZone currZone, int numHousehold, HouseholdPersonComposite initAgent, bool warmUpStatus, List<ConditionalDistribution> mobelCond, OutputFileWriter currWriter) { int seltdDim = 0; int seltAgnt = 0; List<ConditionalDistribution> condHhldList = currZone.GetDataHhldCompositeCollectionsListH(); List<ConditionalDistribution> condPerList = currZone.GetDataHhldCompositeCollectionsListP(); var generatedAgents = new List<SimulationObject>(); HouseholdPersonComposite prevAgent = initAgent; ImportanceSampler currImpSampler = new ImportanceSampler(); Random rnd = new Random(); int iter = 0; if (warmUpStatus == true) { iter = Constants.WARMUP_ITERATIONS; } else { iter = Constants.SKIP_ITERATIONS * numHousehold; } HouseholdPersonComposite newAgent; StringBuilder builder = new StringBuilder(); for (int i = 0; i < iter; i++) { // with equal probablity select one of the hhld or persons seltAgnt = randGen.NextInRange(0, prevAgent.getPersons().Count()); //Change Hhld object if (seltAgnt == 0) { seltdDim = randGen.NextInRange(0, condHhldList.Count - 1); ConditionalDistribution currDist = condHhldList[seltdDim]; var currComm = currDist.GetCommulativeValue ( prevAgent , currZone, -1); newAgent = (HouseholdPersonComposite)GenerateNextAgent (currComm, prevAgent, currDist.GetDimensionName (), -1); } //Change person object else { seltdDim = randGen.NextInRange(0, condPerList.Count - 1); ConditionalDistribution currDist = condPerList[seltdDim]; // Select randomly one person from the collection, whose attribute is changed int personId = rnd.Next(0, prevAgent.getPersons().Count - 1); // Importance sampling for the Age if (currDist.GetDimensionName() == "Age") { newAgent = (HouseholdPersonComposite) currImpSampler.GetNextAgent( currZone.GetHousholdSizeDist(), currDist, currDist.GetDimensionName(), prevAgent, currZone, personId); } else { var currComm = currDist.GetCommulativeValue ( prevAgent , currZone, personId); newAgent = (HouseholdPersonComposite)GenerateNextAgent (currComm, prevAgent, currDist.GetDimensionName (), personId); } //Consistency check ((HouseholdPersonComposite) newAgent).CheckConsistency(); } prevAgent = newAgent; if (warmUpStatus == false && (i % Constants.SKIP_ITERATIONS == 0)) { generatedAgents.Add(newAgent); builder.Append(newAgent.getHousehold().GetZoneID()); builder.Append(','); builder.Append((int)newAgent.getHousehold().GetDwellingType()); builder.Append(','); builder.Append((int)newAgent.getHousehold().GetHhldSize()); builder.Append(','); builder.Append((int)newAgent.getHousehold().GetNumOfKids()); builder.Append(','); builder.Append((int)newAgent.getHousehold().GetNumOfCars()); builder.Append(','); //builder.Append(currZone.GetEPFLName()); builder.Append(','); //builder.Append((int)newAgent.getHousehold().GetNumOfWorkers()); builder.Append(','); //builder.Append((int)newAgent.getHousehold().GetNumOfUnivDegree()); builder.Append(','); //builder.Append((int)newAgent.getHousehold().GetIncomeLevel()); builder.Append(','); foreach (Person person in newAgent.getPersons()) { builder.Append((int)person.GetAge()); builder.Append(','); builder.Append((int)person.GetDrivingLicense()); builder.Append(','); builder.Append((int)person.GetEmploymentStatus()); builder.Append(','); builder.Append((int)person.GetOccupation()); builder.Append(','); builder.Append((int)person.GetSex()); //builder.Append((int)person.GetEducationLevel()); } currWriter.WriteToFile(builder.ToString()); builder.Clear(); } } return generatedAgents; }