예제 #1
0
        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);
        }
예제 #2
0
        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);
        }