Example #1
0
        public BlackWhiteSubject newData()
        {
            BlackWhiteSubject currentData;
            double            r = RandomPool.Get("sensor").NextDouble();


            if (r < accuracy)//正しいデータ
            {
                currentData = theFact.Value;
            }

            else //間違ったデータ
            {
                if (theFact.Value == BlackWhiteSubject.Black)//天邪鬼if
                {
                    currentData = BlackWhiteSubject.White;
                }
                else
                {
                    currentData = BlackWhiteSubject.Black;
                }
            }

            //知らせる
            SendOpinion(currentData, agent);

            return(currentData);
        }
Example #2
0
        public I_Agent Generate(I_Node node, InfoEnum init_op, double g_sigma, double r_sigma, AgentInitMode mode)
        {
            var node_id          = node.NodeID;
            var init_weight_list = new Dictionary <int, double>();

            foreach (var neighbor in node.NeighborNodeIDList)
            {
                init_weight_list.Add(neighbor, 1.0);
            }
            double init_belief = 0;

            var ir = RandomPool.Get(SeedEnum.AgentSeed);

            switch (mode)
            {
            case AgentInitMode.Random:
                init_belief = ir.NextDouble(r_sigma, g_sigma);
                break;

            case AgentInitMode.RandomWeakPulledByOpinion:
                if (init_op == InfoEnum.Green)
                {
                    init_belief = ir.NextDouble(0.5, g_sigma);
                }
                else
                {
                    init_belief = ir.NextDouble(r_sigma, 0.5);
                }
                break;

            case AgentInitMode.RandomStrongPulledByOpinion:
                if (init_op == InfoEnum.Green)
                {
                    init_belief = ir.NextDouble(g_sigma, 1.0);
                }
                else
                {
                    init_belief = ir.NextDouble(0, r_sigma);
                }
                break;

            case AgentInitMode.Normal:
                init_belief = ir.NextNormal(0.5, 0.1);
                break;

            case AgentInitMode.NormalWeakPulledByOpinion:
                break;

            case AgentInitMode.NormalStrongPulledByOpinion:
                break;

            default:
                break;
            }
            return(new BaseAgent(node_id, init_belief, init_weight_list, init_op, g_sigma, r_sigma));
        }
Example #3
0
        public void SetSensors(int num, double sensor_acc)
        {
            this.SensorNum = num;
            this.SensorAcc = sensor_acc;

            var ir = RandomPool.Get(SeedEnum.AgentSeed);

            var list = this.AgentList.Select(agent => agent.NodeID).OrderBy(id => ir.Next()).Take(num)
                       .ToList();

            this.AgentList.Where(agent => list.Contains(agent.NodeID)).ToList().ForEach(agent => agent.SetSensor(true, sensor_acc));
        }
Example #4
0
        public void randomNext()
        {
            double r = RandomPool.Get("fact").NextDouble();

            if (r < 0.5)
            {
                Value = BlackWhiteSubject.White;
            }
            else
            {
                Value = BlackWhiteSubject.Black;
            }
        }
        public IEnumerable <Link> SelectLinksToRewire(IEnumerable <Link> links)
        {
            int linksNum  = links.Count();
            int rewireNum = (int)(p_rewire * linksNum);

            IEnumerable <int> selectedIndex = RandomPool.Get("envset").getRandomIndexes(linksNum, rewireNum);

            List <Link> selectedLinks = new List <Link>();

            foreach (var index in selectedIndex)
            {
                selectedLinks.Add(links.ElementAt(index));
            }

            return(selectedLinks);
        }
Example #6
0
        public override Network create()
        {
            Console.WriteLine("make random network!");
            //ネットワーク
            Network net = new Network();

            //ノードであるAgent
            for (int i = 0; i < NodeNum; i++)
            {
                net.AddNode(NodeCreate());//エージェントを選択可能にしたいよね
            }

            foreach (var Node_i in net.Nodes)
            {
                foreach (var Node_j in net.Nodes)
                {
                    if (Node_i == Node_j)
                    {
                        break;
                    }

                    double r = RandomPool.Get("envset").NextDouble();


                    if (r < 0.3)
                    { //0.3の確率でコネクション作成
                        net.ConnectNode(Node_i, Node_j);
                    }
                }

                var nodes = net.Nodes;
                if (Node_i.Neighbours.Count() == 0)
                {
                    int r;
                    do
                    {
                        r = RandomPool.Get("envset").Next(NodeNum);
                    } while (nodes.ElementAt(r) == Node_i);

                    net.ConnectNode(Node_i, nodes.ElementAt(r));
                }
            }
            //まだ!!
            return(net);
        }
