Implement project 4 q1-q5.

This commit is contained in:
2021-12-12 20:00:03 -05:00
parent 00721c4f56
commit 892a0afb54
2 changed files with 83 additions and 21 deletions

View File

@@ -162,5 +162,27 @@ class GreedyBustersAgent(BustersAgent):
livingGhostPositionDistributions = \
[beliefs for i, beliefs in enumerate(self.ghostBeliefs)
if livingGhosts[i+1]]
"*** YOUR CODE HERE ***"
util.raiseNotDefined()
def getMaxProbPos(distribution):
return max([(prob, pos) for pos, prob in distribution.items()])[1]
closestGhostPosition = None
closestGhostDist = float("inf")
for distribution in livingGhostPositionDistributions:
ghostPosition = getMaxProbPos(distribution)
dist = self.distancer.getDistance(pacmanPosition, ghostPosition)
if dist < closestGhostDist:
closestGhostPosition = ghostPosition
closestGhostDist = dist
if closestGhostPosition is None:
return 'Stop'
distanceActionTuples = [
(self.distancer.getDistance(
Actions.getSuccessor(pacmanPosition, action),
closestGhostPosition),
action)
for action in legal]
return min(distanceActionTuples)[1]

View File

@@ -149,17 +149,18 @@ class ExactInference(InferenceModule):
pacmanPosition = gameState.getPacmanPosition()
"*** YOUR CODE HERE ***"
util.raiseNotDefined()
# Replace this code with a correct observation update
# Be sure to handle the "jail" edge case where the ghost is eaten
# and noisyDistance is None
allPossible = util.Counter()
for p in self.legalPositions:
trueDistance = util.manhattanDistance(p, pacmanPosition)
if emissionModel[trueDistance] > 0:
allPossible[p] = 1.0
if noisyDistance is None:
# Ghost is in jail.
for p in self.legalPositions:
allPossible[p] = 0.0
jailPosition = self.getJailPosition()
allPossible[jailPosition]= 1.0
else:
for p in self.legalPositions:
trueDistance = util.manhattanDistance(p, pacmanPosition)
pNoisy = emissionModel[trueDistance]
allPossible[p] = pNoisy * self.beliefs[p]
"*** END YOUR CODE HERE ***"
allPossible.normalize()
@@ -218,8 +219,18 @@ class ExactInference(InferenceModule):
are used and how they combine to give us a belief distribution over new
positions after a time update from a particular position.
"""
"*** YOUR CODE HERE ***"
util.raiseNotDefined()
pacmanPosition = gameState.getPacmanPosition()
allPossible = util.Counter()
for pos in self.legalPositions:
allPossible[pos] = 0.0
for oldPos in self.legalPositions:
newPosDist = self.getPositionDistribution(self.setGhostPosition(gameState, oldPos))
for newPos, prob in newPosDist.items():
allPossible[newPos] += self.beliefs[oldPos] * prob
allPossible.normalize()
self.beliefs = allPossible
def getBeliefDistribution(self):
return self.beliefs
@@ -253,7 +264,9 @@ class ParticleFilter(InferenceModule):
Storing your particles as a Counter (where there could be an associated
weight with each position) is incorrect and may produce errors.
"""
"*** YOUR CODE HERE ***"
numLegalPositions = len(self.legalPositions)
self.particles = [self.legalPositions[i % numLegalPositions]
for i in range(self.numParticles)]
def observe(self, observation, gameState):
"""
@@ -283,10 +296,28 @@ class ParticleFilter(InferenceModule):
distance between a particle and Pacman's position.
"""
noisyDistance = observation
emissionModel = busters.getObservationDistribution(noisyDistance)
# 1)
if noisyDistance is None:
self.particles = [self.getJailPosition()
for _ in range(self.numParticles)]
return
pacmanPosition = gameState.getPacmanPosition()
"*** YOUR CODE HERE ***"
util.raiseNotDefined()
emissionModel = busters.getObservationDistribution(noisyDistance)
distribution, samples = [], []
for particle in self.particles:
trueDistance = util.manhattanDistance(particle, pacmanPosition)
probability = emissionModel[trueDistance]
distribution.append(probability)
samples.append(particle)
# 2)
if not [p for p in distribution if p > 0.0]:
self.initializeUniformly(gameState)
return
self.particles = util.nSample(distribution, samples, self.numParticles)
def elapseTime(self, gameState):
"""
@@ -303,7 +334,12 @@ class ParticleFilter(InferenceModule):
a belief distribution.
"""
"*** YOUR CODE HERE ***"
util.raiseNotDefined()
newParticles = []
for oldPos in self.particles:
newPosDist = self.getPositionDistribution(self.setGhostPosition(gameState, oldPos))
newParticle = util.sample(newPosDist)
newParticles.append(newParticle)
self.particles = newParticles
def getBeliefDistribution(self):
"""
@@ -312,8 +348,12 @@ class ParticleFilter(InferenceModule):
essentially converts a list of particles into a belief distribution (a
Counter object)
"""
"*** YOUR CODE HERE ***"
util.raiseNotDefined()
allPossible = util.Counter()
for particle in self.particles:
allPossible[particle] += 1
allPossible.normalize()
return allPossible
class MarginalInference(InferenceModule):
"""