예제 #1
0
        static void AutoExperiment()
        {
            //ディレクトリを作成
            L.gDirectory(DateTime.Now.ToString("yyyyMMdd_HHmmss"));
            L.gDefine("stepbelief,roundacc,aveacc,time,env");

            //集団規模のリスト

            //int[] sizeList = { 100, 250, 500, 750, 1000, 1500, 2000, 2500 };
            int[] sizeList = {100, 1000};

            //h_trgの種類
            double[] h_trgList = { 0.9, 0.94, 0.98, 1.0 };

            //expected d <d>
            double[] expdList = { 4, 6, 8, 10, 12 };

            //シードの種類の個数
            int envSeedNum = 10;

            var envSeedList = Enumerable.Range(0,envSeedNum);

            NodeCreaterCreater AATCC = (double h_trg) => (() => new AAT(h_trg));
            NodeCreaterCreater DontReplyCC = (double h_trg) => (() => new DontReply(h_trg));
            NodeCreaterCreater NoMoreBeliefCC = (double h_trg) => (() => new NoMoreBelief(h_trg));
            NodeCreaterCreater EatingWordsCC = (double h_trg) => (() => new EatingWords(h_trg));
            NodeCreaterCreater BelieveOnlySensorCC = (double h_trg) => (() => new BelieveOnlySensor(h_trg));

            Dictionary<string,NodeCreaterCreater> creatorList = new Dictionary<string,NodeCreaterCreater>{
                //{"AAT", AATCC },
                {"NewDontReply", DontReplyCC },
                //{"NoMoreBelief", NoMoreBeliefCC },
                //{"BelieveOnlySensor", BelieveOnlySensorCC},
                //{"EatingWords", EatingWordsCC },
            };

            //**************実験条件を表示***************
            {
                var logAll = L.g("all");
                logAll.WriteLine("////////////////////experimental condition ////////////////////");

                var dt = DateTime.Now;
                string routeDir = dt.ToString("yyyy/MM/dd HH:mm:ss\n");
                logAll.WriteLine("Date: " + routeDir);

                logAll.WriteLine("AgentNum");
                foreach (int size in sizeList)
                {
                    logAll.Write(size + ", ");
                }
                logAll.WriteLine("\n");

                logAll.WriteLine("h_trg");
                foreach (double h_trg in h_trgList)
                {
                    logAll.Write(h_trg + ", ");
                }
                logAll.WriteLine("\n");

                logAll.WriteLine("expd");
                foreach (int expd in expdList)
                {
                    logAll.Write(expd + ", ");
                }
                logAll.WriteLine("\n");

                logAll.WriteLine("algorithm");
                foreach (string creatorName in creatorList.Keys)
                {
                    logAll.Write(creatorName + ", ");
                }
                logAll.WriteLine("\n");

                logAll.WriteLine("envSeedNum: " + envSeedNum);
                logAll.WriteLine("\n");
            }

            //じっけんID
            int EXP_ID = 0;

            //時間をはかるよ
            DateTime prevTime = DateTime.Now;
            DateTime startTime = DateTime.Now;

            //それぞれのアルゴリズムについて
            foreach (var creator in creatorList)
            {
                //それぞれのサイズについて
                foreach (int size in sizeList)
                {
                    //それぞれのh_trgについて
                    foreach (double h_trg in h_trgList)
                    {
                        //それぞれのdについて
                        foreach (int expd in expdList)
                        {
                            //条件を表示
                            {
                                L.g("all").WriteLine("");
                                L.g("all").Write(string.Format("EXP_ID: {0}", EXP_ID++)); //実験IDを
                                L.g("all").Write(" Algo: " + creator.Key);//アルゴリズムの名前を表示

                                L.g("all").Write(" agentnum: " + size);
                                L.g("all").Write(" h_trg: " + h_trg);
                                L.g("all").Write(" expd: " + expd);
                                L.g("all").Write(" envSdN: " + envSeedNum);

                                L.g("all").WriteLine("");

                            }

                            //シードの平均をとるため
                            double[] aveSeedResult = new double[3];

                            foreach (int envSeed in envSeedList)//環境のシード
                            {
                                    L.g("roundacc,time,console,stepbelief").Write("\nenvSeed: " + envSeed + " ");

                                    RandomPool.Declare("setenv", envSeed);

                                    {//実験一回し

                                        RandomPool.Declare("fact", 0);//固定センサー値までばらつかせたら収集がつかんことを学習した。

                                        //環境を作る
                                        NetworkGenerator generator = new SmallworldRingNetworkGenerator(size, expd, 0.12);

                                        generator.NodeCreate += creator.Value(h_trg);

                                        OSEnvironment env = new OSEnvironment(generator, (int)(size * 0.05));

                                        //ファイルにネットワークの情報を表示
                                        L.g("env").WriteLine("" + env);
                                        L.g("env").Flush();

                                        Experiment exp = new Experiment(env);

                                        //実験を実行
                                        var expResult = exp.Run();

                                        {//平均をとるために和を計算
                                            aveSeedResult[0] += expResult. Correct;
                                            aveSeedResult[1] += expResult. Incorrect;
                                            aveSeedResult[2] += expResult. Undeter;
                                        }

                                    }

                                    { //時間を表示
                                        DateTime nowTime = DateTime.Now;
                                        TimeSpan tp = nowTime.Subtract(prevTime);
                                        TimeSpan fromStart = nowTime.Subtract(startTime);
                                        L.g("time,console").Write("<span: " + tp);             // 処理時間を秒単位で表示
                                        L.g("time,console").WriteLine("  fromStart: " + fromStart +" >"); // 処理時間を秒単位で表示

                                        prevTime = nowTime;
                                    }
                            }//forenvseed

                            { //平均をとる
                                aveSeedResult[0] /= envSeedNum;
                                aveSeedResult[1] /= envSeedNum;
                                aveSeedResult[2] /= envSeedNum;
                            }

                            L.g("aveacc,console").WriteLine(
                                string.Format("SeedAverage: correct: {0} incorrect: {1} undeter: {2}",
                                aveSeedResult[0], aveSeedResult[1], aveSeedResult[2]) );

                            //ファイルに書き込み
                            L.Flush();
                        }//for expd
                    }//for h_trg
                }//for size
            }//
        }
