Пример #1
0
        public override double TransitionProbability(Action a, State sTag)
        {
            MazeAction ma = (MazeAction)a;

            if (m_mdMaze.IsTargetSqaure(this) && ma.Name == "Forward")
            {
                if (m_mdMaze.IsGoalState(sTag))
                {
                    return(1.0);
                }
                return(0.0);
            }

            double dProb = 0.0;

            if (sTag.Equals(this))
            {
                dProb += 1 - ActionSuccessProbability;
            }
            MazeState s = Apply(ma, true);

            if (s.Equals(sTag))
            {
                dProb += ActionSuccessProbability;
            }
            return(dProb);
        }
Пример #2
0
 private MazeState Apply(MazeAction ma, bool bSuccess)
 {
     if (m_mdMaze.IsTargetSqaure(this) && ma.Name == "Forward")
     {
         return(new MazeState(-1, -1, Direction.North, m_mdMaze));
     }
     if (X == -1 && Y == -1)
     {
         return(this);
     }
     if (!bSuccess)
     {
         return(this);
     }
     if (ma.Name == "TurnLeft")
     {
         return(new MazeState(X, Y, TurnLeft(CurrentDirection), m_mdMaze));
     }
     if (ma.Name == "TurnRight")
     {
         return(new MazeState(X, Y, TurnRight(CurrentDirection), m_mdMaze));
     }
     if (ma.Name == "Forward")
     {
         int iEndX = 0, iEndY = 0;
         Forward(X, Y, out iEndX, out iEndY);
         if (iEndX != X || iEndY != Y)
         {
             return(new MazeState(iEndX, iEndY, CurrentDirection, m_mdMaze));
         }
     }
     return(this);
 }
Пример #3
0
        public override State Apply(Action a)
        {
            MazeAction ma = (MazeAction)a;

            if (RandomGenerator.NextDouble() < ActionSuccessProbability)
            {
                return(Apply(ma, true));
            }
            else
            {
                return(Apply(ma, false));
            }
        }
Пример #4
0
        public override IEnumerable <State> Successors(Action a)
        {
            MazeAction ma = (MazeAction)a;

            if (m_mdMaze.IsTargetSqaure(this) && ma.Name == "Forward")
            {
                yield return(new MazeState(-1, -1, Direction.North, m_mdMaze));
            }
            else
            {
                yield return(this);

                MazeState sTag = Apply(ma, true);
                if (sTag != this)
                {
                    yield return(sTag);
                }
            }
        }