示例#1
0
        public static double[] Asynchroon(int aantalSimulaties, int aantalRijen, int aantalKolommen, CancellationTokenSource cts)
        {
            int aantalVelden = aantalRijen * aantalKolommen;
            int bovenkant    = aantalVelden;
            int onderkant    = bovenkant + 1;

            double[] proporties    = new double[aantalSimulaties];
            Random   seedGenerator = new Random();

            int[] seeds = new int[aantalSimulaties];
            for (int n = 0; n < aantalSimulaties; n++)
            {
                seeds[n] = seedGenerator.Next();
            }

            ParallelOptions parallelOptions = new ParallelOptions()
            {
                CancellationToken = cts.Token
            };

            try
            {
                Parallel.For(0, aantalSimulaties, parallelOptions, (n) =>
                {
                    // initialiseren
                    Random randomSim        = new Random(seeds[n]);
                    List <int> zwarteVelden = new List <int>();
                    int[] ouderId           = new int[aantalVelden + 2];
                    int[] grootte           = new int[aantalVelden + 2];
                    for (int i = 0; i < aantalVelden; i++)
                    {
                        zwarteVelden.Add(i);
                    }
                    for (int i = 0; i < aantalVelden + 2; i++)
                    {
                        ouderId[i] = (i < aantalVelden) ? -1 : i;
                        grootte[i] = 1;
                    }
                    int aantalWit = 0;

                    // uitvoeren
                    while (ConnectedComponents.InZelfdeComponent(bovenkant, onderkant, ouderId) == false)
                    {
                        // random kiezen nieuw wit veld
                        int index  = randomSim.Next(zwarteVelden.Count);
                        int veldNr = zwarteVelden[index];
                        zwarteVelden.RemoveAt(index);
                        // wit veld invoegen
                        ouderId[veldNr] = veldNr;
                        ConnectedComponents.MaakConnectedComponent(veldNr, aantalRijen, aantalKolommen, ouderId, grootte);
                        // teller verhogen
                        aantalWit++;
                    }
                    proporties[n] = (double)aantalWit / aantalVelden;
                });
            }
            catch (OperationCanceledException) { }

            return(proporties);
        }
示例#2
0
        private void timerAnimatie_Tick(object sender, EventArgs e)
        {
            // random kiezen nieuw wit veld
            int index  = random.Next(zwarteVelden.Count);
            int veldNr = zwarteVelden[index];

            zwarteVelden.RemoveAt(index);

            // wit veld invoegen
            labelN.Text = "N = " + (aantalVelden - zwarteVelden.Count).ToString();
            lijstVelden[veldNr].BackColor = Color.White;
            ouderId[veldNr] = veldNr;
            ConnectedComponents.MaakConnectedComponent(veldNr, aantalRijen, aantalRijen, ouderId, grootte);

            // als percolatie optreedt stoppen
            if (ConnectedComponents.InZelfdeComponent(bovenkant, onderkant, ouderId))
            {
                labelPercolatie.Text = "Percolatie bij proportie " + ((double)(aantalVelden - zwarteVelden.Count) / aantalVelden).ToString();
                buttonStopAnimatie_Click(sender, e);
            }
        }