예제 #1
0
        public void IncrementalPlanningSearch()
        {
            List <string> bpath = new List <string>();

            bpath.Add("Initial score: " + hanoiDomain.Goal.Fulfillment(hanoiDomain.State));

            IPlan p = new DFSPlan().SetMaxSearchDepth(4);

            p.Search(hanoiDomain.State, hanoiDomain.Goal);
            p.Search(p.GetFinalState(), hanoiDomain.Goal);

            Assert.GreaterOrEqual(hanoiDomain.Goal.Fulfillment(p.GetFinalState()), 1.0);
        }
예제 #2
0
        public void SolveTowerOfHanoiWith3Discs()
        {
            List <string> bpath = new List <string>();

            bpath.Add("Initial score: " + hanoiDomain.Goal.Fulfillment(hanoiDomain.State));


            IPlan p = new DFSPlan().SetMaxSearchDepth(7);

            p.Search(hanoiDomain.State, hanoiDomain.Goal);

            Assert.GreaterOrEqual(hanoiDomain.Goal.Fulfillment(p.GetFinalState()), 1.0);
        }
예제 #3
0
        public void SolveTowerOfHanoiWith3Discs()
        {
            List<string> bpath = new List<string>();
            bpath.Add("Initial score: " + hanoiDomain.Goal.Fulfillment(hanoiDomain.State));

            IPlan p = new DFSPlan().SetMaxSearchDepth(7);
            p.Search(hanoiDomain.State, hanoiDomain.Goal);

            Assert.GreaterOrEqual(hanoiDomain.Goal.Fulfillment(p.GetFinalState()), 1.0);
        }
예제 #4
0
        public void IncrementalPlanningSearch()
        {
            List<string> bpath = new List<string>();
            bpath.Add("Initial score: " + hanoiDomain.Goal.Fulfillment(hanoiDomain.State));

            IPlan p = new DFSPlan().SetMaxSearchDepth(4);
            p.Search(hanoiDomain.State, hanoiDomain.Goal);
            p.Search(p.GetFinalState(), hanoiDomain.Goal);

            Assert.GreaterOrEqual(hanoiDomain.Goal.Fulfillment(p.GetFinalState()), 1.0);
        }
예제 #5
0
        public void Solve()
        {
            puzzle = new Domain().BuildLogic((domain, state) =>
            {
                //
                //    01 02 03 04
                //    05 06 07 08
                //    09 10 11 12
                //    13 14 15
                //
                //
                string[] invalid_north = new string[] { "1", "2", "3", "4" };
                string[] invalid_east = new string[] { "4", "8", "12", "16" };
                string[] invalid_south = new string[] { "13", "14", "15", "16" };
                string[] invalid_west = new string[] { "1", "5", "9", "13" };

                Func<State, string> BlankPosition = (st) => { return st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3; };
                Func<State, bool> CanFlipNorth = (st) => { return !invalid_north.Contains(BlankPosition(st)); };
                Func<State, bool> CanFlipEast = (st) => { return !invalid_east.Contains(BlankPosition(st)); };
                Func<State, bool> CanFlipSouth = (st) => { return !invalid_south.Contains(BlankPosition(st)); };
                Func<State, bool> CanFlipWest = (st) => { return !invalid_west.Contains(BlankPosition(st)); };

                Action<State> FlipNorth = (State st) =>
                {
                    var slot = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 4).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 4).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", "Blank", (pos - 4).ToString()));
                };
                Action<State> FlipEast = (State st) =>
                {
                    var slot = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 1).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 1).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", "Blank", (pos + 1).ToString()));
                };
                Action<State> FlipSouth = (State st) =>
                {
                    var slot = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 4).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 4).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", "Blank", (pos + 4).ToString()));
                };
                Action<State> FlipWest = (State st) =>
                {
                    var slot = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 1).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 1).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple<string, string, string>("Board", "Blank", (pos - 1).ToString()));
                };

                state.PlanningActions.Add(new PlanningAction("Flip North")
                                       .AssignPrejudicate(st => CanFlipNorth(st))
                                       .AssignPostAction(st => FlipNorth(st))
                                      );
                state.PlanningActions.Add(new PlanningAction("Flip East")
                                         .AssignPrejudicate(st => CanFlipEast(st))
                                         .AssignPostAction(st => FlipEast(st))
                                        );
                state.PlanningActions.Add(new PlanningAction("Flip South")
                                         .AssignPrejudicate(st => CanFlipSouth(st))
                                         .AssignPostAction(st => FlipSouth(st))
                                        );
                state.PlanningActions.Add(new PlanningAction("Flip West")
                                         .AssignPrejudicate(st => CanFlipWest(st))
                                         .AssignPostAction(st => FlipWest(st))
                                        );

                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 1", "1"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 2", "2"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 3", "13"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 4", "12"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 5", "11"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 6", "10"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 7", "9"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 8", "8"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 9", "7"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 10", "6"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 11", "5"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 12", "4"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 13", "3"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 14", "14"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Brick 15", "15"));
                state.Relations.Add(new Tuple<string, string, string>("Board", "Blank", "16"));
            }
            ).AssignGoal(
                new Goal("Solve Puzzle").RelationalTarget("Board", "Brick 15", "16")
            );

            // Todo: write custom goal that uses Manhattan Distance
            var cg =  new CustomGoal().AssignGoal(delegate(State x) { return 0.0; });
            var cg2 = new CustomGoal().AssignGoal( state => { return 0.0; });

            //puzzle.State.PlanningActions[0].Execute(puzzle.State);

            IPlan p = new DFSPlan().SetMaxSearchDepth(10);
            p.Search(puzzle.State, puzzle.Goal);

            Assert.GreaterOrEqual(puzzle.Goal.Fulfillment(p.GetFinalState()), 1.0);
        }
