Почему моя модель AI тренируется, но не развивается - ML Agents - PullRequest
0 голосов
/ 07 апреля 2020

Создана простая игра в единство, где мяч должен поразить цели, не задев стены. Итак, начались тренировки и результаты были слишком плохими. Мяч просто собирает одну из 4 целей. Но EndEpisode () происходит, когда он собирает последнюю цель.

Снимок экрана сцены и пути шаров на протяжении всего обучения 1650 000 шагов (если я не ошибаюсь, так как я назвал это поколением для каждые 10 000 шагов тренировки.)

Мяч даже не пытается поразить вторую цель. Что не так с моим кодом?

Я даже пытался с RayPerceptionSensor3D заменить сферу цилиндром, чтобы она не переворачивалась и не мешала rayperceptionSensor3d. Но это дает еще худшие результаты.

using System.Security.Cryptography;
using System.Data.SqlTypes;
using System.Security;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.ComponentModel.Design.Serialization;
using System.Collections.Generic;
using UnityEngine;
using MLAgents;
using MLAgents.Sensors;
using TMPro;

public class MazeRoller : Agent
{

    Rigidbody rBody;
    Vector3 ballpos;
    void Start () {
        rBody = GetComponent<Rigidbody>();
        ballpos = rBody.transform.position;
    }


    public TextMeshPro text;
    public TextMeshPro miss;
    public TextMeshPro hit;
    int count=0,c=0,h=0,m=0;

    int boxescollect=0;

    public Transform Target;
    public Transform st1;
    public Transform st2;
    public Transform st3;

    public override void OnEpisodeBegin()
    {
        rBody.angularVelocity = Vector3.zero;
        rBody.velocity = Vector3.zero;
        rBody.transform.position = ballpos;
        boxescollect=0;

        st1.GetComponent<Renderer> ().enabled = true;
        st1.GetComponent<Collider> ().enabled = true;

        st2.GetComponent<Renderer> ().enabled = true;
        st2.GetComponent<Collider> ().enabled = true;

        st3.GetComponent<Renderer> ().enabled = true;
        st3.GetComponent<Collider> ().enabled = true;
    }


    void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.name == "Target")
        {
            if(st1.GetComponent<Renderer> ().enabled==true || st2.GetComponent<Renderer> ().enabled==true || st3.GetComponent<Renderer> ().enabled==true)
            {
                SetReward(-3.0f+(float)(boxescollect));
            }

            SetReward(2.0f);

            h++;
            hit.SetText(h+"");

            EndEpisode();
        }

        else if(collision.gameObject.name == "Target1")
        {
            boxescollect++;
            AddReward(0.2f);
            st1.GetComponent<Renderer> ().enabled = false;
            st1.GetComponent<Collider> ().enabled = false;
        }

        else if(collision.gameObject.name == "Target2")
        {
            boxescollect++;
            AddReward(0.4f);
            st2.GetComponent<Renderer> ().enabled = false;
            st2.GetComponent<Collider> ().enabled = false;
        }

        else if(collision.gameObject.name == "Target3")
        {
            boxescollect++;
            AddReward(0.6f);
            st3.GetComponent<Renderer> ().enabled = false;
            st3.GetComponent<Collider> ().enabled = false;

        }

        //collision.gameObject.name == "wall1"||collision.gameObject.name == "wall2"||collision.gameObject.name == "wall3"||collision.gameObject.name == "wall4"||collision.gameObject.name == "wall5"||collision.gameObject.name == "wall6"||collision.gameObject.name == "wall7"

        else if(collision.gameObject.tag == "wall")
        {

            if(st1.GetComponent<Renderer> ().enabled==true || st2.GetComponent<Renderer> ().enabled==true || st3.GetComponent<Renderer> ().enabled==true)
            {
                AddReward(-3.0f+(float)(boxescollect));
            }

            SetReward(-1.0f);
            m++;
            miss.SetText(m+"");
            EndEpisode();
        }


    }

    public override void CollectObservations(VectorSensor sensor)
    {
        // Target and Agent positions
        sensor.AddObservation(Target.position);
        sensor.AddObservation(this.transform.position);

        sensor.AddObservation(boxescollect);
        sensor.AddObservation(boxescollect-3);

        sensor.AddObservation(st1.position);
        sensor.AddObservation(st2.position);
        sensor.AddObservation(st3.position);


        float dist = Vector3.Distance(Target.position,this.transform.position);
        //Distance between Agent and target
        sensor.AddObservation(dist);

        float d1 = Vector3.Distance(st1.position,this.transform.position);
        //Distance between Agent and target
        sensor.AddObservation(d1);


        float d2 = Vector3.Distance(st2.position,this.transform.position);
        //Distance between Agent and target
        sensor.AddObservation(d2);


        float d3 = Vector3.Distance(st3.position,this.transform.position);
        //Distance between Agent and target
        sensor.AddObservation(d3);

        // Agent velocity
        sensor.AddObservation(rBody.velocity.x);
        sensor.AddObservation(rBody.velocity.z);
    }

    public float speed = 10;
    public override void OnActionReceived(float[] vectorAction)
    {
        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = vectorAction[0];
        controlSignal.z = vectorAction[1];
        //speed = vectorAction[2];
        rBody.AddForce(controlSignal * speed);
        //speed=0;

        count++;

        if(count==10000)
        {

            count=0;
            h=0;
            m=0;
            c++;
            miss.SetText(m+"");
            hit.SetText(h+"");
            text.SetText(c+"");
        }

    }

    public override float[] Heuristic()
    {
        var action = new float[2];
        action[0] = Input.GetAxis("Horizontal");
        action[1] = Input.GetAxis("Vertical");
        return action;
    }
}

странный график тренировки - тензорная доска Это то, что я получаю после тренировки на тензорной доске.

1 Ответ

0 голосов
/ 05 мая 2020

Вы заканчиваете эпизод только одной достигнутой целью, а не для полного достижения своей цели. Таким образом, ваша диаграмма выглядит грязной, она завершает эпизод слишком рано, агент не понимает его цели.

Я думаю, вы могли бы добавить несколько новых правил. - если агент отскакивает от своих шагов, он наказан - агент получит наказание, если он не возьмет все 4 куба до конца эпизода

, эпизод должен закончиться, только если агент завершит задачу забрать все 4 кубика (награда) или если агент предпринял ряд шагов, не достигнув своей цели (наказано)

Я надеюсь, что это может помочь. Я чувствую, что мой плохой Энгли sh.

___ edit 2: ___

Весьма вероятно, что ваша проблема имеет характеристики, аналогичные описанным в этом документе. (в частности, стр. 28)

https://repositorio.upct.es/bitstream/handle/10317/8094/tfg-san-est.pdf?sequence=1&isAllowed=y (Это на испанском sh, извините, но переводчик Google даст вам довольно точный перевод.)

проблема в документе идентична вашей, у агента были проблемы с углами, когда он достигает угла, он возвращается к исходной точке, что произошло только с углами.

Вы пытались изменить обстановку? Может быть ... попробуйте без стен, чтобы увидеть, действительно ли агент ищет "все" цели и go глубже в проблему.

график является наименьшим, это всего лишь представление. У вас не будет хорошего графика, если агент не выполняет свою миссию.

...