示例#1
0
        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);
        }