//Assume he will pick the flint and rocks public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.RemoveFromWorld(this.Target, 1); worldModel.AddToPossessedItems("rocks", 3); worldModel.AddToPossessedItems("flint", 2); }
protected float Playout(WorldModelDST initialPlayoutState) { List <ActionDST> actions; WorldModelDST clone = initialPlayoutState.GenerateChildWorldModel(); CurrentDepth = 0; //int parentID = 0; // ? int size = 0, random = 0; while (CurrentDepth < MaxPlayoutDepthReached) { actions = clone.GetExecutableActions(); foreach (var a in actions) { //Console.WriteLine(a); } size = actions.Count; //Console.WriteLine("size:" + size); random = this.RandomGenerator.Next(0, size - 1); actions[random].ApplyActionEffects(clone); //Had clone.getNextPlayer here in proj algorithm CurrentDepth++; } //return score return(initialPlayoutState.Score()); }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.IncreaseHunger(2); worldModel.Walter.Position = worldModel.GetNextPosition(this.Target, "fire"); }
public MCTSAlgorithm(WorldModelDST currentState) { this.InProgress = false; this.CurrentState = currentState; this.MaxIterations = 100; this.RandomGenerator = new System.Random(); }
protected float Playouts(WorldModelDST initialPlayoutState) { //Console.WriteLine("Playouts..."); List <float> rewards = new List <float>(this.MaxPlayouts); float total = 0; for (int CurrentPlayout = 0; CurrentPlayout < MaxPlayouts; CurrentPlayout++) { //Console.WriteLine("Playout n." + CurrentPlayout.ToString()); float reward = Playout(initialPlayoutState); rewards.Add(reward); //Console.WriteLine("Reward: " + reward); total += reward; } float ratio = total / MaxPlayouts; /* OLD * if (ratio > 0.70f) * return 1f; * else if ( ratio == 0) * return 0f; * else * return ratio * 0.4f; */ //Console.WriteLine("ratio: " + ratio); //Console.WriteLine("init score: " + initialPlayoutState.Score(initialPlayoutState)); return(ratio); }
//Fazer Decompose public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.RemoveFromEquipped(this.Target); worldModel.RemoveAction("Unequip_" + this.Target); }
//Assume he will pick the logs public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.RemoveFromWorld(this.Target, 1); worldModel.AddToWorld("log", 2, worldModel.Walter.GetPosX(), worldModel.Walter.GetPosZ()); worldModel.AvailableActions.Add(new Pickup("log", 1)); }
protected float Playout(WorldModelDST initialPlayoutState) { //TO DO return(0.0f); }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; if (Recipes.ContainsKey(this.Recipe)) { foreach (var item in Recipes[this.Recipe]) { worldModel.RemoveFromPossessedItems(item.Key, item.Value); } if (this.X != "-" && this.Z != "-") { worldModel.AddToWorld(this.Recipe, 1, Convert.ToInt32(this.X), Convert.ToInt32(this.Z)); } else { if (!worldModel.IsEquipped("torch") && !worldModel.IsEquipped("pickaxe") && !worldModel.IsEquipped("axe")) { worldModel.AddToEquipped(this.Recipe); } worldModel.AddToPossessedItems(this.Recipe, 1); } // if (!worldModel.Possesses(this.Recipe)) // { // worldModel.RemoveAction("Build_" + this.Recipe); // } } }
//Fazer Decompose public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; if (worldModel.Cycle > Convert.ToSingle(15 - (worldModel.CycleInfo[2] + worldModel.CycleInfo[1])) && worldModel.Possesses("torch")) { ActionDST action = new Equip("torch"); worldModel.AddAction(action); } if (this.Target == "berries") { worldModel.RemoveFromPossessedItems("berries", 1); worldModel.DecreaseHunger(9); if (!worldModel.Possesses("berries")) { worldModel.RemoveAction("Eat_berries"); } } else if (this.Target == "carrot") { worldModel.RemoveFromPossessedItems("carrot", 1); worldModel.DecreaseHunger(13); worldModel.IncreaseHP(1); if (!worldModel.Possesses("carrot")) { worldModel.RemoveAction("Eat_carrot"); } } }
protected float PlayoutHeuristic(WorldModelDST state) { int hp = state.Walter.HP; float cHP = Convert.ToSingle(hp); //Console.WriteLine(hp); //Console.WriteLine(cHP); int hunger = state.Walter.Hunger; float cHunger = Convert.ToSingle(hunger); //Console.WriteLine("Is it Night?"); //Console.WriteLine(Convert.ToSingle(13 - state.CycleInfo[2]) <= (state.Cycle)); //Console.WriteLine(""); if (cHP <= 0) { return(0.0f); } else if (Convert.ToSingle(15 - state.CycleInfo[2]) <= (state.Cycle)) { //Console.WriteLine("light"); //Console.WriteLine(state.LightValueNight()); //Console.WriteLine(state.FoodValue()); //Console.WriteLine(""); return((state.LightValueNight()) * 0.9f + state.FoodValue() * 0.1f); } else { //float reward = ((cHP/150) + (cHunger/150)*4 + (state.LogsValue())*2 + (state.RocksValue())*2 + (state.TorchValueDay())*10 + (state.AxePickaxeValue())*6 + (state.FoodValue())*7)/32; float reward = (state.LightValueDay()) * 0.7f + (state.FoodValue()) * 0.3f; return(reward); } }
public MCTSNode(WorldModelDST state) { State = state; ChildNodes = new List <MCTSNode>(); N = 0; Q = 0.0f; }
//Fazer Decompose public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.AddToEquipped(this.InvObject); worldModel.RemoveFromPossessedItems(this.InvObject, 1); worldModel.RemoveAction("Equip_" + this.InvObject); }
//Fazer Decompose public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.RemoveFromPossessedItems(this.InvObject, 1); if (!worldModel.Possesses(this.InvObject)) { worldModel.RemoveAction("Drop_" + this.InvObject); } worldModel.AddToWorld(this.InvObject, this.Quantity, this.Position.Item1, this.Position.Item2); }
//Fazer Decompose public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.AddToPossessedItems(this.Target, this.Quantity); worldModel.RemoveFromWorld(this.Target, this.Quantity); if (!worldModel.WorldHas(this.Target)) { worldModel.RemoveAction("Pickup_" + this.Target); } }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; if (this.Target == "torch") { worldModel.RemoveFromEquipped("torch"); worldModel.AddToPossessedItems("torch", 1); ActionDST action = new Equip("torch"); worldModel.AddAction(action); } }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; if (FoodConverter.ContainsKey(this.InvObject)) { worldModel.RemoveFromPossessedItems(this.InvObject, 1); worldModel.AddToPossessedItems(FoodConverter[this.InvObject], 1); if (!worldModel.Possesses(this.InvObject)) { worldModel.RemoveAction(string.Concat("Cook_", this.InvObject)); } } }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; if (PickableConverter.ContainsKey(this.Target)) { worldModel.RemoveFromWorld(this.Target, 1); worldModel.AddToPossessedItems(PickableConverter[this.Target], 1); if (!worldModel.WorldHas(this.Target)) { worldModel.RemoveAction(string.Concat("Pick_", this.Target)); } } }
protected MCTSNode Expand(MCTSNode parent, ActionDST action) { WorldModelDST newState = parent.State.GenerateChildWorldModel(); action.ApplyActionEffects(newState); var child = new MCTSNode(newState) { Action = action, Parent = parent, }; parent.ChildNodes.Add(child); return(child); }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.IncreaseHunger(1); string usedfuel = worldModel.Fuel[0].Item1; worldModel.RemoveFromPossessedItems(usedfuel, 1); worldModel.RemoveFromFuel(usedfuel); worldModel.Walter.Position = worldModel.GetNextPosition(this.Target, "fire"); ActionDST action; if (usedfuel == "twigs") { if (!worldModel.Possesses("twigs", 2)) { worldModel.RemoveAction("Build_torch"); worldModel.RemoveAction("Build_pickaxe"); } if (!worldModel.Possesses("twigs", 1)) { worldModel.RemoveAction("Build_axe"); } } else if (usedfuel == "log") { if (!worldModel.Possesses("log", 2)) { worldModel.RemoveAction("Build_firepit"); worldModel.RemoveAction("Build_campfire"); } } else if (usedfuel == "cutgrass") { if (!worldModel.Possesses("cutgrass", 3)) { worldModel.RemoveAction("Build_campfire"); } if (!worldModel.Possesses("cutgrass", 2)) { action = new Build("torch"); worldModel.RemoveAction("Build_torch"); } } }
//Fazer Decompose public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; //<OPTIMIZATION - Dict instead of chained if's> if (FoodIndex.ContainsKey(this.Target)) { worldModel.RemoveFromPossessedItems(this.Target, 1); int[] foodValues = FoodIndex[this.Target]; int HungerVal = foodValues[0]; if (HungerVal > 0) { worldModel.DecreaseHunger(foodValues[0]); } else if (HungerVal < 0) { worldModel.IncreaseHunger(Math.Abs(foodValues[0])); } if (foodValues.Length > 1) { int HPVal = foodValues[1]; if (HPVal > 0) { worldModel.IncreaseHP(foodValues[1]); } else if (HPVal < 0) { worldModel.DecreaseHP(Math.Abs(foodValues[1])); } } if (!worldModel.Possesses(this.Target)) { worldModel.RemoveAction("Eat_" + this.Target); } } }
protected float Playout(WorldModelDST initialPlayoutState) { List <ActionDST> executableActions; ActionDST action = null; int randomIndex; WorldModelDST state = initialPlayoutState; while (this.CurrentDepth < this.MaxPlayoutDepthReached) { executableActions = state.GetExecutableActions(); if (executableActions.Count > 0) { this.CurrentDepth++; randomIndex = this.RandomGenerator.Next(0, executableActions.Count); action = executableActions[randomIndex]; state = state.GenerateChildWorldModel(); action.ApplyActionEffects(state); } else { this.CurrentDepth++; } } if (this.CurrentDepth < this.MaxPlayoutDepthReached) { this.CurrentDepth = this.MaxPlayoutDepthReached; } //Console.WriteLine("Value Heuristic:"); //Console.WriteLine(PlayoutHeuristic(state)); //Console.WriteLine(""); return(PlayoutHeuristic(state)); }
public virtual void ApplyActionEffects(WorldModelDST worldState) { }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; if (this.Target == "torch") { worldModel.RemoveFromPossessedItems("twigs", 2); worldModel.RemoveFromPossessedItems("cutgrass", 2); worldModel.AddToPossessedItems("torch", 1); if (!worldModel.Possesses("twigs", 2)) { worldModel.RemoveAction("Build_pickaxe"); } if (!worldModel.Possesses("twigs", 1)) { worldModel.RemoveAction("Build_axe"); } if (!worldModel.Possesses("twigs", 2) || !worldModel.Possesses("cutgrass", 2)) { worldModel.RemoveAction("Build_torch"); } if (worldModel.EquippedItems.Count == 0) { ActionDST action = new Unequip("torch"); worldModel.AddAction(action); } } else if (this.Target == "pickaxe") { worldModel.RemoveFromPossessedItems("twigs", 2); worldModel.RemoveFromPossessedItems("flint", 2); worldModel.AddToPossessedItems("pickaxe", 1); if (!worldModel.Possesses("twigs", 2) || !worldModel.Possesses("flint", 2)) { worldModel.RemoveAction("Build_pickaxe"); } if (!worldModel.Possesses("twigs", 1) || !worldModel.Possesses("flint", 1)) { worldModel.RemoveAction("Build_axe"); } if (!worldModel.Possesses("twigs", 2)) { worldModel.RemoveAction("Build_torch"); } } else if (this.Target == "axe") { worldModel.RemoveFromPossessedItems("twigs", 1); worldModel.RemoveFromPossessedItems("flint", 1); worldModel.AddToPossessedItems("axe", 1); if (!worldModel.Possesses("twigs", 2) || !worldModel.Possesses("flint", 2)) { worldModel.RemoveAction("Build_pickaxe"); } if (!worldModel.Possesses("twigs", 1) || !worldModel.Possesses("flint", 1)) { worldModel.RemoveAction("Build_axe"); } if (!worldModel.Possesses("twigs", 2)) { worldModel.RemoveAction("Build_torch"); } } else if (this.Target == "campfire") { worldModel.RemoveFromPossessedItems("log", 2); worldModel.RemoveFromPossessedItems("cutgrass", 3); worldModel.AddToWorld("campfire", 1, worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2); worldModel.AddToFire("campfire", worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2); if (!worldModel.Possesses("log", 2)) { worldModel.RemoveAction("Build_firepit"); } if (!worldModel.Possesses("log", 2) || !worldModel.Possesses("cutgrass", 3)) { worldModel.RemoveAction("Build_campfire"); } if (!worldModel.Possesses("cutgrass", 2)) { worldModel.RemoveAction("Build_torch"); } } else if (this.Target == "firepit") { worldModel.RemoveFromPossessedItems("log", 2); worldModel.RemoveFromPossessedItems("rocks", 12); worldModel.AddToWorld("firepit", 1, worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2); worldModel.AddToFire("firepit", worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2); if (!worldModel.Possesses("log", 2) || !worldModel.Possesses("rocks", 12)) { worldModel.RemoveAction("Build_firepit"); } if (!worldModel.Possesses("log", 2)) { worldModel.RemoveAction("Build_campfire"); } } }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.IncreaseHunger(1); }
//This is where the main body of the MCTS Search must be implemented private IEnumerable <DynamicPropertyResult> MCTSSearch(IQueryContext context, Name actionVar, Name targetVar) { //How to clone the KB with our JSON serializer var jsonSerializer = new JSONSerializer(); var memStream = new MemoryStream(); var json = jsonSerializer.SerializeToJson(this.m_kb); var kbCloned = jsonSerializer.DeserializeFromJson <KB>(json); //Escrever comentário if (this.NextActionInfo.Item1 != "") { NextAction PriorityAction = new NextAction(NextActionInfo.Item1, kbCloned); if (this.NextActionInfo.Item2 <= 1) { this.NextActionInfo = new Pair <string, int>("", 0); } else { this.NextActionInfo.Item2 -= 1; } Pair <string, string> pairOfPriorityAction = PriorityAction.ConstructNextAction(); this.ToDoActionsList.Add(pairOfPriorityAction); } if (this.ToDoActionsList.Count == 0) { PreWorldState preWorldState = new PreWorldState(kbCloned); //, this.UnequippableTorches, this.EquippedItems); WorldModelDST worldModel = new WorldModelDST(preWorldState); foreach (var action in worldModel.AvailableActions) { Console.WriteLine(action.Name); } Console.WriteLine(""); this.Mcts = new MCTSAlgorithm(worldModel); this.Mcts.InitializeMCTSearch(); ActionDST MacroAction = this.Mcts.Run(); //this.LastActionInfo = MacroAction.Name; this.ToDoActionsList = MacroAction.Decompose(preWorldState); this.NextActionInfo = MacroAction.NextActionInfo(); this.NextActionInfo.Item1 = preWorldState.CompleteNextActionInfo(this.NextActionInfo.Item1); } Pair <string, string> CurrentAction = this.ToDoActionsList[0]; this.ToDoActionsList.Remove(CurrentAction); Console.WriteLine("Next Action:"); Console.WriteLine(CurrentAction.Item1 + " " + CurrentAction.Item2); Console.WriteLine(""); //UpdateEquippedItems(CurrentAction); var actionSub = new Substitution(actionVar, new ComplexValue(Name.BuildName(CurrentAction.Item1))); var targetSub = new Substitution(targetVar, new ComplexValue(Name.BuildName(CurrentAction.Item2))); //var actionSub = new Substitution(actionVar, new ComplexValue(Name.BuildName("Action(WALKTO, -, "+ posxWalter.ToString() +", " + poszWalter.ToString() + ", -)"))); //var targetSub = new Substitution(targetVar, new ComplexValue(Name.BuildName("-"))); foreach (var subSet in context.Constraints) { subSet.AddSubstitution(actionSub); subSet.AddSubstitution(targetSub); yield return(new DynamicPropertyResult(new ComplexValue(Name.BuildName(true), 1.0f), subSet)); } }
public override void ApplyActionEffects(WorldModelDST worldModel) { worldModel.Cycle += this.Duration; worldModel.IncreaseHunger(1); worldModel.Walter.Position = worldModel.GetNextPosition(this.Target, "world"); if (this.Target == "tree") { worldModel.RemoveFromWorld("tree", 1); worldModel.AddToPossessedItems("log", 1); worldModel.AddToFuel("log", 1); ActionDST action; if (worldModel.Possesses("rocks", 12)) { action = new Build("firepit"); worldModel.AddAction(action); } if (worldModel.Possesses("cutgrass", 3)) { action = new Build("campfire"); worldModel.AddAction(action); } } else if (this.Target == "boulder") { worldModel.RemoveFromWorld("boulder", 1); worldModel.AddToPossessedItems("rocks", 2); worldModel.AddToPossessedItems("flint", 1); ActionDST action; if (worldModel.Possesses("log", 2) && worldModel.Possesses("rocks", 12)) { action = new Build("firepit"); worldModel.AddAction(action); } if (worldModel.Possesses("twigs", 1)) { action = new Build("axe"); worldModel.AddAction(action); } if (worldModel.Possesses("twigs", 2) && worldModel.Possesses("flint", 2)) { action = new Build("pickaxe"); worldModel.AddAction(action); } } else if (this.Target == "log") { worldModel.RemoveFromWorld("log", 1); worldModel.AddToPossessedItems("log", 1); worldModel.AddToFuel("log", 1); ActionDST action; if (worldModel.Possesses("log", 2) && worldModel.Possesses("cutgrass", 2)) { action = new Build("campfire"); worldModel.AddAction(action); } if (worldModel.Possesses("log", 2) && worldModel.Possesses("rocks", 12)) { action = new Build("firepit"); worldModel.AddAction(action); } } else if (this.Target == "twigs") { worldModel.RemoveFromWorld("twigs", 1); worldModel.AddToPossessedItems("twigs", 1); worldModel.AddToFuel("twigs", 1); ActionDST action; if (worldModel.Possesses("flint", 1)) { action = new Build("axe"); worldModel.AddAction(action); } if (worldModel.Possesses("flint", 2) && worldModel.Possesses("twigs", 2)) { action = new Build("pickaxe"); worldModel.AddAction(action); } } else if (this.Target == "sapling") { worldModel.RemoveFromWorld("sapling", 1); worldModel.AddToPossessedItems("twigs", 1); worldModel.AddToFuel("twigs", 1); ActionDST action; if (worldModel.Possesses("flint", 1)) { action = new Build("axe"); worldModel.AddAction(action); } if (worldModel.Possesses("flint", 2) && worldModel.Possesses("twigs", 2)) { action = new Build("pickaxe"); worldModel.AddAction(action); } } else if (this.Target == "flint") { worldModel.RemoveFromWorld("flint", 1); worldModel.AddToPossessedItems("flint", 1); ActionDST action; if (worldModel.Possesses("twigs", 1)) { action = new Build("axe"); worldModel.AddAction(action); } if (worldModel.Possesses("twigs", 2) && worldModel.Possesses("flint", 2)) { action = new Build("pickaxe"); worldModel.AddAction(action); } } else if (this.Target == "cutgrass") { worldModel.RemoveFromWorld("cutgrass", 1); worldModel.AddToPossessedItems("cutgrass", 1); worldModel.AddToFuel("cutgrass", 1); ActionDST action; if (worldModel.Possesses("cutgrass", 3) && worldModel.Possesses("log", 2)) { action = new Build("campfire"); worldModel.AddAction(action); } if (worldModel.Possesses("cutgrass", 2) && worldModel.Possesses("twigs", 2)) { action = new Build("torch"); worldModel.AddAction(action); } } else if (this.Target == "grass") { worldModel.RemoveFromWorld("grass", 1); worldModel.AddToPossessedItems("cutgrass", 1); worldModel.AddToFuel("cutgrass", 1); ActionDST action; if (worldModel.Possesses("cutgrass", 3) && worldModel.Possesses("log", 2)) { action = new Build("campfire"); worldModel.AddAction(action); } if (worldModel.Possesses("cutgrass", 2) && worldModel.Possesses("twigs", 2)) { action = new Build("torch"); worldModel.AddAction(action); } } else if (this.Target == "rocks") { worldModel.RemoveFromWorld("rocks", 1); worldModel.AddToPossessedItems("rocks", 1); ActionDST action; if (worldModel.Possesses("log", 2) && worldModel.Possesses("rocks", 12)) { action = new Build("firepit"); worldModel.AddAction(action); } } else if (this.Target == "berrybush") { worldModel.RemoveFromWorld("berrybush", 1); worldModel.AddToPossessedItems("berries", 2); ActionDST action = new Eat("berries"); worldModel.AddAction(action); } else if (this.Target == "carrot" || this.Target == "carrot_planted") { worldModel.RemoveFromWorld("carrot", 1); worldModel.AddToPossessedItems("carrot", 1); ActionDST action = new Eat("carrot"); worldModel.AddAction(action); } else if (this.Target == "berries") { worldModel.RemoveFromWorld("berries", 1); worldModel.AddToPossessedItems("berries", 1); ActionDST action = new Eat("berries"); worldModel.AddAction(action); } }