コード例 #1
0
 /// <summary>
 /// Generates all possible SAS+ relative states meeting conditions specified by the given conditions. Lazy generated via yield return.
 /// </summary>
 /// <param name="conditions">Reference conditions.</param>
 /// <param name="variables">Variables of the planning problem.</param>
 /// <returns>All possible SAS+ relative states meeting the conditions.</returns>
 public static IEnumerable <IRelativeState> EnumerateRelativeStates(IConditions conditions, Variables variables)
 {
     foreach (var simpleCondition in conditions.GetSimpleConditions())
     {
         yield return(GetCorrespondingRelativeState(simpleCondition, variables));
     }
 }
コード例 #2
0
 /// <summary>
 /// Gets a collection of all relevant predecessors (backwards transitions) from the specified conditions. Lazy generated via yield return.
 /// </summary>
 /// <param name="treeRoot">Root of the operator decision tree to be traversed.</param>
 /// <param name="conditions">Original conditions.</param>
 /// <returns>Lazy generated collection of relevant predecessors.</returns>
 public IEnumerable <IPredecessor> GetPredecessors(IOperatorDecisionTreeNode treeRoot, IConditions conditions)
 {
     foreach (var simpleConditions in conditions.GetSimpleConditions())
     {
         foreach (var predecessor in treeRoot.Accept(this, conditions, simpleConditions))
         {
             yield return(predecessor);
         }
     }
 }
コード例 #3
0
 /// <summary>
 /// Generates all possible SAS+ states meeting conditions specified by the given conditions. Lazy generated via yield return.
 /// </summary>
 /// <param name="conditions">Reference conditions.</param>
 /// <param name="variables">Variables of the planning problem.</param>
 /// <returns>All possible SAS+ states meeting the conditions.</returns>
 public static IEnumerable <IState> EnumerateStates(IConditions conditions, Variables variables)
 {
     foreach (var simpleCondition in conditions.GetSimpleConditions())
     {
         foreach (var state in EnumerateStates(simpleCondition, variables))
         {
             yield return(state);
         }
     }
 }
コード例 #4
0
        /// <summary>
        /// Computes the distances to the goals for the specified pattern.
        /// </summary>
        /// <param name="pattern">Pattern (i.e. variables of the pattern) to process.</param>
        private PatternValuesDistances ComputePatternDistances(int[] pattern)
        {
            IHeap <double, ISimpleConditions> fringe = new LeftistHeap <ISimpleConditions>();

            InsertPatternConditions(fringe, (Conditions)Problem.GoalConditions, 0, pattern);

            PatternValuesDistances patternValuesDistances = new PatternValuesDistances();

            while (fringe.GetSize() > 0)
            {
                double            distance   = fringe.GetMinKey();
                ISimpleConditions conditions = fringe.RemoveMin();

                int[] patternValues = conditions.GetAssignedValues();

                Debug.Assert(pattern.Length == conditions.GetSize());
                Debug.Assert(pattern.Length == patternValues.Length);

                if (patternValuesDistances.ContainsKey(patternValues))
                {
                    // already processed with a lower cost
                    continue;
                }

                patternValuesDistances.Add(patternValues, distance);

                foreach (var predecessor in Problem.GetPredecessors(conditions))
                {
                    IConditions predecessorConditions = (IConditions)predecessor.GetPredecessorConditions();
                    IOperator   predecessorOperator   = (IOperator)predecessor.GetAppliedOperator();

                    foreach (var predecessorSimpleConditions in predecessorConditions.GetSimpleConditions())
                    {
                        double cost = distance + predecessorOperator.GetCost();
                        InsertPatternConditions(fringe, predecessorSimpleConditions, cost, pattern);
                    }
                }
            }

            return(patternValuesDistances);
        }