q value iteration

This commit is contained in:
Arjun Patel
2019-03-07 13:21:28 -08:00
parent 172b7c7dd3
commit b177b47969
2 changed files with 57 additions and 11 deletions
+1
View File
@@ -0,0 +1 @@
__pycache__
+50 -5
View File
@@ -26,11 +26,13 @@
# Pieter Abbeel ([email protected]). # Pieter Abbeel ([email protected]).
import mdp, util import mdp
import util
from learningAgents import ValueEstimationAgent from learningAgents import ValueEstimationAgent
import collections import collections
class ValueIterationAgent(ValueEstimationAgent): class ValueIterationAgent(ValueEstimationAgent):
""" """
* Please read learningAgents.py before reading this.* * Please read learningAgents.py before reading this.*
@@ -40,6 +42,7 @@ class ValueIterationAgent(ValueEstimationAgent):
for a given number of iterations using the supplied for a given number of iterations using the supplied
discount factor. discount factor.
""" """
def __init__(self, mdp, discount=0.9, iterations=100): def __init__(self, mdp, discount=0.9, iterations=100):
""" """
Your value iteration agent should take an mdp on Your value iteration agent should take an mdp on
@@ -62,7 +65,26 @@ class ValueIterationAgent(ValueEstimationAgent):
def runValueIteration(self): def runValueIteration(self):
# Write value iteration code here # Write value iteration code here
"*** YOUR CODE HERE ***" "*** YOUR CODE HERE ***"
INF, NEG_INF = float("inf"), -float("inf")
# Run through iterations
for i in range(self.iterations):
# copy function defined?
policy = self.values.copy()
# MDP states
mdp_states = self.mdp.getStates()
for curr_state in mdp_states:
# curr state is exit
if not self.mdp.isTerminal(curr_state):
options_actions = self.mdp.getPossibleActions(curr_state)
optimal = max([self.getQValue(curr_state, x)
for x in options_actions])
# add optimal to the policy
policy[curr_state] = optimal
# Update the new best policy
self.values = policy
def getValue(self, state): def getValue(self, state):
""" """
@@ -70,14 +92,22 @@ class ValueIterationAgent(ValueEstimationAgent):
""" """
return self.values[state] return self.values[state]
def computeQValueFromValues(self, state, action): def computeQValueFromValues(self, state, action):
""" """
Compute the Q-value of action in state from the Compute the Q-value of action in state from the
value function stored in self.values. value function stored in self.values.
""" """
"*** YOUR CODE HERE ***" "*** YOUR CODE HERE ***"
util.raiseNotDefined() curr_val = 0
possible = self.mdp.getTransitionStatesAndProbs(state, action)
for new_state, prob in possible:
r = self.mdp.getReward(state, action, new_state)
val = self.values[new_state]
curr_val = curr_val + prob * ((self.discount * val) + r)
return curr_val
def computeActionFromValues(self, state): def computeActionFromValues(self, state):
""" """
@@ -89,7 +119,19 @@ class ValueIterationAgent(ValueEstimationAgent):
terminal state, you should return None. terminal state, you should return None.
""" """
"*** YOUR CODE HERE ***" "*** YOUR CODE HERE ***"
util.raiseNotDefined() # end iteration
if self.mdp.isTerminal(state):
return None
curr_val, optimal_action = -float("inf"), ''
for action in self.mdp.getPossibleActions(state):
curr_qval = self.computeQValueFromValues(state, action)
# update if better
if curr_qval >= curr_val:
curr_val = curr_qval
optimal_action = action
return optimal_action
def getPolicy(self, state): def getPolicy(self, state):
return self.computeActionFromValues(state) return self.computeActionFromValues(state)
@@ -101,6 +143,7 @@ class ValueIterationAgent(ValueEstimationAgent):
def getQValue(self, state, action): def getQValue(self, state, action):
return self.computeQValueFromValues(state, action) return self.computeQValueFromValues(state, action)
class AsynchronousValueIterationAgent(ValueIterationAgent): class AsynchronousValueIterationAgent(ValueIterationAgent):
""" """
* Please read learningAgents.py before reading this.* * Please read learningAgents.py before reading this.*
@@ -110,6 +153,7 @@ class AsynchronousValueIterationAgent(ValueIterationAgent):
for a given number of iterations using the supplied for a given number of iterations using the supplied
discount factor. discount factor.
""" """
def __init__(self, mdp, discount=0.9, iterations=1000): def __init__(self, mdp, discount=0.9, iterations=1000):
""" """
Your cyclic value iteration agent should take an mdp on Your cyclic value iteration agent should take an mdp on
@@ -131,6 +175,7 @@ class AsynchronousValueIterationAgent(ValueIterationAgent):
def runValueIteration(self): def runValueIteration(self):
"*** YOUR CODE HERE ***" "*** YOUR CODE HERE ***"
class PrioritizedSweepingValueIterationAgent(AsynchronousValueIterationAgent): class PrioritizedSweepingValueIterationAgent(AsynchronousValueIterationAgent):
""" """
* Please read learningAgents.py before reading this.* * Please read learningAgents.py before reading this.*
@@ -139,6 +184,7 @@ class PrioritizedSweepingValueIterationAgent(AsynchronousValueIterationAgent):
(see mdp.py) on initialization and runs prioritized sweeping value iteration (see mdp.py) on initialization and runs prioritized sweeping value iteration
for a given number of iterations using the supplied parameters. for a given number of iterations using the supplied parameters.
""" """
def __init__(self, mdp, discount=0.9, iterations=100, theta=1e-5): def __init__(self, mdp, discount=0.9, iterations=100, theta=1e-5):
""" """
Your prioritized sweeping value iteration agent should take an mdp on Your prioritized sweeping value iteration agent should take an mdp on
@@ -150,4 +196,3 @@ class PrioritizedSweepingValueIterationAgent(AsynchronousValueIterationAgent):
def runValueIteration(self): def runValueIteration(self):
"*** YOUR CODE HERE ***" "*** YOUR CODE HERE ***"