public bool PolicyImprovement() { bool policyStable = true; for (int i = 0; i < longueurGrille; i++) { for (int j = 0; j < largeurGrille; j++) { if (!(i == longueurGrille - 1 && j == largeurGrille - 1) && !(etatsPieges.Contains(listeEtat[i, j]))) { codeAction temp = listeEtat[i, j].strategie; var actions = getPossibleActions(listeEtat[i, j]); List <float> scoresAction = new List <float>(actions.Count); Debug.Log(scoresAction.Count); for (int z = 0; z < actions.Count; z++) { scoresAction.Add(GetStateValue(actions[z], listeEtat[i, j])); } float maxValue = Mathf.Max(scoresAction.ToArray()); listeEtat[i, j].strategie = actions[scoresAction.IndexOf(maxValue)]; if (temp != listeEtat[i, j].strategie) { policyStable = false; } } } } return(policyStable); }
public Etat(int x, int y, bool arrivee, codeAction uneStrategie) { this.x = x; this.y = y; this.strategie = uneStrategie; if (arrivee) { value = 1000; } else { value = 0; } this.stratDisplayer = null; }
public float GetStateValue(codeAction a, Etat e) { switch (a) { case codeAction.BAS: return(rewardDeplacement + devaluation * listeEtat[e.x, e.y - 1].value); case codeAction.DROITE: return(rewardDeplacement + devaluation * listeEtat[e.x + 1, e.y].value); case codeAction.GAUCHE: return(rewardDeplacement + devaluation * listeEtat[e.x - 1, e.y].value); case codeAction.HAUT: return(rewardDeplacement + devaluation * listeEtat[e.x, e.y + 1].value); default: return(0); } }
void IAController() { Etat currentState = ia.getEtatFromPos(iaPositionX, iaPositionY); List <codeAction> actionPossible = ia.getPossibleActions(currentState); float valueMax = -1000000; codeAction bestChoice = codeAction.HAUT; foreach (codeAction action in actionPossible) { switch (action) { case codeAction.BAS: if (ia.getEtatFromPos(iaPositionX, iaPositionY - 1).value >= valueMax) { if (ia.getEtatFromPos(iaPositionX, iaPositionY - 1).value == valueMax) { bool change = false; float coin = UnityEngine.Random.Range(0.0f, 1.0f); if (coin > 0.5f) { change = true; } if (change) { valueMax = ia.getEtatFromPos(iaPositionX, iaPositionY - 1).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX, iaPositionY - 1); } } else { valueMax = ia.getEtatFromPos(iaPositionX, iaPositionY - 1).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX, iaPositionY - 1); } } break; case codeAction.DROITE: if (ia.getEtatFromPos(iaPositionX + 1, iaPositionY).value >= valueMax) { if (ia.getEtatFromPos(iaPositionX + 1, iaPositionY).value == valueMax) { bool change = false; float coin = UnityEngine.Random.Range(0.0f, 1.0f); if (coin > 0.5f) { change = true; } if (change) { valueMax = ia.getEtatFromPos(iaPositionX + 1, iaPositionY).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX + 1, iaPositionY); } } else { valueMax = ia.getEtatFromPos(iaPositionX + 1, iaPositionY).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX + 1, iaPositionY); } } break; case codeAction.GAUCHE: if (ia.getEtatFromPos(iaPositionX - 1, iaPositionY).value >= valueMax) { if (ia.getEtatFromPos(iaPositionX - 1, iaPositionY).value == valueMax) { bool change = false; float coin = UnityEngine.Random.Range(0.0f, 1.0f); if (coin > 0.5f) { change = true; } if (change) { valueMax = ia.getEtatFromPos(iaPositionX - 1, iaPositionY).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX - 1, iaPositionY); } } else { valueMax = ia.getEtatFromPos(iaPositionX - 1, iaPositionY).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX - 1, iaPositionY); } } break; case codeAction.HAUT: if (ia.getEtatFromPos(iaPositionX, iaPositionY + 1).value >= valueMax) { if (ia.getEtatFromPos(iaPositionX, iaPositionY + 1).value == valueMax) { bool change = false; float coin = UnityEngine.Random.Range(0.0f, 1.0f); if (coin > 0.5f) { change = true; } if (change) { valueMax = ia.getEtatFromPos(iaPositionX, iaPositionY + 1).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX, iaPositionY + 1); } } else { valueMax = ia.getEtatFromPos(iaPositionX, iaPositionY + 1).value; bestChoice = action; currentState = ia.getEtatFromPos(iaPositionX, iaPositionY + 1); } } break; } } if (bestChoice == codeAction.BAS /*&& player.position.z < 0*/) { player.Translate(0, 0, 10); _canMove = true; IADecision = -1; iaPositionY--; } if (bestChoice == codeAction.HAUT /*&& player.position.z > -40*/) { player.Translate(0, 0, -10); _canMove = true; IADecision = -1; iaPositionY++; } if (bestChoice == codeAction.DROITE /*&& player.position.x < 0*/) { player.Translate(-10, 0, 0); _canMove = true; IADecision = -1; iaPositionX++; } if (bestChoice == codeAction.GAUCHE /*&& player.position.x > -40*/) { player.Translate(10, 0, 0); _canMove = true; IADecision = -1; iaPositionX--; } if (IADecision == -1) { _canMove = true; } }