Причина, по которой ваш код находит неоптимальное решение, заключается просто в способе работы по поиску по глубине и поиску по порядку.
При поиске по ширине будет пытаться все возможных 8-ходовых решений перед попыткой любых 9-ходовых решений, поэтому при поиске в ширину необходимо найти решение с наименьшим количеством возможных ходов.
В отличие от этого, поиск в глубину сначала попытается найти решения с 9, 10, 11, ... ходами, прежде чем он исчерпает все возможные решения с 8 ходами, и поэтому может привести к неоптимальному результату.
Например, если задано игровое дерево, которое выглядит следующим образом:
1
/ \
2 3
/ \ / \
4 5 6 7
/\ /\ /\ /\
8 9 A B C D E F
Приведенный код будет вызывать goal_test
на узлах в следующем порядке: 2, 3, 6, 7, E, F, C, D, 4, 5, A, B, 8, 9. Обратите внимание, что узлы E и F тестируются перед дочерними узлами узла 6, а также перед дочерними узлами узла 2. Это поиск в глубину.
Альтернативная версия вашего кода будет вызывать goal_test
в следующем порядке: 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Этояs поиск в первую очередь.
Редактировать: Мой плохой, мой порядок вызовов на goal_test
выше верен только для последней итерации в iterative_deepening_search
.Фактический порядок звонков на номер goal_test
составляет 2, 3, 2, 3, 6, 7, 4, 5, 2, 3, 6, 7, E, F, C, D, 4, 5, A, B,8, 9. Я проверил это, фактически запустив код, поэтому я на 100% уверен, что теперь он правильный.
Вы уверены, что значение child.state
уникально для каждого игрового узла?Если нет, алгоритм потерпит неудачу.Например, рассмотрим, что происходит, если узел 4 находится в том же состоянии, что и узел 6. В этом случае ваш код будет вызывать goal_test
для узлов в следующем порядке: 2, 3, 2, 3, 6, 7, 5, 2, 3, 6, 7, E, F, C, D, 5, A, B. Обратите внимание, что goal_test
это , никогда не вызывается на узлах 4, 8 и 9.
Но если мыпереключитесь на альтернативную версию вашего кода, тогда вызывается goal_test
в следующем порядке: 2, 3, 2, 3, 4, 5, 7, 2, 3, 4, 5, 7, 8, 9, A, B,E, F. Теперь goal_test
не вызывается на узлах 6, C и D!Я считаю, что это может быть причиной вашей проблемы.