/* * 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)]); } }