public NetworkData(NodeNetworkCopy network, Node from, Node to, Node end1, Node end2)
 {
     Network = network;
     From    = from;
     To      = to;
     End1    = end1;
     End2    = end2;
 }
 /// <summary>
 /// Adds a new <see cref="NodeNetworkCopy"/> to all windows so it can be reviewed
 /// </summary>
 public void AddNetworkResult(string name, NodeNetworkCopy network, Node from, Node to, Tuple <Node, Node> end)
 {
     _networks.Add(name, new NetworkData(network, from, to, end.Item1, end.Item2));
     Instance.Dispatcher.Invoke(() =>
     {
         Instance.ListBoxResults.Items.Add(name);
         Instance.ListBoxResults.Items.Add(new ListBoxItem {
             Content = "", IsEnabled = false
         });
     });
 }
Пример #3
0
        private static Node FindNextNodeOnBestRoute(ref NodeNetworkCopy network, Node endNode)
        {
            var currentNode  = network.Nodes.Single(n => n.Equals(endNode));
            var previousNode = currentNode;

            while (currentNode.Value > 0.0)
            {
                var connectedNodes = network.Links
                                     .Where(l => l.NodeA.Equals(currentNode) || l.NodeB.Equals(currentNode))
                                     .Select(l => l.NodeA.Equals(currentNode) ? l.NodeB : l.NodeA)
                                     .ToList();
                var bestNode = connectedNodes
                               .OrderBy(n => n.Value)
                               .First();
                previousNode = currentNode;
                currentNode  = bestNode;
                #if DEBUG
                AlgorithmDebuggerWindow.Instance.AddNetworkResult($"DY{_debuggerIndex}#{currentNode.Value}", network,
                                                                  previousNode, currentNode);
                #endif
            }

            return(previousNode);
        }
Пример #4
0
        private static void AssignNodeValues(ref NodeNetworkCopy network, ref Node startNode)
        {
            if (startNode.Value == null)
            {
                startNode.Value = 0.0;
                network.Nodes[network.Nodes.ToList().IndexOf(startNode)].Value = 0.0;
            }

            var node           = startNode;
            var connectedLinks = network.Links
                                 .Where(l => l.NodeA.Equals(node) || l.NodeB.Equals(node))
                                 .ToList();

            foreach (var l in connectedLinks)
            {
                var toNode = l.NodeA.Equals(startNode) ? l.NodeB : l.NodeA;
                if (toNode.Value != null && toNode.Value <= startNode.Value + l.Distance)
                {
                    continue;
                }
                toNode.Value = startNode.Value + l.Distance;
                AssignNodeValues(ref network, ref toNode);
            }
        }
Пример #5
0
        private static Node CalculatePathNextNode(long callerId, ref NodeNetworkCopy network, ref Node startNode, ref Node endNode, Destination endDestination)
        {
            var openNodes = new List <ConnectedNode> {
                new ConnectedNode(endNode)
            };
            var           closedNodes = new List <ConnectedNode>();
            ConnectedNode lastNode    = null;

            var updateIndex = 0;

            while (true)
            {
                // propogate
                var thisNode = openNodes.First();
                openNodes.Remove(thisNode);
                closedNodes.Add(thisNode);

                var neighbours = network.Links
                                 .Where(l => l.NodeA.Equals(thisNode) || l.NodeB.Equals(thisNode))
                                 .Select(l => l.NodeA.Equals(thisNode) ? new ConnectedNode(l.NodeB) : new ConnectedNode(l.NodeA))
                                 .ToList();

                // calculate
                var foundEnd = false;
                foreach (var n in neighbours)
                {
                    if (closedNodes.SingleOrDefault(cn => cn.Equals(n)) != null)
                    {
                        continue;
                    }

                    if (n.Equals(startNode))
                    {
                        foundEnd = true;
                        lastNode = n;
                    }

                    n.ConnectedTo = thisNode;
                    n.Value       = Math.Sqrt(Math.Pow((n.PositionX - startNode.PositionX), 2) + Math.Pow((n.PositionY - startNode.PositionY), 2));
                    network.Nodes.Single(nn => nn.Equals(n)).Value = n.Value;
                    #if DEBUG
                    AlgorithmDebuggerWindow.Instance.AddNodeUpdateResult($"AS{_debuggerIndex}${updateIndex++}", network,
                                                                         n, thisNode);
                    #endif
                    openNodes.Add(n);
                }

                if (foundEnd)
                {
                    break;
                }

                // sort
                openNodes = openNodes.OrderBy(n => n.Value).ToList();

                // info
                #if DEBUG
                AlgorithmDebuggerWindow.Instance.AddNetworkResult($"AS{_debuggerIndex}#{openNodes.First().Value}", network,
                                                                  thisNode, openNodes.First());
                #endif
            }

            var roadX  = (startNode.PositionX - lastNode.ConnectedTo.PositionX) / 2.0 + lastNode.ConnectedTo.PositionX;
            var roadY  = (startNode.PositionY - lastNode.ConnectedTo.PositionY) / 2.0 + lastNode.ConnectedTo.PositionY;
            var result = new Destination
            {
                Location = new Vector(lastNode.ConnectedTo.PositionX, lastNode.ConnectedTo.PositionY),
                Road     = GPSSystem.NearestRoad(new Vector(roadX, roadY))
            };

            if (_calculationCache.ContainsKey(callerId))
            {
                _calculationCache.Remove(callerId);
            }
            _calculationCache.Add(callerId, new Tuple <Destination, List <ConnectedNode> >(endDestination, closedNodes));

            // find next node
            return(lastNode.ConnectedTo);
        }
 public void AddNodeUpdateResult(string name, NodeNetworkCopy network, Node target, Node invoker = null)
 {
     _networks.Add(name, new NodeUpdateData(network, target, invoker));
     Instance.Dispatcher.Invoke(() => { Instance.ListBoxResults.Items.Add(name); });
 }
 /// <summary>
 /// Adds a step of the algorithm to all windows so it can be reviewed
 /// </summary>
 public void AddNetworkResult(string name, NodeNetworkCopy network, Node from, Node to)
 {
     _networks.Add(name, new AlgoStepData(network, from, to));
     Instance.Dispatcher.Invoke(() => { Instance.ListBoxResults.Items.Add(name); });
 }
 public NodeUpdateData(NodeNetworkCopy network, Node target, Node invoker = null)
 {
     Network = network;
     Target  = target;
     Invoker = invoker;
 }
 public AlgoStepData(NodeNetworkCopy network, Node from, Node to)
 {
     Network = network;
     From    = from;
     To      = to;
 }