記憶を引きずりながら進む確率過程

  • 重い…
sa :: Double
sa = 0.4
sb :: Double
sb = 0.3

g :: (Num a, Ord a ,Fractional a) => a -> a -> a -> a -> Double
g x y z w | (x+1)/(x+y+2) > (z+1)/(z+w+2) = 1
          | (x+1)/(x+y+2) < (z+1)/(z+w+2) = 0
          | otherwise         = 0.5

p :: (Num a, Ord a ,Fractional a) => a -> a -> a -> a -> Double
p 0 0 0 0 = 1
p (-1) _ _ _ = 0
p _ (-1) _ _ = 0
p _ _ (-1) _ = 0
p _ _ _ (-1) = 0
p x y z w = (p (x-1) y z w) * (g (x-1) y z w) * sa
              + (p x (y-1) z w) * (g x (y-1) z w) * (1-sa)
              + (p x y (z-1) w) * (1-(g x y (z-1) w)) * sb
              + (p x y z (w-1)) * (1-(g x y z (w-1))) * (1-sb)

k = 8.0

ss = [[x,y,z,w] | x <- [0..k], y <- [0..k], z <- [0..k], w <- [0..k], x + y + z + w == k]

nsuccess = map (\x -> x!!0 + x!!2) ss

prob = map (\x -> (p (x !! 0) (x !! 1) (x !! 2) (x !! 3))) ss

expectsuccess = sum $ zipWith (*) nsuccess prob