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); }
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); }
public override State Apply(Action a) { MazeAction ma = (MazeAction)a; if (RandomGenerator.NextDouble() < ActionSuccessProbability) { return(Apply(ma, true)); } else { return(Apply(ma, false)); } }
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); } } }