public static List <Landmark> DetectNewLandmarks(List <Action> PossibleBefore, HashSet <GroundedPredicate> usedFacts) { int indexProp = 1; List <Landmark> newsPPLandmarks = new List <Landmark>(); bool flag2 = false; if (PossibleBefore.Count > 0) { HashSet <GroundedPredicate> oldFacts = new HashSet <GroundedPredicate>(); Action firstAction = PossibleBefore[0]; foreach (GroundedPredicate prop in firstAction.HashPrecondition) { if (usedFacts.Contains(prop)) { continue; } bool flag = true; foreach (Action act in PossibleBefore) { if (!act.HashPrecondition.Contains(prop)) { flag = false; break; } } if (flag) { Landmark newLandmark = new Landmark("fact", false); newLandmark.AddFact(prop, "first_round"); indexProp++; newsPPLandmarks.Add(newLandmark); oldFacts.Add(prop); usedFacts.Add(prop); } } if (PossibleBefore.Count > 1) { firstAction = PossibleBefore[0]; } PossibleBefore.RemoveAt(0); foreach (GroundedPredicate prop in firstAction.HashPrecondition) { string type = prop.Name; // if (!oldFacts.Contains(prop) && !usedFacts.Contains(prop)) { int counter = 0;; Landmark newLandmark = new Landmark("Disjunctive", false); //newLandmark.worth = exploreLandmarks.worth - 10; if (oldFacts.Contains(prop)) { continue; } if (!usedFacts.Contains(prop)) { newLandmark.AddFact(prop, "first_round"); } foreach (Action act in PossibleBefore) { bool f = false; foreach (GroundedPredicate prop2 in act.HashPrecondition) { if (prop2.Name == prop.Name) { if (!newLandmark.facts.ContainsKey(prop2) && !usedFacts.Contains(prop2)) { newLandmark.AddFact(prop2, "first_round"); } counter++; f = true; break; } } } if (counter == PossibleBefore.Count && newLandmark.facts.Count > 0) { newsPPLandmarks.Add(newLandmark); foreach (GroundedPredicate gp in newLandmark.facts.Keys) { usedFacts.Add(gp); } } } } } return(newsPPLandmarks); }
public static HashSet <Action> GetPublicActionsLandmarks2(GroundedPredicate goalFact, Agent courentAgent, out int dept, bool pos) { dept = 0; string gpName = goalFact.Name + " " + goalFact.Constants[0]; List <Landmark> lowLayerLandmarks = new List <Landmark>(); if (courentAgent.PublicPredicates.Contains(goalFact)) { throw new Exception(); } Landmark firstLandmark = new Landmark("firstFact", false); firstLandmark.lAchievers = new List <Action>(); firstLandmark.facts.Add(goalFact, "fact"); Queue <Landmark> queue = new Queue <Landmark>(); queue.Enqueue(firstLandmark); HashSet <GroundedPredicate> usedFacts = new HashSet <GroundedPredicate>(); usedFacts.Add(goalFact); while (queue.Count > 0) { Landmark courrentLandmark = queue.Dequeue(); HashSet <Action> CanAchiveList = CanAchive(courrentLandmark, courentAgent); List <Action> privateSet = new List <Action>(); List <Action> PublicSet = new List <Action>(); foreach (Action act in CanAchiveList) { if (act.isPublic) { PublicSet.Add(act); } else { privateSet.Add(act); } } courrentLandmark.lAchievers.AddRange(PublicSet); //privateSet = courentAgent.GetUnPosibalePrivateAction(privateSet); List <Landmark> newsPPLandmarks = DetectNewLandmarks(privateSet, usedFacts); List <Landmark> tmp = new List <Landmark>(); foreach (Landmark l in newsPPLandmarks) { Landmark newLand = new Landmark(l.type, l.GoalLandmark); foreach (var itemFact in l.facts) { string factName = itemFact.Key.Name + " " + itemFact.Key.Constants[0]; if (factName.Equals(gpName)) { newLand.AddFact(itemFact.Key, itemFact.Value); } } if (newLand.facts.Count > 0) { tmp.Add(newLand); } } newsPPLandmarks = tmp; if (newsPPLandmarks.Count > 0) { foreach (Landmark l in newsPPLandmarks) { l.lAchievers = new List <Action>(); l.lAchievers.AddRange(courrentLandmark.lAchievers); queue.Enqueue(l); } } else { lowLayerLandmarks.Add(courrentLandmark); } } // List<List<Action>> achievers = new List<List<Action>>(); //achievers.Add(new List<Action>()); HashSet <Action> achievers = new HashSet <Action>(); foreach (Landmark l in lowLayerLandmarks) { foreach (Action act in l.lAchievers) { achievers.Add(act); } /* if(l.lAchievers.Count>0) * { * if(achievers.Count==0) * { * foreach (Action act in l.lAchievers) * { * achievers.Add(act); * } * } * else * { * HashSet<Action> tmp = new HashSet<Action>(); * foreach(Action act in l.lAchievers) * { * if (achievers.Contains(act)) * tmp.Add(act); * } * achievers = tmp; * } * }*/ } return(achievers); }