예제 #2
0
        static void DoExperiment(
            int EXP_ID,
            string algoStr,
            string netStr,
            int size,
            double h_trg,
            int expd,
            int envSeed,//環境のシード
            int linkNum,
            double cluster,//クラスタ係数
            string dirname
            )
        {
            //ディレクトリを作成
            L.gDirectory(dirname);

            //出力するファイルを宣言
            L.gDefine("roundacc,aveacc");

            //条件を表示
            {
                L.g("all").WriteLine("");
                L.g("all").Write("envSeed: " + envSeed);
                L.g("all").Write(" EXP_ID: "+ EXP_ID); //実験IDを
                L.g("all").Write(" Algo: " + algoStr);//アルゴリズムの名前を表示
                L.g("all").Write(" agentnum: " + size);
                L.g("all").Write(" linkNum: " + linkNum);
                L.g("all").Write(" cluster: " + cluster);//クラスタ係数
                L.g("all").Write(" h_trg: " + h_trg);
                L.g("all").Write(" expd: " + expd);

                L.g("roundacc").WriteLine("");
            }

            {//実験一回し
                Experiment exp = new Experiment(150,2000);//150ラウンド,2000ステップの実験

                exp.SetEnvsetSeed(envSeed);
                exp.SetFactSeed(0);

                NetworkGenerator generator = null;
                //環境を作る
                if (netStr == "WS")
                {
                    generator = new WSmodelNetworkGenerator(size, expd, 0.12);
                }
                else if (netStr == "BA")
                {
                    generator = new BAModelNetworkGenerator(size, 4,2);
                }
                else if (netStr == "Random")
                {
                    generator = new RandomNetworkGenerator(size,16);
                }
                //リーダーネットワークの導入 2014_0707追加
                else if (netStr == "Leader")
                {
                    generator = new LeaderNetworkGenerator(size, expd, 0.12, linkNum);
                }

                //シェルを作る
                generator.NodeCreate += ()=> new AgentIO();

                //generateしてくれる。
                OSEnvironment env = new OSEnvironment(generator, (int)(size * 0.05));

                //エージェントに脳みそをいれてやる
                foreach (AgentIO agentIO in env.Network.Nodes)
                {
                    agentIO.Algorithm = (AlgorithmFactory.CreateAlgorithm(algoStr, h_trg));
                }

                //ファイルにネットワークの情報を表示
                L.g("env").WriteLine("" + env);
                L.g("env").Flush();

                exp.Environment = env;

                //実験を実行
                var expResult = exp.Run();

            }

            //ファイルに書き込み
            L.Flush();
        }