private List <Node> GetOnlyAvailableTransitions(List <Node> nodes) { var availableNodes = new List <Node>(nodes); if (AppliedRules.Any()) { foreach (var node in nodes) { foreach (var appliedRule in AppliedRules) { if (Enumerable.SequenceEqual(node.GetJugsCurrent, appliedRule.GetJugsCurrent)) { availableNodes.Remove(node); } } } } Console.WriteLine($"Transições disponíveis: {Helper.PrintNodes(availableNodes)}"); return(availableNodes); }
public Node ChooseBestNode(List <Node> nodes) { OpenRules.AddRange(nodes); var candidateNodes = OpenRules.Where(x => x.Function == OpenRules.Min(x => x.Function)).ToList(); Node bestNode = null; if (candidateNodes.Count() > 1) { var higherDepth = candidateNodes.Min(x => x.Depth); var higherDepthNodes = candidateNodes.Where(x => x.Depth == higherDepth).ToList(); bestNode = higherDepthNodes.FirstOrDefault(); if (higherDepthNodes.Count() > 1) { var openRules = new List <Node>(OpenRules); foreach (var openRule in openRules) { if (Enumerable.SequenceEqual(openRule.GetJugsCurrent, bestNode.GetJugsCurrent)) { OpenRules.RemoveAll(x => Enumerable.SequenceEqual(x.GetJugsCurrent, bestNode.GetJugsCurrent)); } } } } else { bestNode = candidateNodes.FirstOrDefault(); } Console.WriteLine($"Abertas: {Helper.PrintNodes(OpenRules)}"); Console.WriteLine($"Fechadas: {Helper.PrintNodes(AppliedRules)} \n"); AppliedRules.Add(bestNode); PruneNodes(OpenRules); OpenRules.Remove(bestNode); return(bestNode); }