Example #1
0
        private bool DeduceFollowingStates(
            IEnumerable<HTNTaskSet> refinedHTNTaskSetList,
            HTNState currentState,
            HTNState targetState,
            SpecificationKnowledge specificationKnowledge)
        {
            List<HTNState> newlyDeducedHTNStateList = new List<HTNState>();
            newlyDeducedHTNStateList.Add(currentState);

            HTNState localCurrentHTNState = new HTNState(currentState);
            List<List<HTNEffect>> htnEffectList = new List<List<HTNEffect>>();

            foreach (HTNTaskSet htnTaskSet in refinedHTNTaskSetList)
            {
                List<HTNEffect> postEffects = new List<HTNEffect>();

                foreach (string taskID in htnTaskSet.TaskIDList)
                {
                    HTNTask htnTask = specificationKnowledge.GetHTNTask(taskID);
                    postEffects.AddRange(htnTask.PostConditions);
                }
                htnEffectList.Add(postEffects);
            }

            HTNState nextHTNState = null;
            foreach (List<HTNEffect> htnEffects in htnEffectList)
            {
                nextHTNState = new HTNState(localCurrentHTNState.DeduceNextStateBasedOnEffects(htnEffects));
                newlyDeducedHTNStateList.Add(nextHTNState);
            }

            if (nextHTNState != null && nextHTNState.IsEqualTo(targetState))
            {
                newlyDeducedHTNStateList.Remove(nextHTNState);
                RefinedStateList = newlyDeducedHTNStateList;
                return true;
            }

            return false;
        }
Example #2
0
        public override List<HTNTaskSet> GeneratePlan()
        {
            //  Select a task network for the workitem
            HTNMethod htnMethod = SelectAMethodForThisWorkitem(WorkitemID, InitialState);
            if (htnMethod == null) {
                Console.WriteLine("Method undefined. Unable to generate a plan.");
                return null;
            }

            string taskNetworkID = htnMethod.TaskNetworkID;

            HTNTaskNetwork htnTaskNetwork = SpecificationKnowledge.GetTaskNetwork(taskNetworkID);
            HTNTaskNetworkConstraints constraint = htnTaskNetwork.Constraints[FirstConstraint];

            TaskSets = constraint.HTNTaskConstraints;
            for (int i = 1; i < constraint.StateConstraints.Count - 1; i++)
            {
                StateConstraints.Insert(i, constraint.StateConstraints[i]);
            }

            // Perform Decomposition
            bool allPrimitive = false;
            bool allScheduled = false;

            while (!allPrimitive && !allScheduled)
            {
                // extend the current task network, assign some tasks to resources, generate more states
                List<HTNTaskSet> newHTNTaskSetList = new List<HTNTaskSet>();

                for (int i = 0; i < TaskSets.Count; i++)
                {
                    HTNTaskSet htnTaskSet = TaskSets[i];
                    List<HTNTaskSet> newHTNSetFragment = htnTaskSet.
                        AssignAndRefineTaskSet(
                            ResourceProfileSet,
                            StateConstraints[i],
                            StateConstraints[i + 1],
                            SpecificationKnowledge
                            );

                    foreach (HTNTaskSet newHTNTaskSet in newHTNSetFragment)
                    {
                        newHTNTaskSetList.Add(newHTNTaskSet);
                    }
                }
                TaskSets = newHTNTaskSetList;

                List<HTNState> newHTNStateList = new List<HTNState>();
                newHTNStateList.Add(InitialState);
                newHTNStateList.Add(TargetState);
                HTNState localHTNState = new HTNState(InitialState);

                for (int i = 0; i < TaskSets.Count - 1; i++)
                {
                    HTNState deducedState = localHTNState.DeduceNextStateBasedOnEffects(
                        TaskSets[i].GetAllPostEffects(SpecificationKnowledge));
                    localHTNState = new HTNState(deducedState);
                    newHTNStateList.Insert(i + 1, deducedState);
                }

                StateConstraints = newHTNStateList;

                // Attempt to decompose
                List<HTNTaskSet> newlyDecomposedHTNTaskSetList = new List<HTNTaskSet>();

                for (int i = 0; i < TaskSets.Count; i++)
                {
                    HTNTaskSet htnTaskSet = TaskSets[i];

                    List<HTNTaskSet> partialDecomposedHTNTaskSetList
                        =
                        htnTaskSet.DecomposeTaskSet(
                            ResourceProfileSet,
                            SpecificationKnowledge,
                            this,
                            StateConstraints[i],
                            StateConstraints[i + 1]
                        );

                    foreach (HTNTaskSet taskSet in partialDecomposedHTNTaskSetList)
                    {
                        newlyDecomposedHTNTaskSetList.Add(taskSet);
                    }
                }

                allScheduled = true;

                TaskSets = newlyDecomposedHTNTaskSetList;

                // TODO: Hope this doesn't break. Dammit..
                allPrimitive = AreAllTasksPrimitive(TaskSets);

                //foreach (HTNTaskSet htnTaskSet in TaskSets)
                //{
                //    foreach (string taskID in htnTaskSet.TaskIDList)
                //    {
                //        if (!SpecificationKnowledge.IsTaskAPrimitive(taskID))
                //        {
                //            allPrimitive = false;
                //        }
                //    }

                //    if (!allPrimitive)
                //    {
                //        break;
                //    }
                //}

                if (!allPrimitive && allScheduled)
                {
                    newHTNStateList.Clear();
                    newHTNStateList.Add(InitialState);
                    newHTNStateList.Add(TargetState);
                    localHTNState = new HTNState(InitialState);

                    for (int i = 0; i < TaskSets.Count - 1; i++)
                    {
                        HTNState deduced_state = localHTNState.DeduceNextStateBasedOnEffects(TaskSets[i].GetAllPostEffects(SpecificationKnowledge));
                        localHTNState = new HTNState(deduced_state);
                        newHTNStateList.Insert(i + 1, deduced_state);
                    }

                    this.StateConstraints = newHTNStateList;
                    allPrimitive = false;
                }

                allScheduled = true;

                foreach (HTNTaskSet htnTaskSet in TaskSets)
                {
                    if (!htnTaskSet.IsScheduled())
                    {
                        allScheduled = false;
                    }
                }
            }

            int stateSize = StateConstraints.Count;
            for (int i = 0; i < StateConstraints.Count; i++)
            {
                HTNState htnState = new HTNState(StateConstraints[i]);

                foreach (KeyValuePair<string, string> kvp1 in htnState.States)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write("state_name:   " + kvp1.Key);
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("         state_value:  " + kvp1.Value);
                }

                if (i < stateSize - 1)
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;

                    HTNTaskSet htnTaskSet = new HTNTaskSet(TaskSets[i]);

                    foreach (KeyValuePair<string, string> kvp2 in htnTaskSet.TaskExecutors)
                    {
                        Console.WriteLine("task_id:  " + kvp2.Key + "       " + "executor:  " + kvp2.Value);
                    }
                }
            }

            return TaskSets;
        }