// Fonction utilisé lorsqu'on joue contre l'ia // Elle retourne la meilleure action pour un etat donne public Vector2Int GetBestAction(ref TicTacToe.GameState gs) { var list = policy.Keys.ToList(); var idx = GetIndexOf(ref list, ref gs.Grid); if (idx >= 0) { Debug.LogWarning("Etat connu dans la policy !!"); return(policy.ElementAt(idx).Value); } Debug.LogWarning("Cette etat n'est pas contenu dans ma policy !"); var available = gs.GetAvailableCells(); var rdm = Random.Range(0, available.Count); return(new Vector2Int(available[rdm].Item1, available[rdm].Item2)); }
//Permet de simuler le GS d'un etat donne jusqu'a un etat final public float SimulateGameState(ref Dictionary <TicTacToe.GameState, Vector2Int> policy, ref List <TicTacToe.GameState> exploredState, ref TicTacToe.GameState gs) { int playerTurn = 0; bool gameEnd = false; // IA = Rond, donc playerWinner = 1 int playerWinner = -1; while (!gameEnd) { //Je prend l'action possible var c = gs.GetAvailableCells(); var selectedCell = c[Random.Range(0, c.Count)]; var clone = gs.Clone(); if (playerTurn == 1) { var test = policy.Keys.ToList(); // Epsilon greedy = range entre 0 - 10, et on tire RDM, si en dessous de Epsi action rdm, sinon policy // a Utiliser quand on fait la simulation d'un episode var gridToTest = GetIndexOf(ref test, ref clone.Grid); //policy.Any(x => x.Key.Grid == clone.Grid);//policy.ToList().FirstOrDefault(x => x.Key.Grid == clone.Grid).Key; if (gridToTest >= 0) { if (Random.Range(0.0f, 1.0f) > epsilonGreedy) { selectedCell = (policy[policy.ElementAt(gridToTest).Key].x, policy[policy.ElementAt(gridToTest).Key].y); } } else { policy.Add(clone, new Vector2Int(selectedCell.Item1, selectedCell.Item2)); } exploredState.Add(clone); } else { exploredState.Add(clone); //new Vector2Int(selectedCell.Item1, selectedCell.Item2)); } // Grid, N, R, ... if (ticTacToe.SetCellWithoutChangeGraphics(playerTurn, selectedCell.Item1, selectedCell.Item2, ref gs)) { var victoryState = ticTacToe.CheckVictory(ref gs); if (!victoryState.Item1) { if (!ticTacToe.CheckNullMatch(ref gs)) { ticTacToe.NextTurn(ref playerTurn); } else { gameEnd = true; playerWinner = victoryState.Item2; } } else { gameEnd = true; playerWinner = victoryState.Item2; } } } return(playerWinner == 1 ? winR : playerWinner == 0 ? nulR : loseR); }