void guardaTransicao() { Estado e = (Estado)MarkovTemplate.stateList[qualJanelaActiva]; Estado.Transicao transicao = new Estado.Transicao(); System.Array listaEstados = System.Enum.GetValues(typeof(MarkovTemplate.Sensor)); ArrayList transitionCondition = new ArrayList(); for (int i = 0; i < listaEstados.Length; i++) { if ((bool)condicoes[i]) { transitionCondition.Add(listaEstados.GetValue(i)); } } transicao.destino = targetId; transicao.condicao = transitionCondition; e.transicoes.Add(transicao); }
//------------------------------------------------------------------------- public static void deleteState(int id) { Estado estadoToDelete = getState(id); //Decrementa os destinos //(que tenham valor acima do no a remover) foreach (Estado estadoLista in stateList) { ArrayList bucket = new ArrayList(); for (int i = 0; i < estadoLista.transicoes.Count; i++) { Estado.Transicao transicao = (Estado.Transicao)estadoLista.transicoes[i]; //1- Marca Transicoes onde este e o destino if (transicao.destino == id) { bucket.Add(i); } //Decrementa as que sao maiores if (transicao.destino > id) { transicao.destino--; } } for (int i = bucket.Count - 1; i >= 0; i--) { int idxB = (int)bucket[i]; Debug.Log(idxB); estadoLista.transicoes.RemoveAt(idxB); } if (estadoLista.id > id) { estadoLista.id--; } bucket.Clear(); }//for if (estadoToDelete != null) { stateList.Remove(estadoToDelete); } }
//------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------- public MarkovGajo(BehaviorAI parent) { this.parent = parent; foreach (Estado template in MarkovTemplate.stateList) { Estado s1 = new Estado(); s1.id = template.id; s1.tipo = template.tipo; s1.titulo = template.titulo; ArrayList transicoes = new ArrayList(); foreach (Estado.Transicao trTemplate in template.transicoes) { Estado.Transicao t = new Estado.Transicao(); t.destino = trTemplate.destino; t.condicao = trTemplate.condicao; t.probabilidade = trTemplate.probabilidade; transicoes.Add(t); } s1.transicoes = transicoes; stateList.Add(s1); } }
void dialogEdicao() { Estado estado = MarkovTemplate.getState(qualJanelaActiva); if (estado != null) { if (estado.transicoes.Count == 0) { janela.height = 100; } else { janela.height = 500; } } verticalSpace(); EditorGUILayout.LabelField("State: " + qualJanelaActiva, EditorStyles.boldLabel); ((Estado)MarkovTemplate.getState(qualJanelaActiva)).titulo = EditorGUILayout.TextField(estado.titulo, GUILayout.Width(125));//, GUILayout.Width(75),GUILayout.ExpandWidth(true),EditorStyles.textField); verticalSpace(); //Visualiza Check Boxes das Transicoes if (estado != null) { scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(190), GUILayout.Height(300)); //Para todas as transicoes deste estado for (int t = estado.transicoes.Count - 1; t >= 0; t--) { bool aux = false; Estado.Transicao transicao = (Estado.Transicao)estado.transicoes[t]; aux = condicoes[t]; condicoes[t] = EditorGUILayout.BeginToggleGroup("Transition to: " + transicao.destino, condicoes[t]); if (aux != condicoes[t]) { if (!condicoes[t]) { estado.transicoes.RemoveAt(t); condicoes[t] = true; } } //Condicoes foreach (MarkovTemplate.Sensor sTemplate in listaEstados) { aux = false; int idx = -1; for (int s = 0; s < transicao.condicao.Count; s++) { MarkovTemplate.Sensor sr = (MarkovTemplate.Sensor)transicao.condicao[s]; if (sr == (MarkovTemplate.Sensor)sTemplate) { aux = true; idx = s; } } myBool = EditorGUILayout.Toggle("Sensor: " + sTemplate, aux); if (aux != myBool) { if (myBool) { transicao.condicao.Add(sTemplate); } else { transicao.condicao.RemoveAt(idx); } } } EditorGUILayout.EndToggleGroup(); } EditorGUILayout.EndScrollView(); //EditorGUILayout.EndVertical(); } }
//------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------- //Chamado em: BehaviorAI public int processMarkovChoice() { //get State Estado estado = null; foreach (Estado template in MarkovTemplate.stateList) { if (template.id == currentState) { estado = template; } } if (estado != null) { //Enche bucket com potenciais transicoes ArrayList bucketTransicoes = new ArrayList(); foreach (Estado.Transicao transicao in estado.transicoes) { //#if debugBehaviors //string aux = ""; //#endif //valida a condicao bool condicaoSatisfeita = true; foreach (MarkovTemplate.Sensor s in transicao.condicao) { switch (s) { case MarkovTemplate.Sensor.conhecido: if (!parent.bConhecido) { condicaoSatisfeita = false; } break; case MarkovTemplate.Sensor.desconhecido: if (!parent.bDesconhecido) { condicaoSatisfeita = false; } break; case MarkovTemplate.Sensor.ht: if (!parent.bHeat) { condicaoSatisfeita = false; } break; case MarkovTemplate.Sensor.hu: if (!parent.bFome) { condicaoSatisfeita = false; } break; case MarkovTemplate.Sensor.interact: if (!parent.bInteract) { condicaoSatisfeita = false; } break; case MarkovTemplate.Sensor.n_interact: if (!parent.bNInteract) { condicaoSatisfeita = false; } break; case MarkovTemplate.Sensor.longe: if (Global.hasProdutores) { if (parent.bPertoMate) { if (parent.bPertoPrey) //Perto mate e perto prey { if (parent.bPertoProdutor) //Perto mate e Perto de Prey e perto Produtor { condicaoSatisfeita = false; } else //Perto de Mate e perto Prey mas nao perto de produtor { if (parent.bFome) { condicaoSatisfeita = false; } } } else if (parent.bPertoProdutor) //Perto mate mas Nao Perto de Prey e perto Produtor { } else //Perto de Mate mas Nao perto Prey e nao perto de produtor { if (parent.bHeat) { condicaoSatisfeita = false; } } } else //NOT PERTO MATE if (parent.bPertoPrey) //Perto Prey mas Nao perto de Mate { if (parent.bPertoProdutor) //Nao Perto mate e Perto de Prey e perto Produtor { if (parent.bFome) { condicaoSatisfeita = false; } } else //Nao Perto de Mate e Perto Prey e nao perto de produtor { if (parent.bFome) { condicaoSatisfeita = false; } } } else //NOT PERTO PREY if (parent.bPertoProdutor) { if (parent.bPertoProdutor) //NAo Perto mate e Nao Perto de Prey e perto Produtor { if (parent.bFome) { condicaoSatisfeita = false; } } else //Nao Perto de Mate e Nao perto Prey e Nao perto de produtor { } } } else { if (parent.bPertoMate) { if (parent.bPertoPrey) //Perto mate e perto prey { condicaoSatisfeita = false; } else { if (parent.bHeat) { condicaoSatisfeita = false; } } //Perto mate mas nao perto prey } else if (parent.bPertoPrey) //Perto Prey mas Nao perto de Mate { if (parent.bFome) { condicaoSatisfeita = false; } } else { } //Nao perto mate nem perto prey } break; case MarkovTemplate.Sensor.perto: if (Global.hasProdutores) { if (parent.bPertoMate) { if (parent.bPertoPrey) //Perto mate e perto prey { if (parent.bPertoProdutor) //Perto mate e Perto de Prey e perto Produtor { } else //Perto de Mate e perto Prey mas nao perto de produtor { } } else if (parent.bPertoProdutor) //Perto mate mas Nao Perto de Prey e perto Produtor { } else //Perto de Mate mas Nao perto Prey e nao perto de produtor { if (parent.bFome) { condicaoSatisfeita = false; } } } else //NOT PERTO MATE if (parent.bPertoPrey) //Perto Prey mas Nao perto de Mate { if (parent.bPertoProdutor) //Nao Perto mate e Perto de Prey e perto Produtor { if (parent.bHeat) { condicaoSatisfeita = false; } } else //Nao Perto de Mate e Perto Prey e nao perto de produtor { if (parent.bHeat && !parent.bFome) { condicaoSatisfeita = false; } } } else //NOT PERTO PREY if (parent.bPertoProdutor) { if (parent.bPertoProdutor) //NAo Perto mate e Nao Perto de Prey e perto Produtor { if (parent.bHeat && !parent.bFome) { condicaoSatisfeita = false; } } else //Nao Perto de Mate e Nao perto Prey e Nao perto de produtor { condicaoSatisfeita = false; } } } else //NOT GLOBAL.HASPRODUTORES { if (parent.bPertoMate) { if (parent.bPertoPrey) //Perto mate e perto prey { } else { if (parent.bFome) { condicaoSatisfeita = false; } } //Perto mate mas nao perto prey } else if (parent.bPertoPrey) //Perto Prey mas Nao perto de Mate { if (parent.bHeat) { condicaoSatisfeita = false; } } else { condicaoSatisfeita = false; } //Nao perto mate nem perto prey } break; case MarkovTemplate.Sensor.emergency: if (!parent.bEmergency) { condicaoSatisfeita = false; } break; default: break; } //#if debugBehaviors //if(parent.owner.getId ()==0) //if(condicaoSatisfeita==false) // aux+="," + s.ToString() + " HasP:" + Global.hasProdutores + " F:" + parent.bFome + " H:" + parent.bHeat + " PPd:" + parent.bPertoProdutor + " PPy:" + parent.bPertoPrey + " PMt:" + parent.bPertoMate + "-"; //#endif }//fim da validacao //if (condicaoSatisfeita == false) //Debug.Log("Condicao nao satisteita" + aux); //se a condicao for valida poe no bucket if (condicaoSatisfeita) { bucketTransicoes.Add(transicao); } } //Identifica qual a que tem mais probabilidade (das q estao no bucket) float maior = 0; int indiceMaior = -1; Estado.Transicao transicaoEscolhida = null; for (int i = 0; i < bucketTransicoes.Count; i++) { transicaoEscolhida = ((Estado.Transicao)bucketTransicoes [i]); if (maior < transicaoEscolhida.probabilidade) { maior = transicaoEscolhida.probabilidade; indiceMaior = i; } else if (maior == transicaoEscolhida.probabilidade) //EQUAL----Some stochasticity para evitar quando o primeiro tem probablilidsade 1 e fica ali { if (Random.Range(0, 10) >= 5) { maior = transicaoEscolhida.probabilidade; indiceMaior = i; } } } //---------TODAY //if (indiceMaior == -1) //{ //Debug.Log(parent.showSensors()); //Debug.Log("Debug Info" + parent.bFome + " " + parent.bHeat + " " + parent.bPertoPrey + " " + parent.bPertoMate + " "); //Debug.Log("Bucket tem" + bucketTransicoes.Count); //} //-------------- if (indiceMaior != -1) { #if debugBehaviors int nextState = ((Estado.Transicao)bucketTransicoes [indiceMaior]).destino; // if (parent.owner.getId () == Global.whoIsBeingTracked) { // Debug.Log (parent.owner.preferedPosition.position + " " + "State " + currentState + " " + "Tem " + conta + "transicoes em que a maior tem " + // maior + ", que e para o estado " + nextState + " "); parent.showSensors(); } #endif previousState = currentState; currentState = ((Estado.Transicao)bucketTransicoes [indiceMaior]).destino; ((Estado.Transicao)bucketTransicoes[indiceMaior]).numTimesPerfomed++; familiaridadeComEstadoMarkov = ((Estado.Transicao)bucketTransicoes[indiceMaior]).numTimesPerfomed; } else { #if monitorStates if (parent.owner.getId() == Global.whoIsBeingTracked) { Debug.Log("--------------------------------------------------------------------" + "Transicao Escolhida = null como nao sei o que fazer o meu estado e " + currentState + " " + parent.showSensors() + "vou transicionar para Estado 0"); } #endif currentState = 0; } }