Beispiel #1
0
    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);
    }
Beispiel #2
0
    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;
    }
Beispiel #3
0
    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;
        }
    }