Beispiel #1
0
        private void StealBetterNodes(Edge edgeA, Edge edgeB, WorkingSet workingSet, List <Node> stealableNodes)
        {
            var newConnection = new NodeConnection(edgeA, edgeB);

            var nodesThatShouldBeStolen = new List <StealCandidate>();

            foreach (var stealableNode in stealableNodes)
            {
                if (Equals(stealableNode, newConnection.Center))
                {
                    continue;
                }

                var candidate         = GetCandidate(stealableNode, workingSet.CurrentWalk);
                var removeEdgeSavings = (candidate.AtoCenterDistance + candidate.BtoCenterDistance) - candidate.AtoBDistance;

                var stealingEdgeCandidates = GetEdgesNotContainingNode(candidate.Center, newConnection.EdgeA,
                                                                       newConnection.EdgeB);

                if (stealingEdgeCandidates.Any())
                {
                    double additionalEdgeCost;
                    var    stealingEdge = NodeFinder.BestEdgeFromNode(stealingEdgeCandidates, candidate.Center,
                                                                      Calculator.AddedDistance, (att, best) => att < best, out additionalEdgeCost);

                    if (additionalEdgeCost < removeEdgeSavings) //Steal
                    {
                        nodesThatShouldBeStolen.Add(new StealCandidate(stealingEdge, candidate,
                                                                       removeEdgeSavings - additionalEdgeCost));
                    }
                }
            }

            var bestCandidate = nodesThatShouldBeStolen.OrderByDescending(x => x.CostSavings).FirstOrDefault();

            StealNode(bestCandidate, workingSet);
        }