private static void SimulateAverageRumorSpread(int NumberOfRuns, int DurationInMinutes, int NumberOfParticipants) { CommunitySpreadStatistics[,] TraceFileData = new CommunitySpreadStatistics[NumberOfRuns + 1, DurationInMinutes]; CommunitySpreadStatistics[] PartyTrace = new CommunitySpreadStatistics[DurationInMinutes]; for (int RunCount = 0; RunCount < NumberOfRuns; RunCount++) { PartyTrace = SimulateParty(DurationInMinutes, NumberOfParticipants, true); for (int i = 0; i < DurationInMinutes; i++) { TraceFileData[RunCount, i] = PartyTrace[i]; //Populate The Average Structure TraceFileData[NumberOfRuns, i].MinutesElapsed = i; TraceFileData[NumberOfRuns, i].PercentAwareOfRumor += PartyTrace[i].PercentAwareOfRumor; TraceFileData[NumberOfRuns, i].CountAwareOfRumor += PartyTrace[i].CountAwareOfRumor; } } //Calculate the Averages in the Index of the Structure for (int i = 0; i < DurationInMinutes; i++) { TraceFileData[NumberOfRuns, i].PercentAwareOfRumor = TraceFileData[NumberOfRuns, i].PercentAwareOfRumor / NumberOfRuns; TraceFileData[NumberOfRuns, i].CountAwareOfRumor = TraceFileData[NumberOfRuns, i].CountAwareOfRumor / NumberOfRuns; } GenerateFile(TraceFileData, NumberOfRuns, NumberOfParticipants, DurationInMinutes); }
private static CommunitySpreadStatistics[] SimulateParty(int DurationInMinutes, int NumberOfGuests, Boolean OnlyCountUniqueSpread) { //Initialize The Trace Array CommunitySpreadStatistics[] PartyTrace = new CommunitySpreadStatistics[DurationInMinutes]; //Initialize Guests and Pairing List Person[] GuestList = new Person[NumberOfGuests]; int[] PairingList = new int[NumberOfGuests]; for (int i = 0; i < NumberOfGuests; i++) { //Generate Guest if (i == 0) { GuestList[i].HasHeardRumor = true; } else { GuestList[i].HasHeardRumor = false; } GuestList[i].FirstInformedBy = -1; GuestList[i].SecondInformedBy = -1; GuestList[i].InformedByCount = 0; GuestList[i].ProbabilityOfSpreadingTheRumor = 0.5f; GuestList[i].Id = i; //Add Guest ID to Pairing List PairingList[i] = i; } //Simulate Party for (int TimeElapsed = 0; TimeElapsed < DurationInMinutes; TimeElapsed++) { PairingList = FisherYatesShuffle(PairingList, PairingList.Length); PartyTrace[TimeElapsed].MinutesElapsed = TimeElapsed + 1; //Assume that only an Even Number of Guests are Present for (int i = 1; i < NumberOfGuests; i += 2) { int PersonAIndex = i - 1; int PersonBIndex = i; Person PersonA = GuestList[PairingList[PersonAIndex]]; Person PersonB = GuestList[PairingList[PersonBIndex]]; Boolean PersonAWantsToTellRumor = WillSpreadRumor(GuestList[i - 1]); Boolean PersonBWantsToTellRumor = WillSpreadRumor(GuestList[i]); //Assume once one person brings the rumor it discourages their conversation partner from bringing it up if (PersonAWantsToTellRumor && PersonBWantsToTellRumor) { Random r = new Random(); if (r.NextDouble() < 0.5) { PersonAWantsToTellRumor = false; } else { PersonBWantsToTellRumor = false; } } //Person A Tells Person B if (PersonAWantsToTellRumor) { if (OnlyCountUniqueSpread && PersonB.FirstInformedBy != PersonA.Id) { PersonB.InformedByCount += 1; PersonB.HasHeardRumor = true; PersonB.FirstInformedBy = PersonA.Id; } else { PersonB.InformedByCount += 1; PersonB.HasHeardRumor = true; PersonB.FirstInformedBy = PersonA.Id; } } //Person B Tells Person A if (PersonBWantsToTellRumor) { if (OnlyCountUniqueSpread && PersonA.FirstInformedBy != PersonB.Id) { PersonA.InformedByCount += 1; PersonA.HasHeardRumor = true; PersonA.FirstInformedBy = PersonB.Id; } else { PersonB.InformedByCount += 1; PersonB.HasHeardRumor = true; PersonB.FirstInformedBy = PersonB.Id; } } //Update Trace and Record Changes if (PersonA.HasHeardRumor == true) { PartyTrace[TimeElapsed].CountAwareOfRumor += 1; } GuestList[PairingList[PersonAIndex]] = PersonA; if (PersonB.HasHeardRumor == true) { PartyTrace[TimeElapsed].CountAwareOfRumor += 1; } GuestList[PairingList[PersonBIndex]] = PersonB; } PartyTrace[TimeElapsed].PercentAwareOfRumor = (float)PartyTrace[TimeElapsed].CountAwareOfRumor / NumberOfGuests; } return(PartyTrace); }