コード例 #1
0
ファイル: RoutingAlgorithm.cs プロジェクト: kalimaul/gossip
 public void HandleNode(Node current, Node origin, Message message, Network network)
 {
     foreach (Node neighbor in current.neighbors)
     {
         network.Enqueue(message, current, neighbor);
     }
 }
コード例 #2
0
ファイル: Network.cs プロジェクト: kalimaul/gossip
        public void CreateNetwork(int width, int height, int nodeCoverage, int nodeCount)
        {
            time = 0;
            messageCount = 0;
            nodes.Clear();
            messages.Clear();

            Random random = new Random();

            while (nodes.Count < nodeCount / 2)
            {
                for (int i = 0; i < nodeCount; ++i)
                {
                    int x = random.Next(width);
                    int y = random.Next(height);
                    Node n = new Node();
                    n.xPos = x;
                    n.yPos = y;
                    nodes.Add(n);
                }

                for (int i = 0; i < nodes.Count; ++i)
                {
                    for (int j = i + 1; j < nodes.Count; ++j)
                    {
                        int xdiff = nodes[i].xPos - nodes[j].xPos;
                        int ydiff = nodes[i].yPos - nodes[j].yPos;
                        int dstSqr = xdiff * xdiff + ydiff * ydiff;
                        if (dstSqr <= nodeCoverage * nodeCoverage)
                        {
                            nodes[i].neighbors.Add(nodes[j]);
                            nodes[j].neighbors.Add(nodes[i]);
                        }
                    }
                }

                HashSet<Node> reachable = new HashSet<Node>();
                Stack<Node> toCheck = new Stack<Node>();
                toCheck.Push(nodes[0]);

                while (toCheck.Count > 0)
                {
                    Node current = toCheck.Pop();
                    if (!reachable.Contains(current))
                    {
                        reachable.Add(current);
                        foreach (Node n in current.neighbors)
                        {
                            toCheck.Push(n);
                        }
                    }
                }

                nodes.RemoveAll(o => !reachable.Contains(o));
            }
        }
コード例 #3
0
ファイル: Node.cs プロジェクト: kalimaul/gossip
 public void OnMessage(Node origin, Message message, Network network)
 {
     ++messagesReceived;
     if (messagesReceived == 1)
     {
         rcvTime = network.time;
         this.message = message;
         network.routingAlgorithm.HandleNode(this, origin, message, network);
     }
 }
コード例 #4
0
ファイル: RoutingAlgorithm.cs プロジェクト: kalimaul/gossip
        public void HandleNode(Node current, Node origin, Message message, Network network)
        {
            if (message.hops >= k && random.NextDouble() > p)
            {
                return;
            }

            foreach (Node neighbor in current.neighbors)
            {
                network.Enqueue(message, current, neighbor);
            }
        }
コード例 #5
0
ファイル: Network.cs プロジェクト: kalimaul/gossip
 public void Enqueue(Message m, Node origin, Node target)
 {
     NetworkMessage msg = new NetworkMessage();
     msg.message = m;
     msg.target = target;
     msg.origin = origin;
     ++msg.message.hops;
     messages.Add(msg);
 }