Beispiel #1
0
        public Queue <Action> Plan(List <Action> actions, Dictionary <string, int> goal, WorldStates states)
        {
            var usableActions = actions.Where(x => x.IsAchievable()).ToList();
            var leaves        = new List <Node>();
            var start         = new Node(null, 0, World.Instance.GetWorldStates().GetStates(), null);

            var success = BuildGraph(start, leaves, usableActions, goal);

            if (!success)
            {
                Debug.Log("No plan found");
                return(null);
            }

            Node cheapest = null;

            foreach (var leaf in leaves)
            {
                if (cheapest == null)
                {
                    cheapest = leaf;
                }
                else
                {
                    if (leaf.Cost < cheapest.Cost)
                    {
                        cheapest = leaf;
                    }
                }
            }

            var result = new List <Action>();
            var n      = cheapest;

            while (n != null)
            {
                if (n.Action != null)
                {
                    result.Insert(0, n.Action);
                }

                n = n.Parent;
            }

            var queue = new Queue <Action>();

            foreach (var action in result)
            {
                queue.Enqueue(action);
            }

            Debug.Log("The plan is:");
            foreach (var action in queue)
            {
                Debug.Log($"{action.Name}");
            }

            return(queue);
        }