public static List <string> SolveFactored(List <Domain> lDomains, List <Problem> lProblems, ref List <Agent> m_agents, Domain joinDomain) { if (Program.highLevelPlanerType != Program.HighLevelPlanerType.ProjectionMafs) { Program.projectionVersion = Program.ProjectionVersion.NULL; } Program.Start = DateTime.Now; pdbCreationTime = 0; var lGroundedProblems = GroundProblems(lDomains, lProblems); Program.internalPlaner = Program.PlanerType.ff_toActions; BuildAgents_II buildAgents = new BuildAgents_II(lDomains, lGroundedProblems, lProblems); List <Agent> agents = buildAgents.ReturnAgents(); GetPublicPredicates(agents); List <string> lPlan = null; if (Program.highLevelPlanerType == Program.HighLevelPlanerType.Projection) { Console.WriteLine("Planning"); ShareGoals(agents); AdvancedLandmarkProjectionPlaner planner = new AdvancedLandmarkProjectionPlaner(); lPlan = planner.Plan(agents, lDomains, lProblems, joinDomain); } else { try { Program.StartHighLevelPlanning = DateTime.Now; if (Program.highLevelPlanerType == Program.HighLevelPlanerType.Landmark) { Console.WriteLine("Identifying landmarks"); bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, false); Planer_I Planner = new Planer_I(agents); Console.WriteLine("Planning"); lPlan = Planner.Plan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.PDB) { DateTime startPdbCreation = DateTime.Now; PdbPlaner.pdb = new PatternDatabase(lDomains, lProblems, agents, pdbPath); pdbCreationTime = DateTime.Now.Subtract(startPdbCreation).TotalSeconds; foreach (Agent agent in agents) { agent.InitMutex(); } Distributed_Landmarks_Detection.Reset(agents); List <Landmark> PublicAndArtificialGoals = FindPublicAndArtificialGoals(agents); PdbPlaner Planner = new PdbPlaner(agents, PublicAndArtificialGoals, PdbPlaner.pdb); Console.WriteLine("Planning"); lPlan = Planner.Plan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.ForwardHsp) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } Distributed_Landmarks_Detection.Reset(agents); PlanerHsp Planner = new PlanerHsp(agents); Console.WriteLine("Planning"); lPlan = Planner.Plan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.BackwardHsp) { bool stop = false; List <GroundedPredicate> publishPublic = new List <GroundedPredicate>(); List <GroundedPredicate> nextPublishPublic = new List <GroundedPredicate>(); foreach (Agent a in agents) { publishPublic.AddRange(a.InitBackwardHspGraph()); } bool outFlag = false; while (!stop) { stop = true; outFlag = false; foreach (Agent agent in agents) { nextPublishPublic.AddRange(agent.UpdateBackwardHspGraph(publishPublic, out outFlag)); if (outFlag) { stop = false; } } publishPublic = nextPublishPublic; } foreach (Agent agent in agents) { agent.InitMutex(); } Distributed_Landmarks_Detection.Reset(agents); // agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents); PlanerHspII Planner = new PlanerHspII(agents); Console.WriteLine("Planning"); lPlan = Planner.Plan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.LandmarkAndHsp) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, false); PlanerHspAndLandmarks Planner = new PlanerHspAndLandmarks(agents); Console.WriteLine("Planning.."); lPlan = Planner.Plan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.WeightedLandmarkAndHsp) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, false); PlanerWeightedLandmarkAndHsp Planner = new PlanerWeightedLandmarkAndHsp(agents); Console.WriteLine("Planning"); lPlan = Planner.Plan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.SophisticatedProjection) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } // agents = AdvancedLandmarkProjectionAgents.CreateProjAgents(agents, lDomains, lProblems); agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, false); PlanerHspAndLandmarks Planner = new PlanerHspAndLandmarks(agents); Console.WriteLine("Planning"); lPlan = Planner.Plan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.PDBMafs) { MapsVertex.pdb = new PatternDatabase(lDomains, lProblems, agents, pdbPath); bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } Console.WriteLine("Planning"); MapsPlanner Planner = new MapsPlanner(agents, lDomains, lProblems); Program.StartGrounding = DateTime.Now; lPlan = Planner.Plan(); } else if (Program.highLevelPlanerType == Program.HighLevelPlanerType.MafsLandmark) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, true); Console.WriteLine("Planning"); MapsPlanner Planner = new MapsPlanner(agents, lDomains, lProblems); Program.StartGrounding = DateTime.Now; lPlan = Planner.Plan(); } else if (Program.highLevelPlanerType == Program.HighLevelPlanerType.Mafsff) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, true); Console.WriteLine("Planning"); MapsPlanner Planner = new MapsPlanner(agents, lDomains, lProblems); Program.StartGrounding = DateTime.Now; lPlan = Planner.PreferableFFPlan(); } else { if (Program.highLevelPlanerType == Program.HighLevelPlanerType.ProjectionMafs) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, true); Console.WriteLine("Planning"); MapsPlanner Planner = new MapsPlanner(agents, lDomains, lProblems); Program.StartGrounding = DateTime.Now; lPlan = Planner.PreferablePlan(); } else if (Program.highLevelPlanerType == Program.HighLevelPlanerType.DistrebutedProjectionMafs) { bool stop = false; while (!stop) { stop = true; string name = ""; GroundedPredicate currentGoal = null; foreach (Agent agent in agents) { currentGoal = agent.GetGoal(); if (currentGoal != null) { stop = false; name = agent.name; break; } } if (!stop) { foreach (Agent agent in agents) { if (!agent.name.Equals(name)) { agent.ReceiveGoal(currentGoal); } } } } foreach (Agent agent in agents) { agent.InitMutex(); } agents = Distributed_Landmarks_Detection.Landmarks_Detection(agents, true); Console.WriteLine("Planning"); MapsPlanner Planner = new MapsPlanner(agents, lDomains, lProblems); Program.StartGrounding = DateTime.Now; lPlan = Planner.DistrebutedPreferablePlan(); } else { Console.WriteLine("highLevelPlanerType did not selected"); } } } } } } } } } } catch (Exception ex) { RunUtils.KillPlanners(); return(null); } } Program.End = DateTime.Now; RunUtils.KillPlanners(); m_agents = agents; return(lPlan); }
public static List <Agent> CreateProjAgents(List <Agent> m_agents, List <Domain> lDomains, List <Problem> lProblems) { agents = m_agents; map = new Dictionary <string, int>(); int j = 0; foreach (Agent agent in agents) { map.Add(agent.name, j); j++; } List <Action> allProjectionAction = new List <Action>(); List <Landmark> lGoal = new List <Landmark>(); int index = 0; Distributed_Landmarks_Detection.Reset(agents); List <Predicate> predicates = new List <Predicate>(); Domain dPublic = new Domain("PublicDomain", ""); Problem pPublic = new Problem("PublicProblem", dPublic); State publicStartState = new State(pPublic); GroundedPredicate newPrePredicate = null; newPrePredicate = new GroundedPredicate(Domain.ARTIFICIAL_PREDICATE + "StartState"); publicStartState.AddPredicate(newPrePredicate); predicates.Add(newPrePredicate); //mapActionNameToAction=new Dictionary<string,Action>(); for (int i = 0; i < agents.Count; i++) { Agent agent = agents[i]; agent.mapActionNameToAction = new Dictionary <string, Action>(); foreach (Action act in agent.publicActions) { if (!agent.mapActionNameToAction.ContainsKey(act.Name)) { agent.mapActionNameToAction.Add(act.Name, act); } } agent.initLandmarksDetect(); agent.saveInfo(); State startState = new State(lProblems[i]); startState.AddPredicate(newPrePredicate); List <Action> currentlProjAction = agent.getAdvancedProjectionPublicAction(index, predicates, startState); agent.m_actions = currentlProjAction; agent.privateActions = new List <Action>(); agent.publicActions = currentlProjAction; // agent.PublicPredicates = new HashSet<GroundedPredicate>(); //allProjectionAction.AddRange(currentlProjAction); foreach (Action act in currentlProjAction) { act.agent = agent.name; //if (!agent.mapActionNameToAction.ContainsKey(act.Name)) // agent.mapActionNameToAction.Add(act.Name, act); } foreach (Predicate pred in agent.PublicPredicates) { predicates.Add(pred); // agent.PublicPredicates.Add((GroundedPredicate)pred); } agent.Predicates = new HashSet <GroundedPredicate>(); foreach (GroundedPredicate pgp in predicates) { agent.Predicates.Add(pgp); } foreach (GroundedPredicate pgp in agent.GetPublicStartState()) { startState.AddPredicate(pgp); } index += 1000; lGoal.AddRange(agent.GetPublicGoals()); /**** I implmented this in GetPublicStartState function in Agent ****/ List <GroundedPredicate> lInitialPrivate = agent.GetPrivateStartState(); foreach (KeyValuePair <GroundedPredicate, HashSet <GroundedPredicate> > pArtificial in agent.ArtificialToPrivate) { bool bAllTrue = true; foreach (GroundedPredicate gpReal in pArtificial.Value) { if (!lInitialPrivate.Contains(gpReal)) { bAllTrue = false; } } if (bAllTrue) { if (!startState.Contains(pArtificial.Key)) { startState.AddPredicate(pArtificial.Key); } } } agent.startState = startState; } return(agents); /* dPublic.Actions = allProjectionAction; * foreach (Domain d in lDomains) * { * foreach (ParametrizedPredicate pp in d.Predicates) * dPublic.Predicates.Add(pp); * foreach (string sType in d.Types) * if (!dPublic.Types.Contains(sType)) * dPublic.Types.Add(sType); * foreach (KeyValuePair<string, string> pair in d.TypeHierarchy) * dPublic.TypeHierarchy[pair.Key] = pair.Value; * foreach (Constant c in d.Constants) * dPublic.Constants.Add(c); * } * foreach (Predicate p in predicates) * { * if (p.Name.StartsWith(Domain.ARTIFICIAL_PREDICATE)) * { * ParametrizedPredicate pp = new ParametrizedPredicate(p.Name); * dPublic.Predicates.Add(pp); * } * * } * * foreach (Predicate pInit in publicStartState.Predicates) * pPublic.AddKnown(pInit); */ /*CompoundFormula goalf = new CompoundFormula("and"); * foreach (Landmark l in lGoal) * { * CompoundFormula disjGoal = new CompoundFormula("or"); * foreach (GroundedPredicate gp in l.facts.Keys) * { * disjGoal.AddOperand(gp); * } * goalf.AddOperand(disjGoal); * } * pPublic.Goal = goalf; * * bool ans; * * highLevelplan = ExternalPlanners.FFPlan(dPublic, pPublic, publicStartState, goalf, dPublic.Actions, 20 * 60000, out ans); * //highLevelplan = ExternalPlanners.FDPlan(dPublic, pPublic, publicStartState, goalf, dPublic.Actions, 20 * 60000, out ans); * if (highLevelplan == null) * return null; * // return ManualSolve(pPublic, dPublic); * string fault; * List<string> finalPlan; * if (Grounding(out finalPlan, out fault)) * return finalPlan; * //throw new NotImplementedException(); * return null;*/ }