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