Esempio n. 1
0
        public List<HTNTaskSet> AssignAndRefineTaskSet(
            ResourceProfileSet resourceSet,
            HTNState currentHTNState,
            HTNState targetHTNState,
            SpecificationKnowledge specificationKnowledge)
        {
            List<HTNTaskSet> newRefinedHTNTaskSetList = new List<HTNTaskSet>();

            List<string> waitingTaskList = new List<string>();
            foreach (string taskID in this.TaskIDList)
            {
                waitingTaskList.Add(taskID);
            }

            while (waitingTaskList.Count > 0)
            {
                List<string> allocatedResourceIDList = new List<string>();
                List<string> allocatedTaskIDList = new List<string>();
                List<bool> resourceAllocatedIndicator = new List<bool>();

                HTNTaskSet htnTaskSet = new HTNTaskSet();

                for (int i = 0; i < resourceSet.Resources.Count; i++)
                {
                    resourceAllocatedIndicator.Add(true);
                }

                foreach (string taskID in waitingTaskList)
                {
                    for (int i = 0; i < resourceSet.Resources.Count; i++)
                    {
                        ResourceProfile ra = resourceSet.Resources[i];

                        if (resourceAllocatedIndicator[i] && ra.CanExecuteThisTask(taskID))
                        {
                            resourceAllocatedIndicator[i] = false;
                            htnTaskSet.AddTaskID(taskID);
                            htnTaskSet.TaskExecutors.Add(taskID, ra.ID);
                            allocatedTaskIDList.Add(taskID);

                            //  added to prevent the re-added value
                            break;
                        }
                    }
                }

                foreach (string taskID in allocatedTaskIDList)
                {
                    waitingTaskList.Remove(taskID);
                }

                newRefinedHTNTaskSetList.Add(htnTaskSet);
            }
            return newRefinedHTNTaskSetList;
        }
Esempio n. 2
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;
        }
Esempio n. 3
0
        /// <summary>
        /// Decomposes and schedules the transition between current state and target state.
        /// </summary>
        public List<HTNTaskSet> DecomposeTaskSet(
            ResourceProfileSet resourceProfileSet,
            SpecificationKnowledge specificationKnowledge,
            ComplexHTNPlanner htnPlanner,
            HTNState currentHTNState,
            HTNState targetHTNState)
        {
            List<List<HTNTaskSet>> allNewDecomposedTaskSetList = new List<List<HTNTaskSet>>();
            HTNState currentState = currentHTNState;
            int longestSize = 1;

            // Start to decompose
            foreach (string taskID in TaskIDList)
            {
                // If the task needs to be decomposed, decompose it
                if (!specificationKnowledge.IsTaskAPrimitive(taskID))
                {
                    HTNMethod method = htnPlanner.FindASuitableMethodOrOperator(taskID, currentState);

                    HTNTaskNetwork decomposedTaskNetwork = specificationKnowledge.GetTaskNetwork(method.TaskNetworkID);
                    int constraintsCount = decomposedTaskNetwork.Constraints.Count;

                    Random random = new Random();
                    int selectedConstraint = random.Next(0, constraintsCount);
                    HTNTaskNetworkConstraints htnTaskNetworkConstraints
                        = decomposedTaskNetwork.Constraints.ElementAt(selectedConstraint).Value;

                    List<HTNTaskSet> decomposedTaskSetList = htnTaskNetworkConstraints.HTNTaskConstraints;
                    if (decomposedTaskSetList.Count > longestSize)
                    {
                        longestSize = decomposedTaskSetList.Count;
                    }

                    string resourceID = TaskExecutors[taskID];
                    foreach (HTNTaskSet decomposedHTNTask in decomposedTaskSetList)
                    {
                        foreach (string subTaskID in decomposedHTNTask.TaskIDList)
                        {
                            decomposedHTNTask.TaskExecutors.Add(subTaskID, resourceID);
                        }
                    }

                    allNewDecomposedTaskSetList.Add(decomposedTaskSetList);
                }
                // The task is primitive so does not need to be decomposed further
                else
                {
                    List<HTNTaskSet> decomposedTaskSetList = new List<HTNTaskSet>();
                    HTNTaskSet htnTaskSet = new HTNTaskSet();

                    string resourceID = TaskExecutors[taskID];

                    htnTaskSet.TaskExecutors.Add(taskID, resourceID);
                    htnTaskSet.TaskIDList.Add(taskID);

                    decomposedTaskSetList.Add(htnTaskSet);
                    allNewDecomposedTaskSetList.Add(decomposedTaskSetList);
                }
            }
            // end of decomposing

            // Schedule all tasks into a single list of task sets

            List<HTNTaskSet> mergeredHTNSetList = new List<HTNTaskSet>();
            for (int i = 0; i < longestSize; i++)
            {
                HTNTaskSet newlyMergeredHTNTaskSet = new HTNTaskSet();

                foreach (List<HTNTaskSet> htnTaskSetList in allNewDecomposedTaskSetList)
                {
                    if (htnTaskSetList.Count > i)
                    {
                        foreach (string taskID in htnTaskSetList[i].TaskIDList)
                        {
                            string resourceID = htnTaskSetList[i].TaskExecutors[taskID];

                            newlyMergeredHTNTaskSet.TaskExecutors.Add(taskID, resourceID);
                            newlyMergeredHTNTaskSet.AddTaskID(taskID);

                        }
                    }
                }
                mergeredHTNSetList.Add(newlyMergeredHTNTaskSet);
            }

            return mergeredHTNSetList;
        }
