49 lines
1.5 KiB
Haskell
49 lines
1.5 KiB
Haskell
|
import AI.Vacuum
|
||
|
import AI.Vacuum.RandomGrid
|
||
|
import Control.Monad.State
|
||
|
import Control.Monad.Identity
|
||
|
import System.Random
|
||
|
import Data.Maybe (isJust, isNothing, fromJust)
|
||
|
|
||
|
chooseAction :: Percepts -> RandomState Action
|
||
|
chooseAction percepts
|
||
|
| PhotoSensor `elem` percepts = return SuckDirt
|
||
|
| InfraredSensor `elem` percepts = return TurnOff
|
||
|
| TouchSensor `elem` percepts = do
|
||
|
r <- getRandomR (True, False)
|
||
|
if r
|
||
|
then return TurnLeft
|
||
|
else return TurnRight
|
||
|
| otherwise = do
|
||
|
r <- getRandomR ((0.0, 1.0) :: (Float, Float))
|
||
|
chooseRandom r
|
||
|
where
|
||
|
chooseRandom r
|
||
|
| r < 0.1 = return TurnRight
|
||
|
| r < 0.2 = return TurnLeft
|
||
|
| otherwise = return GoForward
|
||
|
|
||
|
runCleaner :: Int -> Cleaner -> StateT Grid RandomState Cleaner
|
||
|
runCleaner turnsLeft cleaner@(Cleaner _ _ _ ph _) =
|
||
|
if turnsLeft == 1
|
||
|
then do
|
||
|
cleaner' <- doAction TurnOff cleaner
|
||
|
return cleaner'
|
||
|
else do
|
||
|
cleaner'' <- case ph of
|
||
|
[] -> do
|
||
|
cleaner' <- doAction GoForward cleaner
|
||
|
return cleaner'
|
||
|
_ -> do
|
||
|
action <- lift $ chooseAction (head ph)
|
||
|
cleaner' <- doAction action cleaner
|
||
|
return cleaner'
|
||
|
|
||
|
case clState cleaner'' of
|
||
|
Off -> return cleaner''
|
||
|
On -> runCleaner (turnsLeft - 1) cleaner''
|
||
|
|
||
|
simulateOnGrid :: Int -> Grid -> StdGen -> (Cleaner, Grid)
|
||
|
simulateOnGrid maxTurns grid gen =
|
||
|
evalState (runStateT (runCleaner maxTurns cleaner) grid) gen
|
||
|
where cleaner = createCleaner (fromJust $ cell (0,0) grid) East
|