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; }
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; }