Итак, на 7-м семестре Btech-CSE меня зачислили на курс искусственного интеллекта. Я был немного взволнован, чтобы узнать модные вещи, происходящие.

ИИ (причудливый термин) — это не что иное, как алгоритмы, манипулирование алгоритмами.

В качестве первого шага к изучению ИИ нам поручили создать наивную логику для задачи о кувшине с водой.

Проблема

Есть два кувшина объемом A литр и B литр. Теперь нам нужно проследить все возможные пути последующего перелива воды, чтобы в кувшине A получилось x литра воды. Предполагая, что у нас есть неограниченный запас воды.

Наконец, нам нужно найти оптимальный путь к целевому состоянию. x литров воды в кувшине A.

Подход

Итак, я следовал динамическому подходу к решению. Динамический подход — это разновидность стратегии «разделяй и властвуй». В этом подходе мы разделяем задачу на разные подзадачи, затем вычисляем их по отдельности и, наконец, сохраняем выходные данные этих подзадач, чтобы предотвратить повторные вычисления, экономя чертовски много времени.

Итак, я сначала попытался сделать так, чтобы все возможные комбинации генерировались из одного состояния. Нравится,

// Assuming we have A = 5 and B = 4
{(3,3)} : {(0,3), (3,0), (5,1), (2,4), (5,3), (3,4)}

Я создал класс для выполнения этой операции.

После этого я попытался создать дерево, в котором корневой узел — это наше начальное состояние, а его дочерние состояния или производные состояния — это состояния, созданные классом, который я создал ранее. Затем-после рекурсивное получение каждого дочернего узла и создание всего дерева (подход поиска с помощью дыхания).

Примечание. Я следовал шаблону, что узел атрибута x и имени y на определенном уровне дерева отличается от узла атрибута x и имени y на любом другом уровне или ветви (аналогичное состояние может возникнуть часто).

Поскольку в этой рекурсивной функции нет точки остановки, мы должны остановить ее выполнение после определенной итерации, я выбрал 256, что генерирует ~ 1500 состояний.

Пути печати

Теперь, после того, как мы сгенерировали наше дерево, мы должны пройти по нему и вывести весь путь, который ведет к нашему целевому состоянию (здесь это [0,2]).

  1. Граф проходится по индексу до тех пор, пока не будет достигнут нужный узел.
  2. Теперь, когда желаемый узел достигнут, этот узел возвращается к начальному узлу или root node, и печатается путь, пройденный при возврате узлов.
  3. Для каждого экземпляра нужного узла печатается этот путь.

Ссылка на Github для решения