Exemple #1
0
        /*
         * private bool ChestReallyDead(FutureStateWorldModel state, GOB.Action action, string enemyName, string chestName)
         * {
         *  bool cond1 = !(bool)state.GetProperty(enemyName);
         *  bool cond1b = GameObject.Find(enemyName)
         *  bool cond2 = (bool)state.GetProperty(chestName);
         *  bool cond3 = action is PickUpChest;
         *  bool cond4 = action is PickUpChest && ((PickUpChest)action).Target.tag.Equals(chestName);
         *  /*
         *  if (cond3)
         *      cond4 = action is PickUpChest && ((PickUpChest)action).Target.tag.Equals(chestName);
         *  else
         *      cond4 = false;
         */
        //return cond1 && cond2 && cond3 && cond4;

        //return !(bool)state.GetProperty(enemyName) && (bool)state.GetProperty(chestName) && action is PickUpChest && ((PickUpChest)action).Target.tag.Equals(chestName);

        //}

        private GOB.Action ChooseBias(FutureStateWorldModel state)
        {
            GOB.Action[] actions  = state.GetExecutableActions();
            int[]        features = new int[2];

            int    size = features.Length;
            double H    = 0;

            double[] exp = new double[actions.Length];  //array com as exponenciais ja calculadas
            double[] P   = new double[actions.Length];  //array com as probabilidades ja calculadas para escolher a melhor

            for (int j = 0; j < actions.Length; j++)
            {
                float h = 0;

                if (actions[j] is SwordAttack && (int)state.GetProperty(Properties.HP) + ((SwordAttack)actions[j]).hpChange <= 0)
                {
                    //actions = actions.Where(val => val != action).ToArray();  //para a nao optimizacao
                    exp[j] = 0;
                    continue;  //do for, para passa a proxima accao
                }
                if (ChestDead(state, actions[j], "Skeleton1", "Chest1") || ChestDead(state, actions[j], "Skeleton2", "Chest4") ||
                    ChestDead(state, actions[j], "Orc1", "Chest3") || ChestDead(state, actions[j], "Orc2", "Chest2") || ChestDead(state, actions[j], "Dragon", "Chest5"))
                {
                    h      = 91;
                    exp[j] = Mathf.Exp(h);
                    H     += Mathf.Exp(h);
                    continue;  //do for, para passa a proxima accao
                }



                else
                {
                    FutureStateWorldModel possibleState = (FutureStateWorldModel)state.GenerateChildWorldModel();
                    actions[j].ApplyActionEffects(possibleState);
                    possibleState.CalculateNextPlayer();

                    features[WMoney] = (int)possibleState.GetProperty(Properties.MONEY);
                    //features[WTime] = (int) (float) possibleState.GetProperty(Properties.TIME);
                    features[WXP] = (int)possibleState.GetProperty(Properties.XP);
                    //features[WLevel] = (int)possibleState.GetProperty(Properties.LEVEL);

                    for (int i = 0; i < size; i++)
                    {
                        h += features[i] * weights[i]; //cada peso para uma accao
                    }
                    exp[j] = Mathf.Exp(h);             //queremos guardar logo a exponencial para nao ter de calcular outra vez
                    H     += Mathf.Exp(h);
                }
            }

            if (H == 0)
            {
                return(actions[0]);
            }
            else
            {
                P[0] = exp[0] / H;      //o primeiro nao acumula
                for (int j = 1; j < actions.Length; j++)
                {
                    P[j] = P[j - 1] + exp[j] / H;   //para ser cumulativo
                }
                double rand = RandomGenerator.NextDouble();

                //prob maior mais pequena que o random
                return(actions[Array.FindIndex(P, val => val >= rand)]);
            }
        }