public void HandleNode(Node current, Node origin, Message message, Network network) { foreach (Node neighbor in current.neighbors) { network.Enqueue(message, current, neighbor); } }
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)); } }
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); } }
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); } }
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); }