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; }