public virtual bool EsAplicable(EstadoStrips e) { foreach (var precon in _pc) { if (!e._actual.Contains(precon)) { return(false); } } return(true); }
public List <PropertyStrips> Pendientes(EstadoStrips estadoMeta) { var r = new List <PropertyStrips>(); foreach (var p in estadoMeta._actual) { if (!_actual.Contains(p)) { r.Add(p); } } return(r); }
/// <summary> /// Algoritmo de strips /// </summary> public ResultStrips StripsHeuristica(ResultStrips init, EstadoStrips estadoMeta) { contador_operaciones++; while (init.Estado.Pendientes(estadoMeta).Count > 0) { var meta = ElegirMeta(init.Estado.Pendientes(estadoMeta)); var operadoresCandidatos = Operators.Instance(_allOperators).Produce(meta, new List <OperatorStrips>(_allOperators)); while (operadoresCandidatos.Any()) { var operador = ElegirOperador(new List <OperatorStrips>(operadoresCandidatos)); var newResult = StripsHeuristica(new ResultStrips { Estado = init.Estado, Plan = init.Plan }, new EstadoStrips(operador._pc)); if (newResult.Valido) { if (!init.Plan.Contains(operador)) { init.Estado = operador.Aplicar(init.Estado); init.Plan.Add(operador); } else { init.Estado = operador.Aplicar(init.Estado); } break; } } if (!operadoresCandidatos.Any()) { init.Valido = false; return(init); } } if (init.Estado.Pendientes(estadoMeta).Count == 0) { init.Valido = true; } else { init.Valido = false; } return(init); }
public virtual EstadoStrips Aplicar(EstadoStrips e) { var result = new EstadoStrips(); foreach (var key in e._actual) { result._actual.Add(key); } foreach (var r in _e) { result._actual.Remove(r); } foreach (var a in _a) { if (!result._actual.Contains(a)) { result._actual.Add(a); } } return(result); }
public bool EsMeta(EstadoStrips estadoMeta) { return(Pendientes(estadoMeta).Count == 0); }
public CellInfo GetNextAction() { if (_allOperators.Count == 0) { var l = _character.BoardManager.boardInfo.ItemsOnBoard; foreach (PlaceableItem p in l) { var lPC = new List <PropertyStrips>(); foreach (var pc in p.Preconditions) { lPC.Add(new PropertyStrips(pc.Tag)); } var target = _character.BoardManager.boardInfo.CellWithItem(p.Tag); _allOperators.Add(new OperatorStrips(lPC, target, p.Tag)); } Debug.Log("Final"); } if (_currentPlan.Count == 0) { //Obtenemos el estado final _estadoFinal = _allOperators.Where(x => x._a[0]._tag == "Goal").First(); //Ordenamos el array en funcion de los objetivos _estadoFinal._pc.OrderBy(m => (_allOperators.Where(x => x._a[0]._tag == m._tag).First()._pc.Count) ); //Generamos el estado Meta var estadoMeta = new EstadoStrips(_estadoFinal._pc); //Iniciacion del documento var init = new ResultStrips { Estado = new EstadoStrips(), Plan = new List <OperatorStrips>(), Valido = true }; /////////////////////////////////////////////////////////// ///////////////////ALGORITMO DE STRIPS///////////////////// /////////////////////////////////////////////////////////// //Obtenemos el resultado var result = StripsHeuristica(init, estadoMeta); //Lo metemos en el currentPlan _currentPlan = result.Plan; //Añadimos el estado final _currentPlan.Add(_estadoFinal); /////////////////////////////////////////////////////////// //ESTE ES EL OTRO ALGORITMO DE PLANIFICACION DE OBJETIVOS// /////////////////////////////////////////////////////////// // ListaDeEstados(_estadoFinal); //Descomentar para utilizar esta opcion //Estadisticas Debug.Log("Numero de operaciones " + contador_operaciones + " || PC Goal: " + _estadoFinal._pc.Count); } var nextOperation = _currentPlan[0]; _currentPlan.RemoveAt(0); return(nextOperation.GetCellInfo()); }