protected override bool DidTrainingUnitComplete(ref bool wasUnitSuccessful) { if (SchoolWorld.IsEmulatingUnitCompletion()) { return(SchoolWorld.EmulateIsTrainingUnitCompleted(out wasUnitSuccessful)); } else { m_stepsSincePresented++; if (DidTrainingUnitFail()) { wasUnitSuccessful = false; return(true); } if (!m_teacher.IsDone() && m_agent.IsMoving()) { wasUnitSuccessful = false; return(true); } // save history for agent and teacher m_agentsHistory.Add(m_agent.Position.X, m_agent.Position.Y); m_teachersHistory.Add(m_teacher.Position.X, m_teacher.Position.Y); wasUnitSuccessful = false; int numberOfTeachersSteps = m_teachersHistory.numberOfSteps(); int numberOfAgentsSteps = m_agentsHistory.numberOfSteps(); // simple version of the task if (TSHints[STOP_REQUEST] == .0f) { if (numberOfTeachersSteps == numberOfAgentsSteps && m_teacher.IsDone()) { // compare step wasUnitSuccessful = m_teachersHistory.CompareTo(m_agentsHistory, m_stepsSincePresented); return(true); } } // hard version else { if (numberOfTeachersSteps == numberOfAgentsSteps && m_teacher.IsDone()) { m_delayedCheck = true; } if (m_delayedCheck) { m_delayedCheck = false; // compare steps wasUnitSuccessful = m_teachersHistory.CompareTo(m_agentsHistory, m_stepsSincePresented); return(true); } } return(false); } }
public virtual TrainingResult EvaluateStep() { // Check for unit completion bool wasUnitSuccessful = true; bool inProgress = (SchoolWorld.IsEmulatingUnitCompletion() && !SchoolWorld.EmulateIsTrainingUnitCompleted(out wasUnitSuccessful)) || (!SchoolWorld.IsEmulatingUnitCompletion() && !DidTrainingUnitComplete(ref wasUnitSuccessful)); if (inProgress) { // The unit is still in progress return(TrainingResult.TUInProgress); } // otherwise the unit is over CurrentNumberOfAttempts++; // Check for task failure if (TSHints.ContainsKey(TSHintAttributes.MAX_NUMBER_OF_ATTEMPTS) && CurrentNumberOfAttempts >= TSHints[TSHintAttributes.MAX_NUMBER_OF_ATTEMPTS]) { // Too many attempts Reward = -1.0f; return(TrainingResult.FailedLT); } if (wasUnitSuccessful) { Reward = 1.0f; CurrentNumberOfSuccesses++; } else { Reward = -1.0f; CurrentNumberOfSuccesses = 0; } MyLog.Writer.WriteLine( MyLogLevel.INFO, GetTypeName() + " unit ends with result: " + (wasUnitSuccessful ? "success" : "fail") + ". " + CurrentNumberOfSuccesses + " successful attempts in row, " + NumberOfSuccessesRequired + " required."); // Check for level completion if (CurrentNumberOfSuccesses < NumberOfSuccessesRequired) { // The level is still in progress return(TrainingResult.FinishedTU); } return(TrainingResult.FinishedLevel); }