Example #1
0
    DriveSnapShot GrabDriveSnapShot()
    {
        var drivecontroller = Car.GetComponent <RearWheelDrive>();
        var sensors         = Car.GetComponentsInChildren <DetectionLaser>();

        var snapshot = new DriveSnapShot();

        snapshot.Speed         = drivecontroller.Speed;
        snapshot.SteeringAngle = drivecontroller.SteeringAngle;
        snapshot.Tourgue       = drivecontroller.Tourque;
        snapshot.SensorLeft    = sensors.Where(s => s.Name == "L").First().Distance;
        snapshot.SensorFront   = sensors.Where(s => s.Name == "F").First().Distance;
        snapshot.SensorRight   = sensors.Where(s => s.Name == "R").First().Distance;

        return(snapshot);
    }
Example #2
0
    void AddSample(RearWheelDrive drivecontroller, float reward)
    {
        drivecontroller.InputControl = false;

        var snap = GrabDriveSnapShot();

        var input = new Tensor1D(new float[] { snap.Speed, snap.SensorLeft, snap.SensorFront, snap.SensorRight });

        var result = (Tensor1D)Network.Forward(input);

        var outlist = result.Tolist();

        var steeringdim = _Actions.ActionTable.GetLength(0);
        var trouquedim  = _Actions.ActionTable.GetLength(1);

        //a.SteeringNumber* a.SteeringCount + a.TourgueNumber = index

        var maxindex = outlist.IndexOf(outlist.Max());

        var _rnd         = new System.Random();
        var randomdouble = _rnd.NextDouble();

        if (0.2 >= randomdouble)
        {
            maxindex = _rnd.Next(0, outlist.Count);
        }

        var currenttime = Time.time;

        if (currenttime - _ActionTime > 0.2)
        {
            _ActionTime = currenttime;
        }
        else
        {
            return;
        }

        var steeringindex = maxindex / steeringdim;
        var touqueindex   = maxindex % steeringdim;

        var action = _Actions.ActionTable[steeringindex, touqueindex];

        drivecontroller.SteeringAngle = action.SteeringAngle;
        drivecontroller.Tourque       = Math.Max(action.Tourque, 0);

        var transition = new Transition();

        if (_LastSnap != null)
        {
            transition.InputA = _LastInput;
            transition.InputB = input;

            transition.OutputA = _LastOutput;
            transition.OutputB = result;

            transition.Reward = PreviousReward;

            transition.Action = action;

            currenttime = Time.time;

            if (currenttime - _Time > 0.2)
            {
                _Time = currenttime;
                _Transitions.Add(transition);
            }
        }

        _LastSnap      = snap;
        _LastInput     = input;
        _LastOutput    = result;
        PreviousReward = reward;
        LastPos        = Car.transform.position;
    }