Example #7
0
        private void PrepareSensor(int sensorNum)
        {
            //センサー
            Sensors = new List <Sensor>();

            //センサーをもつエージェントを決める
            var selectedIndexes = RandomPool.Get("setenv").getRandomIndexes(this.Network.Nodes.Count(), sensorNum);

            foreach (var i in selectedIndexes)
            {
                //センサーを生成
                Sensor s = new Sensor(TheFact);

                //センサーにエージェントをセット(内部でAgentのhavesensorをtrueにしてる.微妙に密結合)
                s.SetAgent((Agent)this.Network.Nodes.ElementAt(i));
                this.Sensors.Add(s);
            }
        }
Example #8
0
        //センサーエージェントは、センサーの値を観測
        private void SensorObservation()
        {
            //*** 10%のセンサーが新しい値を取得する.***

            int sensorNum = Environment.Sensors.Count;

            int observationNum = (int)(Math.Ceiling(sensorNum * 0.1));

            var indexes = RandomPool.Get("sensor").getRandomIndexes(sensorNum, observationNum);

            //L.g("sensor").Write("");
            foreach (int index in indexes)
            {
                Sensor s    = Environment.Sensors.ElementAt(index);
                var    data = s.newData();

                //   L.g("sensor").Write("s->" + s.Agent.ID + " " +  ( data == BlackWhiteSubject.White ? 1 : -1 ) + ", ");
            }
            //L.g("sensor").WriteLine("");
        }
Example #9
0
        void SendEnvMessage(I_Network network, I_AgentSet agent_set, InfoEnum correct, InfoEnum incorrect, double op_intro_rate)
        {
            this.OpinionIntroCounts++;
            if (this.OpinionIntroCounts < this.OpinionIntroductionDuration)
            {
                return;
            }

            this.OpinionIntroCounts = 0;
            this.EnvOpinionCounts++;

            var correct_opinion   = correct;
            var incorrect_opinion = incorrect;

            foreach (var agent in agent_set.AgentList)
            {
                if (!(agent.IsSensor))
                {
                    continue;
                }
                if (RandomPool.Get(SeedEnum.PlayStepSeed).NextDouble() > op_intro_rate)
                {
                    continue;
                }

                var env_info = InfoEnum.Undeter;
                if (RandomPool.Get(SeedEnum.PlayStepSeed).NextDouble() < agent.SensorAccuracy)
                {
                    env_info = correct_opinion;
                }
                else
                {
                    env_info = incorrect_opinion;
                }

                this.SendMessageQueue.Enqueue(new Message(-1, agent.NodeID, env_info));
            }
        }
Example #10
0
        private INode RuletSelect(IEnumerable <INode> nodes)
        {
            int sum = 0;
            int cum = 0;

            double r = RandomPool.Get("envset").NextDouble();

            foreach (var node in nodes)
            {
                sum += node.Neighbours.Count;
            }

            foreach (var node in nodes)
            {
                cum += node.Neighbours.Count;
                if (r < (double)cum / sum)
                {
                    return(node);
                }
            }

            throw new Exception("何が起こった!?");
        }
Example #11
0
        static public AgentAlgorithm CreateAlgorithm(string name, double h_trg)
        {
            IAATBasedAgent algo = creators[name]();

            //信念など
            if (algo is SubOpinion) //今はまだ場合分けが少ないからいいけどいずれはFactory Methodになるかも。
            {
                algo.Thought = new ThoughtTwin(RandomPool.Get("envset").NextNormal(0.5, 0.1));
            }
            else
            {
                algo.Thought = new Thought(RandomPool.Get("envset").NextNormal(0.5, 0.1));
            }

            //候補集合
            algo.CandidateSelector = new CandidateUpdaterSelector();

            algo.TargetAwarenessRate = h_trg;

            //最後に初期化
            algo.Initialize();

            return(algo as AgentAlgorithm);
        }
        public override Network create()
        {
            //RandomPool.Get("envset").Init();
            Network net = new Network();

            INode[] Nodes = new INode[NodeNum];

            //エージェントを登録
            for (int i = 0; i < NodeNum; i++)
            {
                Nodes[i] = NodeCreate();
                net.AddNode(Nodes[i]);
            }

            //まずは輪っかをつくる
            for (int i = 0; i < NodeNum; i++)
            {
                //degreeが偶数じゃないとちゃんと働きません!!つか奇数ってどうやるの!?

                for (int j = 1; j <= degree / 2; j++)
                {
                    int index = i + j;

                    if (index >= NodeNum)
                    {//indexが範囲を超えていたら、一周回らせて収める
                        index = index - NodeNum;
                    }

                    net.ConnectNodes(Nodes[i], Nodes[index]);
                }
            }



            /* pの割合のリンクをreconnectする。*/

            //rewireするべきlinkをみつける
            var linksToRewire = SelectLinksToRewire(net.Links);

            foreach (var link in linksToRewire)//それぞれのリンクを張り替える
            {
                //リンクをはずす。
                net.DisconnectNode(link);

                //軸はどっちか
                INode pivot = (RandomPool.Get("envset").NextDouble() <= 0.5 ? link.Node1 : link.Node2);

                //ご近所じゃないやつを探す
                var neighbourOfPivot = net.GetNeighbour(pivot);
                var allNodes         = new List <INode>(net.Nodes);

                foreach (var node in neighbourOfPivot)
                {
                    allNodes.Remove(node);
                }
                allNodes.Remove(pivot);
                var notNeighbour = allNodes;

                //次のパートナーを選ぶ。
                INode nextPartner = notNeighbour.ElementAt(RandomPool.Get("envset").Next(notNeighbour.Count));

                net.ConnectNodes(pivot, nextPartner);
            }

            RandomPool.Get("envset").Init();

            return(net);
        }
Example #13
0
        //*** constructor and properties ***//
        public Agent()
        {
            thought = new Thought(RandomPool.Get("setenv").NextNormal(0.5, 0.1));//ランダム要素はここだけ

            Initialize();
        }
        public override Network create()
        {
            //RandomPool.Get("envset").Init();
            Network net = new Network();

            INode[] Nodes = new INode[NodeNum];

            //エージェントを登録
            for (int i = 0; i < NodeNum; i++)
            {
                Nodes[i] = NodeCreate();
                net.AddNode(Nodes[i]);
            }

            //まずは輪っかをつくる
            for (int i = 0; i < NodeNum - 1; i++)
            {
                //degreeが偶数じゃないとちゃんと働きません!!つか奇数ってどうやるの!?

                for (int j = 1; j <= degree / 2; j++)
                {
                    int index = i + j;

                    if (index >= NodeNum)
                    {//indexが範囲を超えていたら、一周回らせて収める
                        index = index - NodeNum;
                    }

                    net.ConnectNodes(Nodes[i], Nodes[index]);
                }
            }


            List <AgentIO> sensorAgents = new List <AgentIO>();

            //センサーエージェントの一覧を求める
            foreach (var node in net.Nodes)
            {
                if ((node as AgentIO).HasSensor)
                {
                    sensorAgents.Add(node as AgentIO);
                }
            }


            /* pの割合のリンクをreconnectする。*/

            //rewireするべきlinkをみつける
            var linksToRewire = SelectLinksToRewire(net.Links);

            foreach (var link in linksToRewire)//それぞれのリンクを張り替える
            {
                //リンクをはずす。
                net.DisconnectNode(link);

                //軸はどっちか
                INode pivot = (RandomPool.Get("envset").NextDouble() <= 0.5 ? link.Node1 : link.Node2);

                //ご近所じゃないやつを探す
                var neighbourOfPivot = net.GetNeighbour(pivot);
                var allNodes         = new List <INode>(net.Nodes);

                foreach (var node in neighbourOfPivot)
                {
                    allNodes.Remove(node);
                }
                allNodes.Remove(pivot);
                var notNeighbour = allNodes;

                //次のパートナーを選ぶ。
                INode nextPartner = notNeighbour.ElementAt(RandomPool.Get("envset").Next(notNeighbour.Count));

                net.ConnectNodes(pivot, nextPartner);
            }

            //Nodes[NodeNum -1]に,全員をつながせたい
            //2014_0707:n人と繋がるように(NodeNum - n)に変更
            //2014_0708:全員と繋げるためにリンクの張替え後に移動しました
            //2014_0901leaderNodeをランダムに繋げるように設定
            //for (int i = 0; i < 30; i++)
            //{
            //    Node[0]と,LeaderNodesをつなぐ
            //    int o = RandomPool.Get("envset").Next(linkNum);//leaderと繋がるノード
            //    if (o != l)
            //    {
            //        net.ConnectNodes(Nodes[o], Nodes[l]);
            //    }
            int l = RandomPool.Get("envset").Next(linkNum);//leaderノード
            int k = 0;
            int o = 0;

            while (o >= 0 && k != 30)
            {
                o = RandomPool.Get("envset").Next(linkNum);    //leaderと繋がるノード
                if (o != l)
                {
                    net.ConnectNodes(Nodes[o], Nodes[l]);    //leaderとNodeをランダムに繋ぐ
                    k++;
                }
            }
            //
            RandomPool.Get("envset").Init();///ここでノード指定?環境のノードっぽい

            return(net);
        }