;;; 4x3-eval.lisp ;;; Approximate utility function for the 4x3 MDP. ;;;; Features (defun 4x3-heaven-inverse-distance (state) (/ 1 (x+y-distance state (@ 4 3)))) (defun 4x3-hell-inverse-distance (state) (/ 1 (x+y-distance state (@ 4 2)))) (defun 4x3-heaven-inverse-distance-squared (state) (/ 1 (square (x+y-distance state (@ 4 3))))) (defun 4x3-hell-inverse-distance-squared (state) (/ 1 (square (x+y-distance state (@ 4 2))))) (defvar *4x3-features*) (setq *4x3-features* (list #'4x3-heaven-inverse-distance #'4x3-heaven-inverse-distance-squared #'4x3-hell-inverse-distance #'4x3-hell-inverse-distance-squared )) (defvar *4x3-weights*) (setq *4x3-weights* '(+0.4 ; 4x3-heaven-inverse-distance +0.4 ; 4x3-heaven-inverse-distance-squared -0.25 ; 4x3-hell-inverse-distance -0.5 ; 4x3-hell-inverse-distance-squared )) ;;;; Approximate utility function (defun 4x3-eval (state) "Return a value for 4x3-mdp state using a linear combination of features." (linear-eval state *4x3-features* *4x3-weights*)) (defun linear-eval (state features weights) "Return a value for state using a linear combination of features." (reduce #'+ (mapcar #'* weights (mapcar #'(lambda (f) (funcall f state)) features))))