Untitled
unknown
plain_text
2 years ago
2.6 kB
5
Indexable
def foodLogicPlan(problem) -> List:
"""
Given an instance of a FoodPlanningProblem, return a list of actions that help Pacman
eat all of the food.
Available actions are ['North', 'East', 'South', 'West']
Note that STOP is not an available action.
Overview: add knowledge incrementally, and query for a model each timestep. Do NOT use pacphysicsAxioms.
"""
walls = problem.walls
width, height = problem.getWidth(), problem.getHeight()
walls_list = walls.asList()
(x0, y0), food = problem.start
food = food.asList()
# Get lists of possible locations (i.e. without walls) and possible actions
all_coords = list(itertools.product(range(width + 2), range(height + 2)))
non_wall_coords = [loc for loc in all_coords if loc not in walls_list]
actions = ["North", "South", "East", "West"]
KB = []
KB.append(PropSymbolExpr(pacman_str, x0, y0, time=0))
# Initialize Food[x,y]_t variables with the code
# PropSymbolExpr(food_str, x, y, time=t), where each variable is
# true if and only if there is a food at (x, y) at time t.
for x, y in food:
KB.append(PropSymbolExpr(food_str, x, y, time=0))
for t in range(0, 50):
print("t = ", t)
possibleCoords = []
for x, y in non_wall_coords:
possibleCoords.append(PropSymbolExpr(pacman_str, x, y, time=t))
KB.append(exactlyOne(possibleCoords))
allFood = []
for x, y in non_wall_coords:
allFood.append(PropSymbolExpr(food_str, x, y, time=t))
# goal assertion sentence must be true if and only if all of
# the food have been eaten. This happens when all Food[x,y]_t
# are false.
model = findModel(
conjoin(conjoin(KB), ~disjoin(allFood)),
)
if model:
return extractActionSequence(model, actions)
actionlist = []
for action in actions:
actionlist.append(PropSymbolExpr(action, time=t))
KB.append(exactlyOne(actionlist))
transitionModelSentences = []
for x, y in non_wall_coords:
transitionModelSentences.append(
pacmanSuccessorAxiomSingle(x, y, t + 1, walls)
)
KB += transitionModelSentences
# food successor axiom
for x, y in non_wall_coords:
P1 = PropSymbolExpr(food_str, x, y, time=t)
P2 = ~PropSymbolExpr(pacman_str, x, y, time=t)
C = PropSymbolExpr(food_str, x, y, time=t + 1)
KB.append(C % conjoin(P1, P2))Editor is loading...
Leave a Comment