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