Beispiel #1
0
        public GangStateNode DLS(GangStateNode node, int depth) // метод поиска вглубь с ограничением глубины
        {
            if (depth == 0 && node.IsSolution())                // проверяем есть ли состояние искомым, когда текущая глубина равна нулю
            {
                return(node);
            }
            else if (depth > 0)
            {
                var moves = node.GetPossibleMoves(); // высчитываем все возможные ходы из данного состояния

                foreach (var child in moves)         // рекурсивного проходим по ним до заданной глубины, проверяем на наличие искомого состояния
                {
                    if (child.Equals(node.Parent))
                    {
                        continue;
                    }
                    var result = DLS(child, depth - 1);
                    if (result != null)
                    {
                        return(result);
                    }
                    else
                    {
                        continue;
                    }
                }
                return(null);
            }
            else
            {
                return(null);
            }
        }
Beispiel #2
0
 public GangStateNode(GangStateNode parent, Side Unit1, Side SubUnit1, Side Unit2, Side SubUnit2, Side Unit3, Side SubUnit3)
 {
     Parent        = parent;
     this.Unit1    = Unit1;
     this.SubUnit1 = SubUnit1;
     this.Unit2    = Unit2;
     this.SubUnit2 = SubUnit2;
     this.Unit3    = Unit3;
     this.SubUnit3 = SubUnit3;
 }
Beispiel #3
0
        private LinkedList <GangStateNode> FindPath(GangStateNode solution) // восстанавливаем путь от найденого состояния до начального
        {
            LinkedList <GangStateNode> path = new LinkedList <GangStateNode>();

            while (solution != null)
            {
                path.AddFirst(solution);
                solution = solution.Parent;
            }

            return(path);
        }
Beispiel #4
0
        public LinkedList <GangStateNode> IDDFS(GangStateNode root) // метод поиска в глубь с итеративным углублением
        {
            int depth = 0;                                          // сначала глубина равна 0

            while (true)                                            // проходим по дереву методом ограниченного поиска вглубь, увеличивая постепенно максимальную глубину
            {
                var result = DLS(root, depth);                      // ищем методом огр. поиска вглубь нашу цель
                if (result != null && result.IsSolution())          // если она нашлась, восстанавливаем путь и возвращаем его
                {
                    return(FindPath(result));
                }
                depth += 1; // если не нашлась, увеличиваем глубину
            }
        }
Beispiel #5
0
        public override bool Equals(object obj)
        {
            if (obj == null || !(obj is GangStateNode))
            {
                return(false);
            }

            GangStateNode pairsState = (GangStateNode)obj;

            return
                (Unit1.CurrentSide == pairsState.Unit1.CurrentSide &&
                 SubUnit1.CurrentSide == pairsState.SubUnit1.CurrentSide &&
                 Unit2.CurrentSide == pairsState.Unit2.CurrentSide &&
                 SubUnit2.CurrentSide == pairsState.SubUnit2.CurrentSide &&
                 Unit3.CurrentSide == pairsState.Unit3.CurrentSide &&
                 SubUnit3.CurrentSide == pairsState.SubUnit3.CurrentSide);
        }
Beispiel #6
0
        static void Main(string[] args)
        {
            Solver solver = new Solver();                      // создаем решатор
            var    path   = solver.IDDFS(new GangStateNode()); // решаем задачу, возвращается путь

            int n = 1;

            foreach (var state in path) // выводим путь в консоль
            {
                GangStateNode nextState = state;

                Console.WriteLine(n.ToString() + " ");

                if (nextState.IsSolution())
                {
                    Console.WriteLine("Solution");
                }

                Console.WriteLine(nextState.MyToString());
                n++;
            }

            Console.ReadKey();
        }
Beispiel #7
0
 public GangStateNode(GangStateNode parent)
 {
     Parent = parent;
 }