Пример #1
0
    void Update()
    {
        // get current state and compare with last
        var currentState = DetermineState();

        if (currentState.Equals(lastState))
        {
            // do nothing if state did not change
            return;
        }

        // state changed => select an action and execute it
        var action = SelectAction(currentState);

        ExecuteAction(action);

        // Update QTable
        var reward = birdMvmt.IsDead() ? -1000 : 10 / (int)(Mathf.Abs(currentState.vDist) + 1.001);

        if (birdMvmt.IsDead())
        {
            FileWriter.WriteTable(qLearningTable, "qLearningTable");
            birdMvmt.ResetIsDead();
        }
        Debug.Log("State: " + currentState + " SelectedAction: " + action + " Reward: " + reward);
        qLearningTable[lastState][lastAction] += alpha * (reward + gamma * Mathf.Max((float)qLearningTable[currentState][Action.Flap], (float)qLearningTable[currentState][Action.Nop]) - qLearningTable[lastState][lastAction]);

        // update lastState
        lastState  = currentState;
        lastAction = action;
    }