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 List <string> Plan() { bool bAllAgentsEqual = CheckAgentEquality(); int i = 200;// countOfLandmarks; int[] statesNum = new int[agents.Count]; for (int k = 0; k < statesNum.Length; k++) { statesNum[k] = 0; } Vertex rootVertex = new Vertex(statesNum, new List <Action>(), 0, countOfLandmarks, 0, null); //DateTime begin = DateTime.Now; int count = 0; Vertex curentVertex = null; DateTime dtStart = DateTime.Now; DateTime begin = DateTime.Now; List <Vertex> queue = new List <Vertex>(); HashSet <int[]> lVisited = new HashSet <int[]>(new ComparerArray()); HashSet <Vertex> lVisited2 = new HashSet <Vertex>(); //PriorityQueue<Vertex, double> queue2 = new PriorityQueue<Vertex, double>(Vertex.ComparerDouble); //PriorityQueue<Vertex, double> queue2 = new PriorityQueue<Vertex, double>(); //Heap heap = new Heap(1000000); //queue2.Insert(rootVertex, rootVertex.h); //heap.Insert(rootVertex); queue.Add(rootVertex); lVisited.Add(rootVertex.statesNubmber); lVisited2.Add(rootVertex); // double priority = -1 * (rootVertex.h + (double)(rootVertex.g) / 100000 ); //queue2.Enqueue(rootVertex, priority); int temp = 0; List <string> lplan = null;// new List<string>(); bool flag = true; int c = 0; int cResets = 0; double minh = 1000; int blindCounter = 0; TimeSpan tsDeadendDetection = new TimeSpan(); while (queue.Count > 0) { c++; if (c % 30 == 0) { //Console.Write("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bExpanded: " + c + ", open: " + queue.Count + ", h: " + curentVertex.h + ", T: " + (int)(DateTime.Now - dtStart).TotalSeconds); Console.Write("\rExpanded: " + c + ", open: " + queue.Count + ", h: " + curentVertex.h + ", h2: " + curentVertex.h2 + ", T: " + (int)(DateTime.Now - dtStart).TotalSeconds + ", deadend = " + (int)tsDeadendDetection.TotalSeconds); if (queue.Count > 200000) { return(null); Console.WriteLine(); Console.WriteLine("Queue too large, breaking."); } } flag = true; //curentVertex = queue[0]; // List<PriorityQueueItem<Vertex,double>> v = queue2.ToList(); //curentVertex = queue2.Dequeue().Value; temp++; curentVertex = FindMin(queue);// queue[0];// heap.Remove(); // queue.Remove(curentVertex); DateTime dtBefore = DateTime.Now; bool bDeadend = curentVertex.IsDeadEnd(); tsDeadendDetection += (DateTime.Now - dtBefore); if (bDeadend) { continue; } // queue.RemoveAt(0); count++; if (false && curentVertex.BlindSearchDepth > 2) { cResets++; Vertex vLastImprovement = curentVertex; while (vLastImprovement.Parent != null && vLastImprovement.Parent.h == curentVertex.h) { vLastImprovement = vLastImprovement.Parent; } int[] newStatesIndexs = new int[agents.Count]; int k = 0; // List<State> lCurrentStartStates = new List<State>(); foreach (Agent agent in agents) { // lCurrentStartStates.Add(agent.startState); agent.ChangeInitialState(vLastImprovement.statesNubmber[k]); k++; } Distributed_Landmarks_Detection.Landmarks_Detection(agents, false); // for (int j = 0; j < agents.Count; j++) // agents[j].startState = lCurrentStartStates[j]; k = 0; foreach (Agent agent in agents) { newStatesIndexs[k] = agent.ResetStateInfo(vLastImprovement.statesNubmber[k]); k++; } curentVertex = new Vertex(newStatesIndexs, new List <Action>(), 0, countOfLandmarks, 0, null); curentVertex.History = vLastImprovement.History; curentVertex.lplan = vLastImprovement.lplan; minh = curentVertex.vectors.ElementAt(0)[0].Length; queue = new List <Vertex>(); lVisited = new HashSet <int[]>(); lVisited.Add(curentVertex.statesNubmber); lVisited2.Add(curentVertex); blindCounter = 0; } blindCounter++; // if (curentVertex.Parent != null && curentVertex.Parent.Parent != null && curentVertex.h == curentVertex.Parent.h && curentVertex.h == curentVertex.Parent.Parent.h) // Console.WriteLine("stuck!"); string isGoal = curentVertex.IsGoal(out lplan); if (isGoal.Equals("true")) { double time = ((double)((DateTime.Now.Subtract(begin)).Minutes)) * 60.0; time += ((double)((DateTime.Now.Subtract(begin)).Seconds)); time += ((double)((DateTime.Now.Subtract(begin)).Milliseconds) / 1000); //Console.WriteLine(time); //Console.WriteLine(lplan.Count); // Console.WriteLine(((double)((DateTime.Now.Subtract(begin)).Milliseconds) / 1000)); Program.times.Add(time); Program.countActions.Add(lplan.Count); Program.timeSum += time; Program.actionSum += lplan.Count; /* foreach (Action act in curentVertex.lplan) * { * sw.WriteLine(act.Name); * lplan.Add(act.Name); * } * sw.Close();*/ return(lplan); } if (!isGoal.Equals("false")) { //return null; } // Program.messages += agents.Count; int f = 0; List <Vertex> needUpDate = new List <Vertex>(); HashSet <CompoundFormula> levelPotential = new HashSet <CompoundFormula>(); int index = 1; bool con = false; List <Vertex> lExpanded = Expand(curentVertex, levelPotential, needUpDate); foreach (Vertex newVertex in lExpanded) { if (newVertex.actionNumber > 0) { f++; queue.Add(newVertex); } f++; newVertex.g += (double)index / 1000000; bool bVisited = false; if (bAllAgentsEqual) { bVisited = lVisited2.Contains(newVertex); } else { bVisited = lVisited.Contains(newVertex.statesNubmber); } if (!bVisited) { queue.Add(newVertex); lVisited.Add(newVertex.statesNubmber); lVisited2.Add(newVertex); } index++; if (minh > newVertex.h) { minh = newVertex.h; Console.WriteLine(minh); } /* if (Vertex.Comparer(newVertex, curentVertex) == -1 && !con) * { * blindCounter = 0; * }*/ } /*foreach (Vertex v in needUpDate) * { * v.publicPredicateImplications.Add(levelPotential); * }*/ // curentVertex.publicPredicateImplications.Add(levelPotential); curentVertex.canGetInParallel = levelPotential; //if (curentVertex.h + curentVertex.h2 == 0) if (curentVertex.h <= 0)// + curentVertex.h2 == 0) { curentVertex.publicPredicateImplications = new List <HashSet <CompoundFormula> >(); Vertex tmp = curentVertex; while (tmp != null) { curentVertex.publicPredicateImplications.Insert(0, tmp.canGetInParallel); tmp = tmp.Parent; } } } return(null); }