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; }
//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; }