예제 #1
0
        public static List <Landmark> GetPublicLandmarks(GroundedPredicate goalFact, Agent courentAgent)
        {
            List <List <Action> > publicActionslandmarks = new List <List <Action> >();
            List <Landmark>       publicLandmark         = new List <Landmark>();
            Queue <Landmark>      PrivacyPreservingQueue = new Queue <Landmark>();



            Landmark l = new Landmark("pre", false);

            l.AddPrivateFact(goalFact, "pre");
            l.isPublic = false;
            PrivacyPreservingQueue.Enqueue(l);
            // publicLandmark.Add(l);


            if (courentAgent.PublicPredicates.Contains(goalFact))
            {
                throw new Exception("it is not should to be public predicate");
            }

            foreach (Agent agent in agents)
            {
                if (agent.name.Equals(courentAgent.name))
                {
                    agent.initPublicLandmarksDetect(l);
                }
                else
                {
                    agent.initPublicLandmarksDetect(null);
                }
            }



            while (PrivacyPreservingQueue.Count > 0)
            {
                Landmark ppLandmark = PrivacyPreservingQueue.Dequeue();

                foreach (Agent agent in agents)
                {
                    agent.Reset();
                }



                foreach (Agent agent in agents)
                {
                    if (courentAgent.name.Equals(agent.name))
                    {
                        agent.SetLandmarkToExplorer(ppLandmark);
                    }
                    else
                    {
                        agent.SetLandmarkToExplorer((Landmark)null);
                    }
                }


                HashSet <GroundedPredicate> publicSet = new HashSet <GroundedPredicate>();

                foreach (Agent agent in agents)
                {
                    HashSet <GroundedPredicate> tmp = agent.Detection();
                    foreach (var gp in tmp)
                    {
                        if (!publicSet.Contains(gp))
                        {
                            publicSet.Add(gp);
                        }
                    }
                }

                bool flag2 = true;
                while (flag2)
                {
                    flag2 = false;
                    foreach (Agent agent in agents)
                    {
                        HashSet <GroundedPredicate> tmp = agent.WhatYoCanGet(publicSet);

                        foreach (var gp in tmp)
                        {
                            if (!publicSet.Contains(gp))
                            {
                                publicSet.Add(gp);
                                flag2 = true;
                            }
                        }
                    }
                }

                List <Agent> relevantAgents = new List <Agent>();

                foreach (Agent agent in agents)
                {
                    List <Action> lAchievers = agent.CanGet();
                    if (lAchievers != null)
                    {
                        relevantAgents.Add(agent);
                        List <Action> publicActions = courentAgent.GetPublicActions(lAchievers);
                        if (publicActions.Count > 0)
                        {
                            if (ppLandmark.lAchievers != null)
                            {
                                ppLandmark.lAchievers.AddRange(publicActions);
                            }
                            else
                            {
                                ppLandmark.lAchievers = publicActions;
                            }
                        }
                    }
                }


                if (relevantAgents.Count == 1)
                {
                    List <Landmark> newPPLandmarks = relevantAgents.ElementAt(0).DetectNewLocalLandmarks(false);

                    for (int i = 0; i < newPPLandmarks.Count; i++)
                    {
                        Landmark ppl = newPPLandmarks.ElementAt(i);
                        if (ppLandmark.mix)
                        {
                            publicLandmark.Remove(ppLandmark);
                            List <GroundedPredicate> publicFacts = courentAgent.GetPublicFacts(ppLandmark.facts.Keys.ToList());
                            foreach (GroundedPredicate publicFact in publicFacts)
                            {
                                ppl.AddPublicFact(publicFact, "pre");
                            }
                            ppl.lAchievers = new List <Action>();
                            ppl.lAchievers.AddRange(ppLandmark.lAchievers);
                        }

                        if (ppl.isPublic || ppl.mix)
                        {
                            publicLandmark.Add(ppl);
                        }
                        if (!ppl.isPublic || ppl.mix)
                        {
                            PrivacyPreservingQueue.Enqueue(ppl);
                        }
                    }
                }
                else
                {
                    if (relevantAgents.Count > 1)
                    {
                        throw new Exception("only one agent can Achieve private landmark");
                    }
                }
            }
            List <Landmark> ans = new List <Landmark>();

            for (int i = 0; i < publicLandmark.Count; i++)
            {
                Landmark ppl  = publicLandmark.ElementAt(i);
                Landmark newl = new Landmark("Goal", true);
                foreach (GroundedPredicate pgp in courentAgent.GetPublicFacts(ppl.facts.Keys.ToList()))
                {
                    newl.AddPublicFact(pgp, "art-goal");
                }
                ans.Add(newl);
            }


            return(ans);
        }
