Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }