public override Network create()
        {
            //完全グラフ

            //ネットワーク
            Network net = new Network();

            //エージェントを登録
            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;
                    net.ConnectNodes(Node_i, Node_j);
                }
            }
            return net;
        }
示例#2
0
        //nodeのクラスタ係数を算出
        public static double cluster(INode node, Network net)
        {
            int nodeID = node.ID;//nodeの固定
            int k = node.Neighbours.Count;//次数
            int triangleNum = 0;//三角形の総数
            double c = 0.0;//クラスタ係数

            //

            //近隣エージェントは別になるように
            for (int i = 0; i < node.Neighbours.Count; i++)
            {
                INode aNeighbour = node.Neighbours.ElementAt(i);

                for (int j = 0; j < i; j++)
                {
                    INode bNeighbour = node.Neighbours.ElementAt(j);
                    if (aNeighbour.Neighbours.Contains(bNeighbour))//友達同士かどうか
                    {
                        triangleNum++;
                    }
                }
            }

            c = (double)triangleNum / (k * (k - 1) / 2); //doubleに変換しないとだめ!!!
            return c;
            //foreach (var aNeighbour in node.Neighbours)
            //{
            //    foreach (var bNeighbour in node.Neighbours)
            //    {

            //        //友達同士が友達がどうか
            //        if (aNeighbour.Neighbours.Contains(bNeighbour))
            //        {
            //            triangleNum++;
            //        }
            //    }

            //}

            //foreach(var aNeighbour in node.Neighbours){
            //    foreach(var bNeighbour in node.Neighbours){
            //        if(aNeighbour.Neighbours.Contains(bNeighbour)){
            //            //aとbはつながっている
            //            Console.Write("neighbour ");

            //        }

            //        if(net.Links.Contains(new Link(aNeighbour,bNeighbour))){
            //            //aとbはつながっている
            //            Console.Write("link ");
            //        }
            //        Console.WriteLine();
            //    }

            //}
        }
        public override Network create()
        {
            Network net = new Network();

            List<INode> nodes = new List<INode>();

            INode n = NodeCreate();
            nodes.Add(n);
            net.AddNode(n);

            while (net.Nodes.Count() < NodeNum)
            {
                List<INode> newnodes = new List<INode>();
                foreach (var node in nodes)
                {

                    int k = SelectK() - node.Neighbours.Count;

                    for (int i = 0; i < k; i++)
                    {

                        var newnode = NodeCreate();
                        newnodes.Add(newnode);
                        net.AddNode(newnode);
                        net.ConnectNodes(node, newnode);

                        //満杯になったら抜ける
                        if (!(net.Nodes.Count() < NodeNum))
                            break ;
                    }

                    //満杯になったら抜ける
                    if (!(net.Nodes.Count() < NodeNum))
                        break ;
                }

                if (newnodes.Count == 0)
                    break;

                nodes = newnodes;
            }

            return net;
        }
        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;
        }
        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;
        }