В проекте 1 искусственного интеллекта Nanodegree мы используем такие методы, как распространение ограничений и поиск в глубину, для решения головоломок судоку. Я предполагаю, что каждый, кто читает этот пост, понимает правила судоку - если нет, не волнуйтесь, я не был полностью знаком с игрой до проекта. Большая часть этого кода для проекта была предоставлена Udacity, поэтому в этот пост я не буду включать фрагменты кода. Весь мой код можно найти на GitHub здесь.
Настройка и кодирование платы
Первая задача проекта - назначить переменные и написать функции, которые могут кодировать плату. Короче говоря, цель состоит в том, чтобы написать функцию, которая может принимать ввод из 81 символа и сохранять значение столбца / строки и поля в словаре Python. Например,
Input: ..3.2.6..9..3.5..1..18.64….81.29..7.8..67.82.26.95..8..2.3..9..5.1.3.., Output: {'A1':'.','A2':'.','A3':'3','A4':'.','A5':'2',....}
К счастью, в проекте предусмотрена функция, которая отображает доску судоку, как только мы ее правильно закодируем.
. . 3 |. 2 . |6 . .
9 . . |3 . 5 |. . 1
. . 1 |8 . 6 |4 . .
------+------+------
. . 8 |1 . 2 |9 . .
7 . . |. . . |. . 8
. . 6 |7 . 8 |2 . .
------+------+------
. . 2 |6 . 9 |5 . .
8 . . |2 . 3 |. . 9
. . 5 |. 1 . |3 . .
Следующим шагом является присвоение значения полям, имеющим нечисловое значение. В частности, замените все поля, содержащие "." На "123456789".
Ограничение распространения
Распространение ограничений - это метод удовлетворения ограничений, который сокращает пространство поиска за счет использования локальных ограничений. Как упоминалось в первом абзаце, мы собираемся реализовать поиск в глубину, поэтому уменьшение размера поиска очень важно для быстрого и эффективного решения головоломок. В этом проекте судоку каждая коробка имеет ограничения (я думаю, что это правила), которые могут привести нас к решенной головоломке судоку.
Ограничение: устранение
Согласно правилу судоку, поле не может иметь то же значение, что и одно из его сверстников (другие квадраты в его квадрате, строке и столбце 3x3). Мы можем начать использовать это правило в качестве ограничения и исключить возможности с помощью полей со значением «123456789».
Написание функции для этого ограничения мгновенно уменьшает значения на доске (см. Ниже).
Input:
. . 3 |. 2 . |6 . .
9 . . |3 . 5 |. . 1
. . 1 |8 . 6 |4 . .
------+------+------
. . 8 |1 . 2 |9 . .
7 . . |. . . |. . 8
. . 6 |7 . 8 |2 . .
------+------+------
. . 2 |6 . 9 |5 . .
8 . . |2 . 3 |. . 9
. . 5 |. 1 . |3 . .
Output:
45 4578 3 | 49 2 147 | 6 5789 57
9 24678 47 | 3 47 5 | 78 278 1
25 257 1 | 8 79 6 | 4 23579 2357
---------------------+---------------------+---------------------
345 345 8 | 1 3456 2 | 9 34567 34567
7 123459 49 | 459 34569 4 | 1 13456 8
1345 13459 6 | 7 3459 8 | 2 1345 345
---------------------+---------------------+---------------------
134 1347 2 | 6 478 9 | 5 1478 47
8 1467 47 | 2 457 3 | 17 1467 9
46 4679 5 | 4 1 47 | 3 24678 2467
Очевидно, что этот метод не сводит значения всех ящиков к единственной возможности, поэтому мы должны использовать другие стратегии.
Ограничение: единственный выбор
Чтобы уменьшить возможные комбинации каждого блока, мы используем только стратегию выбора в качестве ограничения. Эта стратегия работает путем поиска ящиков с возможной комбинацией, которые не видны другим узлам.
Третье поле в третьем столбце содержит [1,4,7]. Наблюдая за другими квадратами в квадрате 3x3, вы можете заметить, что ни один из них не имеет возможности 1. Следовательно, третье поле в столбце 3 должно быть равно 1.
Теперь мы можем использовать исключение и итеративно использовать только выбор для решения головоломки судоку. Чтобы быстро и эффективно решить головоломку, мы применяем поиск в глубину.
Поиск
В этом проекте мы использовали поиск в глубину, чтобы решить головоломку судоку. Этот алгоритм поиска использует уменьшенный размер головоломки, возвращаемой методом исключения и единственного выбора, а затем перебором последних возможностей.
Udacity предоставляет отличные изображения для визуализации поиска в глубину. С помощью этой техники поиска мы, по сути, перебираем все ограниченные возможности решения головоломки судоку (начиная с ящиков с наименьшим количеством возможностей).
Ограничение: Обнаженные близнецы
Одним из требований проекта 1 было реализовать стратегию судоку «голые близнецы». Более конкретно, когда блок имеет две возможные комбинации и разделяет те же возможные комбинации с другим одноранговым узлом (отсюда голые близнецы), любое из этих значений комбинации может быть удалено из других одноранговых узлов. В приведенной ниже головоломке два партнера имеют и разделяют две одинаковые возможные комбинации [2,3].
Стратегия «голых близнецов» позволяет нам исключить 2 и 3 из других сверстников в этой колонке.
Вывод
Этот проект был приятным и довольно простым. Было приятно, что Udacity предоставил несколько обучающих колес (некоторые полные функции были предоставлены заранее). Если вы хотите ознакомиться с исходным кодом, посетите мою страницу на Github здесь.