예제 #2
0
        public static KeyValuePair <List <List <Action> >, List <Landmark> > GetPublicActionsLandmarks(GroundedPredicate goalFact, Agent courentAgent, out int localDepth, bool pos)
        {
            List <List <Action> > publicActionslandmarks = new List <List <Action> >();
            List <Landmark>       publicLandmark         = new List <Landmark>();
            Queue <Landmark>      PrivacyPreservingQueue = new Queue <Landmark>();
            List <Landmark>       tmpForTest             = new List <Landmark>();
            List <Landmark>       tmpForDepthTest        = new List <Landmark>();


            Landmark l = new Landmark("pre", false);

            l.AddPrivateFact(goalFact, "pre");
            l.isPublic = false;
            PrivacyPreservingQueue.Enqueue(l);
            //publicLandmark.Add(l);
            if (courentAgent.PublicPredicates.Contains(goalFact))
            {
                throw new Exception("it is not should to be public predicate");
            }

            foreach (Agent agent in agents)
            {
                if (agent.name.Equals(courentAgent.name))
                {
                    agent.initPublicLandmarksDetect(l);
                }
                else
                {
                    agent.initPublicLandmarksDetect(null);
                }
            }

            List <Action> allAchievers;

            int index = 0;

            while (PrivacyPreservingQueue.Count > 0)
            {
                bool closeLandmark = false;
                allAchievers = null;

                Landmark ppLandmark = PrivacyPreservingQueue.Dequeue();
                if (ppLandmark.facts.Count == 0)
                {
                    Console.WriteLine("ddd");
                }
                bool f = true;
                foreach (Landmark land in tmpForTest)
                {
                    if (land.Equals(ppLandmark))
                    {
                        f = false;
                        break;
                    }
                }
                if (f)
                {
                    Landmark nl = new Landmark("dd", false);
                    nl.facts = new Dictionary <GroundedPredicate, string>(ppLandmark.facts);
                    nl.index = ppLandmark.index;
                    tmpForTest.Add(nl);
                }

                foreach (Landmark land in tmpForDepthTest)
                {
                    if (land.Identical(ppLandmark))
                    {
                        f = false;
                        break;
                    }
                }
                if (f)
                {
                    tmpForDepthTest.Add(ppLandmark);
                }

                foreach (Agent agent in agents)
                {
                    agent.Reset();
                }



                foreach (Agent agent in agents)
                {
                    if (courentAgent.name.Equals(agent.name))
                    {
                        agent.SetLandmarkToExplorer(ppLandmark);
                    }
                    else
                    {
                        agent.SetLandmarkToExplorer((Landmark)null);
                    }
                }


                HashSet <GroundedPredicate> publicSet = new HashSet <GroundedPredicate>();

                foreach (Agent agent in agents)
                {
                    HashSet <GroundedPredicate> tmp = agent.DetectionGlobal();
                    foreach (var gp in tmp)
                    {
                        if (!publicSet.Contains(gp))
                        {
                            publicSet.Add(gp);
                        }
                    }
                }

                bool flag2 = true;
                while (flag2)
                {
                    flag2 = false;
                    foreach (Agent agent in agents)
                    {
                        HashSet <GroundedPredicate> tmp = agent.WhatYoCanGet(publicSet);

                        foreach (var gp in tmp)
                        {
                            if (!publicSet.Contains(gp))
                            {
                                publicSet.Add(gp);
                                flag2 = true;
                            }
                        }
                    }
                }

                List <Agent> relevantAgents = new List <Agent>();

                foreach (Agent agent in agents)
                {
                    List <Action> lAchievers = agent.CanGet();

                    if (lAchievers != null)
                    {
                        relevantAgents.Add(agent);
                        allAchievers = lAchievers;
                        if (!ppLandmark.secondRound)
                        {
                            foreach (GroundedPredicate fact in ppLandmark.facts.Keys.ToList())
                            {
                                bool flag = false;
                                foreach (Action act in lAchievers)
                                {
                                    if (act.HashEffects.Contains(fact))
                                    {
                                        flag = true;
                                        break;
                                    }
                                }
                                if (!flag)
                                {
                                    ppLandmark.facts.Remove(fact);
                                }
                            }


                            List <Action> publicActions    = courentAgent.GetPublicActions(lAchievers);
                            List <Action> privateAchievers = new List <Action>(allAchievers);
                            foreach (Action pubAct in publicActions)
                            {
                                privateAchievers.Remove(pubAct);
                            }
                            bool possibleInTheInitial = agent.PossibleInTheInitial(privateAchievers);

                            /* bool test = agent.PossibleInTheInitial(allAchievers);
                             * if (test && !possibleInTheInitial)
                             * {
                             *   Console.WriteLine("***");
                             * }*/
                            if (ppLandmark.AchieversPossibleInTheInitial == false)
                            {
                                ppLandmark.AchieversPossibleInTheInitial = possibleInTheInitial;
                            }
                            if (publicActions.Count > 0)
                            {
                                if (ppLandmark.lAchievers != null)
                                {
                                    ppLandmark.lAchievers.AddRange(publicActions);
                                }
                                else
                                {
                                    ppLandmark.lAchievers = publicActions;
                                }
                                if (publicActions.Count == lAchievers.Count)
                                {
                                    closeLandmark = true;
                                }
                            }
                        }
                    }
                }
                if (ppLandmark.lAchievers == null)
                {
                    ppLandmark.lAchievers = new List <Action>();
                }
                if (allAchievers == null)
                {
                    ppLandmark.secondRound = true;
                }
                if (!closeLandmark && ppLandmark.secondRound)
                {
                    if (relevantAgents.Count == 1)
                    {
                        List <Landmark> newPPLandmarks = relevantAgents.ElementAt(0).DetectNewLocalLandmarks(true);
                        foreach (Landmark slave in newPPLandmarks)
                        {
                            slave.myMuster = ppLandmark;
                            slave.index    = index;
                            index++;
                        }
                        for (int i = 0; i < newPPLandmarks.Count; i++)
                        {
                            Landmark ppl = newPPLandmarks.ElementAt(i);
                            ppl.AchieversPossibleInTheInitial = ppLandmark.AchieversPossibleInTheInitial;
                            ppl.lAchievers = new List <Action>(ppLandmark.lAchievers);
                            PrivacyPreservingQueue.Enqueue(ppl);
                        }
                        if (newPPLandmarks.Count == 0)
                        {
                            if (ppLandmark.lAchievers != null && ppLandmark.lAchievers.Count > 0)
                            {
                                if (ppLandmark.publicEffects != null)
                                {
                                    ppLandmark.facts = new Dictionary <GroundedPredicate, string>();
                                    foreach (GroundedPredicate gp in ppLandmark.publicEffects)
                                    {
                                        ppLandmark.facts.Add(gp, "pre");
                                    }

                                    publicLandmark.Add(ppLandmark);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (relevantAgents.Count > 1)
                        {
                            throw new Exception("only one agent can Achieve private landmark");
                        }
                        if (relevantAgents.Count == 0)
                        {
                            if (ppLandmark.lAchievers != null && ppLandmark.lAchievers.Count > 0)
                            {
                                ppLandmark.facts = new Dictionary <GroundedPredicate, string>();
                                foreach (GroundedPredicate gp in ppLandmark.publicEffects)
                                {
                                    ppLandmark.facts.Add(gp, "pre");
                                }
                                publicLandmark.Add(ppLandmark);
                            }
                        }
                    }
                }
                else
                {
                    if (closeLandmark)
                    {
                        publicLandmark.Add(ppLandmark);
                    }
                    else
                    {
                        foreach (GroundedPredicate gp in ppLandmark.facts.Keys.ToList())
                        {
                            bool dell = true;
                            foreach (Action act in allAchievers)
                            {
                                if (ppLandmark.lAchievers == null || !ppLandmark.lAchievers.Contains(act))
                                {
                                    if (act.HashEffects.Contains(gp))
                                    {
                                        dell = false;
                                        break;
                                    }
                                }
                            }

                            if (dell)
                            {
                                if (ppLandmark.publicEffects == null)
                                {
                                    ppLandmark.publicEffects = new List <GroundedPredicate>();
                                }
                                ppLandmark.publicEffects.Add(gp);
                                ppLandmark.facts.Remove(gp);
                            }
                            else
                            {
                                bool flag = false;
                                if (ppLandmark.lAchievers != null)
                                {
                                    foreach (Action act in ppLandmark.lAchievers)
                                    {
                                        if (act.HashEffects.Contains(gp))
                                        {
                                            flag = true;
                                            break;
                                        }
                                    }
                                    if (flag)
                                    {
                                        if (ppLandmark.publicEffects == null)
                                        {
                                            ppLandmark.publicEffects = new List <GroundedPredicate>();
                                        }
                                        ppLandmark.publicEffects.Add(gp);
                                    }
                                }
                            }
                        }
                        ppLandmark.secondRound = true;
                        PrivacyPreservingQueue.Enqueue(ppLandmark);
                    }
                }
            }
            if (pos)
            {
                int size = 0;
                foreach (Landmark la in tmpForTest)
                {
                    size += la.facts.Count();
                }
                AdvancedLandmarkProjectionPlaner.sizeOfRegressionTree += size;
            }
            HashSet <Landmark> dellPar = new HashSet <Landmark>();

            foreach (Landmark land in tmpForDepthTest)
            {
                if (land.myMuster != null)
                {
                    dellPar.Add(land.myMuster);
                }
            }
            foreach (Landmark ldel in dellPar)
            {
                tmpForDepthTest.Remove(ldel);
            }
            int depth = 0;

            foreach (Landmark land in tmpForDepthTest)
            {
                depth += land.depth;
            }
            localDepth = depth;
            List <Landmark> landmarks = new List <Landmark>();

            for (int i = 0; i < publicLandmark.Count; i++)
            {
                Landmark ppl = publicLandmark.ElementAt(i);
                if (ppl.lAchievers != null)
                {
                    landmarks.Add(ppl);
                    publicActionslandmarks.Add(ppl.lAchievers);
                }
            }


            return(new KeyValuePair <List <List <Action> >, List <Landmark> >(publicActionslandmarks, landmarks));;
        }