Esempio n. 4
0
        public List<HTNEffect> GetAllPostEffects(SpecificationKnowledge specificationKnowledge)
        {
            List<HTNEffect> postEffects = new List<HTNEffect>();

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

            return postEffects;
        }
Esempio n. 5
0
 public abstract void SetPlannerProperties(
     HTNState initialHTNState,
     HTNState targetHTNState,
     string workitemID,
     SpecificationKnowledge specificationKnowledge,
     ResourceProfileSet resourceProfileSet);
Esempio n. 6
0
 public ComplexHTNPlanner(SpecificationKnowledge specificationKnowledge)
     : this()
 {
     SpecificationKnowledge = specificationKnowledge;
 }
Esempio n. 7
0
        public override void SetPlannerProperties(
            HTNState initialHTNState,
            HTNState targetHTNState,
            string workitemID,
            SpecificationKnowledge specificationKnowledge,
            ResourceProfileSet resourceProfileSet)
        {
            ResourceProfileSet = resourceProfileSet;
            SpecificationKnowledge = specificationKnowledge;

            StateConstraints.Clear();
            StateConstraints.Add(initialHTNState);
            StateConstraints.Add(targetHTNState);

            InitialState.StateAtoms.Clear();
            InitialState = new HTNState(initialHTNState);
            TargetState = new HTNState(targetHTNState);

            WorkitemID = workitemID;
        }
Esempio n. 8
0
        public HTNState ConjectureOneState(List<string> htnTaskIDList, SpecificationKnowledge wsk)
        {
            List<string> postConditionAtoms = new List<string>();

            List<HTNTask> htnTaskList = new List<HTNTask>();

            foreach (string taskID in htnTaskIDList)
            {
                htnTaskList.Add(wsk.GetHTNTask(taskID));
            }

            // TODO: WHAT IS THIS SUPPOSED TO BE. FFFFFFF
            foreach (HTNTask htnTask in htnTaskList)
            {

            }

            return new HTNState();
        }
Esempio n. 9
0
 public override void SetPlannerProperties(HTNState initialHTNState, HTNState targetHTNState, string workitemID, SpecificationKnowledge specificationKnowledge, ResourceProfileSet resourceProfileSet)
 {
     throw new NotImplementedException();
 }