IEnumerator Movement() { var keys = _keys[(int)Side]; while (true) { Action action = Idle; if (Input.GetKey(keys[0])) { action = MoveUp; } if (Input.GetKey(keys[1])) { action = MoveDown; } if (Side == Player.Player1) { QAIManager.Imitate(this, GetState(), action); } if (Side == Player.Player2) { action(); } yield return(new WaitForFixedUpdate()); } }
// Use this for initialization void Start() { IEnumerable <Vector3> positions = Goal.AllValidPositions(); var seeker = FindObjectOfType <GridWoman>(); var objMap = new Dictionary <Vector3, GameObject>(); var dirMap = new Dictionary <Vector3, Vector3>(); positions = positions.Where(p => !p.Equals(Goal.Position)); foreach (var position in positions) { var pos = position + new Vector3(0, 1, 0); seeker.transform.position = pos; var state = seeker.GetState(); var query = QAIManager.Query(state); var max = query.MaxBy(kv => kv.Value); var rotation = ActionToRotation(max.Key.ActionId); var arrow = CreateArrow(pos, rotation, max.Value); objMap.Add(pos, arrow); dirMap.Add(pos, FollowAction(pos, max.Key.ActionId)); } //Find cycles foreach (var cyclePos in dirMap.Where(kv => dirMap.ContainsKey(kv.Value) && kv.Key == dirMap[kv.Value])) { objMap[cyclePos.Key].GetComponentInChildren <Renderer>().material.color = Color.cyan; } EditorApplication.isPaused = true; }
void Start() { StartPosistion = transform.position; _game = FindObjectOfType <PongGame>(); _ball = FindObjectOfType <PongBall>(); if (Side == Player.Player1) { _grid = new QGrid(16, transform, new GridSettings { Offset = new Vector3(9.8f, 0, 0), ResolutionX = 1.28f, ResolutionY = 1.28f }); _vect = Vector <float> .Build.Dense(new[] { 1f }); QAIManager.InitAgent(this, new QOption { LearningRate = 0.005f, NetworkArgs = new [] { new CNNArgs { FilterSize = 4, FilterCount = 1, PoolLayerSize = 2, Stride = 2 } }, MaxPoolSize = 2000, BatchSize = 2000, EpsilonStart = 0.5f, EpsilonEnd = 0.1f, Discount = 0.95f, TrainingInterval = 20, TrainingCycle = 10, }); if (QAIManager.CurrentMode == QAIMode.Learning || QAIManager.CurrentMode == QAIMode.Testing) { Time.timeScale = 5f; } } StartCoroutine(Movement()); }
void FixedUpdate() { if (Side == Player.Player1) { _grid.DebugDraw(v => Color.Lerp(Color.black, Color.white, v / 250f)); QAIManager.GetAction(GetState())(); } }
public static void OpenWindow(QAIOptionWindow owner, QAIManager manager) { var w = (BenchmarkDialog)GetWindow(typeof(BenchmarkDialog), true, "Benchmark"); var p = w.position; w._optionWindow = owner; w._manager = manager; p.x = Screen.currentResolution.width / 2f - p.width / 2f; p.y = Screen.currentResolution.height / 2f - p.height; p.height = 100; w.position = p; w.ShowPopup(); }
IEnumerator Spas() { while (true) { Action a = Brake; if (Input.GetKey(SpeederKey)) { a = FullSpeed; } QAIManager.Imitate(this, GetState(), a); yield return(new WaitForFixedUpdate()); } }
private void Start() { _grid = new QGrid(13, transform, new GridSettings { NormalAxis = Axis.Y }); _linearState = Vector <float> .Build.Dense(2); _history = new LinkedList <QState>(); QAIManager.InitAgent(this, new QOption { NetworkArgs = new [] { new CNNArgs { FilterCount = 1, FilterSize = 1, PoolLayerSize = 1, Stride = 1 } } }); }
public void FixedUpdate() { if (_testModel) { Instantiate(Resources.Load <ModelTest>("ModelTest")); _testModel = false; } _grid.DebugDraw(value => value == 0 ? Color.red : value == 1 ? Color.gray : Color.yellow); if (QAIManager.CurrentMode != QAIMode.Imitating) { var state = GetState(); QAIManager.GetAction(state)(); ArchiveState(state); } else { Action currentAction = null; if (Key(KeyCode.UpArrow, KeyCode.W)) { currentAction = MoveUp; } if (Key(KeyCode.DownArrow, KeyCode.S)) { currentAction = MoveDown; } if (Key(KeyCode.RightArrow, KeyCode.D)) { currentAction = MoveRight; } if (Key(KeyCode.LeftArrow, KeyCode.A)) { currentAction = MoveLeft; } if (currentAction != null) { QAIManager.Imitate(this, GetState(), currentAction); } } }
public Action GetLearningAction(QState state) { if (!ModelReady()) { Iteration = 1; Initialize(state.GridSize, state.VectorSize, state.Depth); } if (!_isFirstTurn) { if (state.IsTerminal) { StoreSARS(new SARS(_prevState, _prevAction, state)); _isFirstTurn = true; return(null); } if (state.Equals(_prevState) && (Discretize || (!Discretize && _stateCounter <= 10))) { _stateCounter++; return(_prevAction.Action); } StoreSARS(new SARS(_prevState, _prevAction, state)); } var a = EpsilonGreedy(Epsilon(Iteration), state); _prevAction = a; _prevState = state; _stateCounter = 0; _isFirstTurn = false; _trainingCounter++; if (_trainingCounter >= TrainingInterval && Time.timeScale != 0) { var ts = Time.timeScale; _trainingCounter = 0; Time.timeScale = 0; QAIManager.RunCoroutine(PrioritySweeping ? RunPriotizedTraining(ts) : RunTraining(ts)); } return(a.Action); }
// Use this for initialization void Start() { GetComponentInChildren <SpriteRenderer>().shadowCastingMode = ShadowCastingMode.On; _onTrack = true; _distanceTravelled = StartPosition; Track.GetPointAtDistance(_distanceTravelled); _grid = new QGrid(16, transform, new GridSettings { Offset = Vector3.up * 5.2f }); _vector = Vector <float> .Build.Dense(10, 0); _velocityBin = new Bin(0.01f, 0.25f, 0.5f, 75f); _forceBin = new Bin(0.01f, 0.25f, 0.5f, 75f); var options = new QOption { Discretize = false, MaxPoolSize = 2000, BatchSize = 2000, EpsilonStart = 0.7f, Discount = 0.8f, TrainingInterval = 50, NetworkArgs = new [] { new CNNArgs { FilterSize = 4, FilterCount = 1, PoolLayerSize = 2, Stride = 2 } } }; options.Discretize = false; // if(AiControlled || QAIManager.CurrentMode == QAIMode.Imitating) { QAIManager.InitAgent(this, options); if (QAIManager.CurrentMode == QAIMode.Learning) { Time.timeScale = 2.0f; } // } StartCoroutine(Spas()); }
// Update is called once per frame void FixedUpdate() { if (_onTrack) { if (AiControlled) { QAIManager.GetAction(GetState())(); } UpdatePosistion(); } LapNumber = (int)((_distanceTravelled - StartPosition) / Track.length); if (LapNumber != PrevLap && LapNumber != 0) { PrevLap = LapNumber; Debug.Log("Time: " + LapTime); Debug.Log("Score: " + Track.length / LapTime); LapTime = 0; } else { LapTime += Time.deltaTime; } }
void CarOffTrack(int dir) { _onTrack = false; QAIManager.GetAction(GetState())(); StartCoroutine(DerailAnimation(dir)); }