예제 #6
0
        public void Solve()
        {
            puzzle = new Domain().BuildLogic((domain, state) =>
            {
                //
                //    01 02 03 04
                //    05 06 07 08
                //    09 10 11 12
                //    13 14 15
                //
                //
                string[] invalid_north = new string[] { "1", "2", "3", "4" };
                string[] invalid_east  = new string[] { "4", "8", "12", "16" };
                string[] invalid_south = new string[] { "13", "14", "15", "16" };
                string[] invalid_west  = new string[] { "1", "5", "9", "13" };

                Func <State, string> BlankPosition = (st) => { return(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3); };
                Func <State, bool> CanFlipNorth    = (st) => { return(!invalid_north.Contains(BlankPosition(st))); };
                Func <State, bool> CanFlipEast     = (st) => { return(!invalid_east.Contains(BlankPosition(st))); };
                Func <State, bool> CanFlipSouth    = (st) => { return(!invalid_south.Contains(BlankPosition(st))); };
                Func <State, bool> CanFlipWest     = (st) => { return(!invalid_west.Contains(BlankPosition(st))); };

                Action <State> FlipNorth = (State st) =>
                {
                    var slot     = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos      = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 4).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 4).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", "Blank", (pos - 4).ToString()));
                };
                Action <State> FlipEast = (State st) =>
                {
                    var slot     = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos      = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 1).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 1).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", "Blank", (pos + 1).ToString()));
                };
                Action <State> FlipSouth = (State st) =>
                {
                    var slot     = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos      = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 4).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos + 4).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", "Blank", (pos + 4).ToString()));
                };
                Action <State> FlipWest = (State st) =>
                {
                    var slot     = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item2 == "Blank").Item3;
                    int pos      = int.Parse(slot);
                    string brick = st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 1).ToString()).Item2;
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos - 1).ToString()));
                    st.Relations.Remove(st.Relations.Find(rel => rel.Item1 == "Board" && rel.Item3 == (pos).ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", brick, pos.ToString()));
                    st.Relations.Add(new Tuple <string, string, string>("Board", "Blank", (pos - 1).ToString()));
                };

                state.PlanningActions.Add(new PlanningAction("Flip North")
                                          .AssignPrejudicate(st => CanFlipNorth(st))
                                          .AssignPostAction(st => FlipNorth(st))
                                          );
                state.PlanningActions.Add(new PlanningAction("Flip East")
                                          .AssignPrejudicate(st => CanFlipEast(st))
                                          .AssignPostAction(st => FlipEast(st))
                                          );
                state.PlanningActions.Add(new PlanningAction("Flip South")
                                          .AssignPrejudicate(st => CanFlipSouth(st))
                                          .AssignPostAction(st => FlipSouth(st))
                                          );
                state.PlanningActions.Add(new PlanningAction("Flip West")
                                          .AssignPrejudicate(st => CanFlipWest(st))
                                          .AssignPostAction(st => FlipWest(st))
                                          );



                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 1", "1"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 2", "2"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 3", "13"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 4", "12"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 5", "11"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 6", "10"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 7", "9"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 8", "8"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 9", "7"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 10", "6"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 11", "5"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 12", "4"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 13", "3"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 14", "14"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Brick 15", "15"));
                state.Relations.Add(new Tuple <string, string, string>("Board", "Blank", "16"));
            }
                                             ).AssignGoal(
                new Goal("Solve Puzzle").RelationalTarget("Board", "Brick 15", "16")
                );

            // Todo: write custom goal that uses Manhattan Distance
            var cg  = new CustomGoal().AssignGoal(delegate(State x) { return(0.0); });
            var cg2 = new CustomGoal().AssignGoal(state => { return(0.0); });

            //puzzle.State.PlanningActions[0].Execute(puzzle.State);

            IPlan p = new DFSPlan().SetMaxSearchDepth(10);

            p.Search(puzzle.State, puzzle.Goal);

            Assert.GreaterOrEqual(puzzle.Goal.Fulfillment(p.GetFinalState()), 1.0);
        }