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); } }
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; }
private LinkedList <GangStateNode> FindPath(GangStateNode solution) // восстанавливаем путь от найденого состояния до начального { LinkedList <GangStateNode> path = new LinkedList <GangStateNode>(); while (solution != null) { path.AddFirst(solution); solution = solution.Parent; } return(path); }
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; // если не нашлась, увеличиваем глубину } }
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); }
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(); }
public GangStateNode(GangStateNode parent) { Parent = parent; }