Exemple #1
0
        static void Main(string[] args)
        {
            System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
            customCulture.NumberFormat.NumberDecimalSeparator    = ".";
            System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;
            maxParallel = Environment.ProcessorCount - 1;
            maxParallel = 4;
            Console.WriteLine("Max parallel sims: " + maxParallel);


            var pp = new ProtocolParameters()
            {
                duty_cycle            = 0.9,     // NOT IN SECONDS: active time percentage (t_l / (t_l + t_s))
                t_sense               = 0.0521,  // carrier sense duration (needs to be more than any signal duration)
                t_backoff             = 0.0219,  // backoff interval length (constant?)
                t_listen              = 0.016,   // listening time, must be quite higher than t_signal
                t_data                = 0.0521,  // data transmission time
                t_signal              = 0.00521, // signal packet transmission time (RTS and CTS ?)
                n_regions             = 4,       // number of priority regions
                n_max_coll            = 6,       // number of attempts for solving a collision
                n_max_sensing         = 10,
                n_max_pkt             = 3,
                n_max_region_cycle    = 5,
                passed_packets_memory = 10
            };

            var sp = new SimulationParameters()
            {
                area_side          = 200,
                debug_interval     = 1,
                debugType          = DebugType.Never,
                debug_file         = "../../graphic_debug/debug_data.js",
                max_time           = 10,      // / (factor * factor),
                n_density          = 200,     // this is density (nodes per 100^2 area), not total nodes
                packet_rate        = 1,
                range              = 20,
                min_distance       = 2,
                asleepEnergy       = 2,
                idleEnergy         = 10,
                transmissionEnergy = 50,
                emptyRegionType    = EmptyRegionType.Lines,
                skipCycleEvents    = true
            };

            var versions = Enum.GetValues(typeof(ProtocolVersion)).Cast <ProtocolVersion>().ToList();
            var shapes   = Enum.GetValues(typeof(EmptyRegionType)).Cast <EmptyRegionType>().ToList();

            var runResults = new RunResult {
                startTime = DateTime.Now,
                basePP    = pp,
                baseSP    = sp
            };

            var DLparameters = new GeneralParameters()
            {
                lambdas = new List <double> {
                    1, 5, 10
                },
                dutyCycles = new List <double>()
                {
                    0.1, 0.3, 0.5, 0.9
                },
                emptyRegionTypes = new List <EmptyRegionType> {
                    EmptyRegionType.None, EmptyRegionType.Lines
                },
                versions    = versions,
                simulations = 20
            };
            var LNparameters = new GeneralParameters()
            {
                lambdas = new List <double> {
                    1, 5, 10
                },
                relay_densities = new List <float> {
                    100, 200, 300
                },                                                                   // CHANGE PROPORTIONAL TO AREA
                emptyRegionTypes = new List <EmptyRegionType> {
                    EmptyRegionType.None, EmptyRegionType.Lines
                },
                versions    = versions,
                simulations = 20
            };
            var shapeParameters = new GeneralParameters()
            {
                versions         = versions,
                emptyRegionTypes = shapes,
                simulations      = 200
            };
            var debugParameters = new GeneralParameters()
            {
                versions = new List <ProtocolVersion> {
                    ProtocolVersion.Base
                },
                emptyRegionTypes = new List <EmptyRegionType> {
                    EmptyRegionType.Lines
                },
                simulations = 1
            };

            //runResults.shapeStats = General.Generate("Shapes", sp, pp, shapeParameters);
            //runResults.dutyLambdas = General.Generate("DL", sp, pp, DLparameters);
            //runResults.lambdaNs = General.Generate("LN", sp, pp, LNparameters);

            // debug
            sp.debugType = DebugType.Always;
            General.Generate("Debug", sp, pp, debugParameters);

            runResults.endTime = DateTime.Now;

            Console.WriteLine("Finished simulating");

            using (var writer = new StreamWriter("../../stats/runResults.json")) {
                writer.WriteLine(JsonConvert.SerializeObject(runResults, Formatting.Indented));
            }
            Console.WriteLine("Saved results");
            //Console.ReadKey();
        }
        public Simulation(SimulationParameters simulationParameters, ProtocolParameters protocolParameters)
        {
            this.simulationParameters = simulationParameters;
            this.protocolParameters   = protocolParameters;

            // init sim state
            clock      = 0;
            eventQueue = new EventQueue();

            var initialCycleDuration = protocolParameters.t_sleep + protocolParameters.t_listen;

            eventQueue.Add(new StartEvent()
            {
                time     = initialCycleDuration + protocolParameters.t_delta,             // must start AFTER first duty cycle events
                sim      = this,
                previous = null
            });
            eventQueue.Add(new EndEvent()
            {
                time     = simulationParameters.max_time,
                sim      = this,
                previous = null
            });

            if (simulationParameters.debugType == DebugType.Interval)
            {
                eventQueue.Add(new DebugEvent()
                {
                    time     = simulationParameters.debug_interval,
                    sim      = this,
                    previous = null
                });
            }

            // init relays as asleep and schedule random awake
            relays    = new List <Relay>();
            relayById = new Dictionary <int, Relay>();
            for (int i = 0; i < simulationParameters.n_nodes; i++)
            {
                var relay = new Relay {
                    id     = i,
                    range  = simulationParameters.range,
                    status = RelayStatus.Asleep,
                    sim    = this
                };
                relays.Add(relay);
                relayById[relay.id] = relay;
                eventQueue.Add(new AwakeEvent()
                {
                    relay = relay,
                    // could be at any point of its duty cycle
                    time     = RNG.rand() * initialCycleDuration,
                    sim      = this,
                    previous = null
                });
            }

            // create distance matrix
            distances = new float[relays.Count, relays.Count];

            // move disconnected
            //Console.WriteLine("Placing relays");
            var connected = false;
            int n_slots   = simulationParameters.binsCount;

            while (!connected)
            {
                // check wether the grid slot is available
                var slotBusy = new bool[n_slots, n_slots];
                foreach (var relay in relays)
                {
                    var X_slot      = 0;
                    var Y_slot      = 0;
                    var validRegion = false;
                    do
                    {
                        X_slot = RNG.rand_int(0, n_slots);
                        Y_slot = RNG.rand_int(0, n_slots);

                        // assign actual position
                        relay.position.X = slotToX(X_slot);
                        relay.position.Y = slotToX(Y_slot);

                        // calculate if in region
                        var X  = relay.position.X;
                        var Y  = relay.position.Y;
                        var c  = simulationParameters.area_side / 2;
                        var dx = X - c;
                        var dy = Y - c;
                        switch (simulationParameters.emptyRegionType)
                        {
                        case EmptyRegionType.None:
                            validRegion = true;
                            break;

                        case EmptyRegionType.Cross:
                            var w  = simulationParameters.emptyRegionSize / Math.Sqrt(2);
                            var h  = Math.Max(relay.range + 2, simulationParameters.emptyRegionSize / 10) / Math.Sqrt(2);
                            var l  = simulationParameters.area_side;
                            var w1 = (l - w) > (X + Y);
                            var w2 = (l + w) < (X + Y);
                            var w3 = (w) < (X - Y);
                            var w4 = -(w) > (X - Y);
                            var h1 = (h) < (X - Y);
                            var h2 = -(h) > (X - Y);
                            var h3 = (l - h) > (X + Y);
                            var h4 = (l + h) < (X + Y);
                            validRegion = (w1 || w2 || h1 || h2) && (w3 || w4 || h3 || h4);
                            break;

                        case EmptyRegionType.Square:
                            var side = simulationParameters.emptyRegionSize;
                            validRegion = (Math.Abs(dx) >= side / 2) || (Math.Abs(dy) >= side / 2);
                            break;

                        case EmptyRegionType.Lines:
                            var side_w          = simulationParameters.emptyRegionSize;
                            var side_h          = Math.Max(relay.range + 2, side_w / 6);
                            var validFirstLine  = (X <= c - side_w / 2) || (X >= c + side_w / 2) || (Y <= c * 3 / 2 - side_h / 2) || (Y >= c * 3 / 2 + side_h / 2);
                            var validSecondLine = (X <= c - side_w / 2) || (X >= c + side_w / 2) || (Y <= c * 1 / 2 - side_h / 2) || (Y >= c * 1 / 2 + side_h / 2);
                            validRegion = validFirstLine && validSecondLine;
                            break;

                        case EmptyRegionType.Holes:
                            var radius = simulationParameters.emptyRegionSize;
                            var d1     = GraphUtils.Distance(X, Y, 0.5 * c, 0.5 * c);
                            var d2     = GraphUtils.Distance(X, Y, 0.5 * c, 1.5 * c);
                            var d3     = GraphUtils.Distance(X, Y, 1.5 * c, 0.5 * c);
                            var d4     = GraphUtils.Distance(X, Y, 1.5 * c, 1.5 * c);
                            validRegion = d1 >= radius && d2 >= radius && d3 >= radius && d4 >= radius;
                            break;
                        }
                    }while (slotBusy[X_slot, Y_slot] || !validRegion);

                    // take slot
                    slotBusy[X_slot, Y_slot] = true;
                }

                //Console.WriteLine("Checking connected relays");

                // calculate new neighbours
                GraphUtils.Distances(relays, distances);
                GraphUtils.SetNeighbours(relays, distances);
                connected = GraphUtils.Connected(relays);
            }
            if (protocolParameters.protocolVersion == ProtocolVersion.BFS || protocolParameters.protocolVersion == ProtocolVersion.BFS_half)
            {
                GraphUtils.RepeatedBFS(relays, distances, protocolParameters.protocolVersion);
            }
            //Console.WriteLine("Placed relays");

            // init debug state
            if (simulationParameters.debugType != DebugType.Never)
            {
                debugWriter = new StreamWriter(simulationParameters.debug_file);
                debugWriter.Write("debug_data=`");
                debugWriter.WriteLine($"{JsonConvert.SerializeObject(simulationParameters)}");
                debugWriter.WriteLine("#");
                debugWriter.WriteLine($"{JsonConvert.SerializeObject(protocolParameters)}");
                debugWriter.WriteLine("#");
                foreach (var r in relays)
                {
                    debugWriter.WriteLine($"{r.id};{r.position.X};{r.position.Y};{r.range}");
                }
                debugWriter.WriteLine("#");
                debugWriter.WriteLine($"{JsonConvert.SerializeObject(distances)}");
                debugWriter.WriteLine("#");
            }
        }