-- -- | -- Module : RobberOneStepMoveFun -- Authors : Sean Seefried (http://www.cse.unsw.edu.au/~sseefried) -- Copyright : (c) 2005 -- License : GPL version 2 or later -- Created : 26 Jun 2005 -- -- Looks ahead one move. -- module RobberOneStepMoveFun where import Data.IORef import System.IO.Unsafe import Data.List -- Local imports import KnowledgeBase import RobberHeuristic import Syntax import Logging import Pretty import CR import Graph -- -- 1. Applies larceny, evidence dropping and bank transferal for current world. -- 2. Applies a dummy cop move -- 3. Applies a predicted move -- nextMove :: KnowledgeBase -> GNode -> GNode -> KnowledgeBase nextMove kb src tgt = let copNodes = map cop_node (kb_cops kb) kb' = robberMove kb src src kb'' = copMove kb' copNodes in robberMove kb'' src tgt moveFun :: CR Move moveFun = do kb <- getKB case kb_ownLoc kb of [(name,loc)] -> moveFun' name loc l -> fatal ("robber cannot be at " ++ show (length l) ++ " locations: " ++ show l) moveFun' :: Name -> GNode -> CR Move moveFun' name loc = do kb <- getKB let graphFoot = kb_footMap kb let succNodes = gsucc graphFoot loc candidateNodes = loc : succNodes -- include current node candidatePairs = map (\next -> (next, nextMove kb loc next)) candidateNodes checkGoodness (nextLoc, kbNext) = let g = goodness kbNext loc 5 -- cop thresh dist 0.5 -- nearMoneyCoeff 1 -- haveMoneyCoeff 1000 -- smelledCoeff 500 -- copCoeff 100000 -- caughtCoeff in return (g, nextLoc) orderLoc (a, _) (b, _) | a <= b = LT -- these are floats. EQ does not happen | otherwise = GT goodnessNodes <- mapM checkGoodness candidatePairs let showPprSnd (goodness, node) = (goodness, showPpr (locOfNode node)) bestNode = snd (maximumBy orderLoc goodnessNodes) debug $ "The goodnesses of the next nodes are: " ++ show (map showPprSnd goodnessNodes) -- -- Move to best node -- return $ Move (locOfNode bestNode) Robber name