Итак, на 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]
).
- Граф проходится по индексу до тех пор, пока не будет достигнут нужный узел.
- Теперь, когда желаемый узел достигнут, этот узел возвращается к начальному узлу или
root node
, и печатается путь, пройденный при возврате узлов. - Для каждого экземпляра нужного узла печатается этот путь.