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