Untitled

 avatar
unknown
python
5 months ago
1.8 kB
4
Indexable
from queue import PriorityQueue

class HeuristicPlanner(PDDLPlanner):
    def __init__(self, heuristic=MaxHeuristic(), verbose=False, collect_stats=False):
        super().__init__(verbose, collect_stats)
        self.h = heuristic

    def solve(self, actions, state, goals):
        frontier = PriorityQueue()
        closedSet = set()
        initialCost = self.h.h(actions, state, goals)
        frontier.put((initialCost, id(state), state, []))

        while not frontier.empty():
            _, _, currentState, currentPlan = frontier.get()

            if self._goalsAchieved(currentState, goals):
                return currentPlan

            if currentState in closedSet:
                continue
            closedSet.add(currentState)

            for action in actions:
                if self._isApplicable(currentState, action):
                    nextState = self._applyAction(currentState, action)

                    if nextState in closedSet:
                        continue

                    g = len(currentPlan) + 1
                    h = self.h.h(actions, nextState, goals)
                    if h == float("inf"):
                        continue
                    totalCost = g + h

                    frontier.put((totalCost, id(nextState), nextState, currentPlan + [action]))

        return None

    def _goalsAchieved(self, state, goals):
        positiveGoals, negativeGoals = goals
        return positiveGoals.issubset(state) and not any(goal in state for goal in negativeGoals)

    def _isApplicable(self, state, action):
        return action.positive_preconditions.issubset(state)

    def _applyAction(self, state, action):
        newState = set(state)
        newState.update(action.add_effects)
        newState.difference_update(action.del_effects)
        return frozenset(newState)
Editor is loading...
Leave a Comment