Beispiel #1
0
        public void Run(int start_seed, int final_seed)
        {
            string save_folder = this.LogFolder;
            var    graphs      = this.MyGraphs;
            var    algos       = this.MyAlgos;

            int    op_dim_size = this.DimSize;
            double sensor_rate = this.SensorRate;


            int max = 0;

            for (int size = this.StartSize; size <= FinalSize; size += DurationSize)
            {
                foreach (var select_graph in graphs)
                {
                    for (int seed = start_seed; seed <= final_seed; seed++)
                    {
                        foreach (var algo in algos)
                        {
                            foreach (var weight in this.CommonCuriocities)
                            {
                                max++;
                            }
                        }
                    }
                }
            }

            var pb = new ExtendProgressBar(max);

            for (int size = this.StartSize; size <= FinalSize; size += DurationSize)
            {
                GraphGeneratorBase graph_generator = new Null_GraphGenerator();

                foreach (var select_graph in graphs)
                {
                    for (int seed = start_seed; seed <= final_seed; seed++)
                    {
                        switch (select_graph)
                        {
                        case GraphEnum.WS:
                            graph_generator = new WS_GraphGenerator().SetNodeSize(size).SetNearestNeighbors(6).SetRewireP(0.01);
                            break;

                        case GraphEnum.BA:
                            graph_generator = new BA_GraphGenerator().SetNodeSize(size).SetAttachEdges(2);
                            break;

                        case GraphEnum.Hexagonal:
                            graph_generator = new Hexagonal_GraphGenerator().SetNodeSize(size);
                            break;

                        case GraphEnum.Grid2D:
                            graph_generator = new Grid2D_GraphGenerator().SetNodeSize(size);
                            break;

                        case GraphEnum.Triangular:
                            graph_generator = new Triangular_GraphGenerator().SetNodeSize(size);
                            break;

                        default:
                            new Exception();
                            return;
                        }
                        var graph  = new RawGraph();
                        var layout = new Layout();

                        lock (lock_object)
                        {
                            graph  = graph_generator.Generate(seed, pb);
                            layout = new Circular_LayoutGenerator(graph).Generate(pb);
                        }


                        var init_belief_gene = new InitBeliefGenerator()
                                               .SetInitBeliefMode(mode: InitBeliefMode.NormalNarrow);

                        var subject_test = new OpinionSubject("test", op_dim_size);


                        var osm_env = new OpinionEnvironment()
                                      .SetSubject(subject_test)
                                      .SetCorrectDim(0)
                                      .SetSensorWeight(sensor_rate);

                        var subject_manager = new SubjectManager()
                                              .AddSubject(subject_test)
                                              .SetEnvironment(osm_env);


                        var op_form_threshold = 0.9;

                        var sample_agent_test = new SampleAgent()
                                                .SetInitBeliefGene(init_belief_gene)
                                                .SetThreshold(op_form_threshold)
                                                .SetSubject(subject_test)
                                                .SetInitOpinion(Vector <double> .Build.Dense(op_dim_size, 0.0));

                        var sensor_gene = new SensorGenerator();
                        if (this.SensorSizeFixMode)
                        {
                            sensor_gene.SetSensorSize(this.SensorSize);
                        }
                        else
                        {
                            sensor_gene.SetSensorSize((int)(this.SensorSizeRate * graph.Nodes.Count));
                        }

                        int agent_gene_seed = seed;
                        var agent_gene_rand = new ExtendRandom(agent_gene_seed);


                        var agent_network = new AgentNetwork()
                                            .SetRand(agent_gene_rand)
                                            .GenerateNetworkFrame(graph)
                                            .ApplySampleAgent(sample_agent_test, mode: SampleAgentSetMode.RemainSet)
                                            .GenerateSensor(sensor_gene)
                                            .SetLayout(layout);

                        int update_step_seed = seed;

                        foreach (var algo in algos)
                        {
                            OSMBase osm = new OSM_Only();

                            foreach (var cc in this.CommonCuriocities)
                            {
                                switch (algo)
                                {
                                case AlgoEnum.IWTori:
                                    var osm_iwtori = new IWTori_OSM();
                                    osm_iwtori.SetCommonCuriocity(cc);
                                    osm_iwtori.SetTargetH(this.TargetH);
                                    osm = osm_iwtori;
                                    break;

                                case AlgoEnum.IWTorionly:
                                    var osm_iwtorionly = new IWTorionly_OSM();
                                    osm_iwtorionly.SetCommonWeight(this.CommonWeight);
                                    osm_iwtorionly.SetCommonCuriocity(cc);
                                    osm = osm_iwtorionly;
                                    break;

                                default:
                                    break;
                                }

                                var update_step_rand_tmp = new ExtendRandom(update_step_seed);
                                osm.SetRand(update_step_rand_tmp);
                                osm.SetAgentNetwork(agent_network);
                                osm.SetSubjectManager(subject_manager);
                                osm.SetInitWeightsMode(mode: CalcWeightMode.FavorMyOpinion);
                                osm.SetOpinionIntroInterval(10);
                                osm.SetOpinionIntroRate(0.1);
                                osm.SimpleRecordFlag = true;
                                osm.SetBeliefUpdater(this.MyBeliefUpdater);


                                pb.Tag = $"{select_graph.ToString()} {size.ToString()} {algo.ToString()} {seed}";
                                osm.UpdateRounds(this.Rounds, this.Steps, pb);

                                string sensor_size_mode = "";
                                if (this.SensorSizeFixMode)
                                {
                                    sensor_size_mode = "fix" + this.SensorSize.ToString();
                                }
                                else
                                {
                                    sensor_size_mode = "rate" + Math.Round(this.SensorSizeRate, 3).ToString();
                                }

                                string sensor_weight_mode = $"{this.MyBeliefUpdater.SensorWeightMode}";

                                var output_pass = Properties.Settings.Default.OutputLogPath
                                                  + $"/{save_folder}/"
                                                  + select_graph.ToString()
                                                  + $"_{size.ToString()}"
                                                  + $"_{sensor_size_mode}"
                                                  + $"_{op_dim_size.ToString()}"
                                                  + $"_{sensor_rate.ToString()}"
                                                  + $"_{algo.ToString()}"
                                                  + $"_{sensor_weight_mode}"
                                                  + $"_{this.Rounds}"
                                                  + $"_{this.Steps}"
                                                  + $"_{cc}";

                                Output.OutputRounds(output_pass, osm.MyRecordRounds, seed.ToString());
                                pb.Next();
                            }
                        }
                    }
                }
            }
        }