Узнайте, как доминировать над искусственным интеллектом.

Привет, ребята! Сегодня я представляю набор базовых программ для искусственного интеллекта, которые помогут вам начать свое приключение в основах программирования искусственного интеллекта. сильный>

У меня 100-дневный челлендж. Где я каждый день решаю 1 вопрос по программированию, который был задан на предыдущих собеседованиях.

Все эти задачи взяты из следующей электронной книги. 🎓

Теперь без дальнейших прощаний,

Алгоритмы, которые мы рассмотрим:

  1. Неинформативный поиск
  2. Информированный поиск
  3. Апостериорная вероятность
  4. Байесовские сети

1) Неинформированный поиск

Цель🏹

Имея список городов с указанием их расстоянийдруг от друга, найдите кратчайшее расстояние, когда исходный и конечныйгород данный.

Вход📥

Файл данных, который будет содержать все расстояния между городами и пунктом назначения.

Выход📤

Путь, по которому нужно добраться до пункта назначения с минимальным расстоянием или затратами.

Алгоритм👩‍🎓

  1. Вставьте начальный город в очередь.
  2. Поместите все соседние города в очередь и отсортируйте их по расстоянию.
  3. Удалите первый элемент из очереди, и если узел, вставленный в состояние цели, напечатайте его и остановите программу.
  4. Если нет, то продолжайте повторять процесс, пока очередь не станет пустой.

Код👇

Пояснение🤩

  1. Функция имеет имя файла в качестве параметра, который задается при вызове функции.
  2. Мы используем словари по умолчанию edges, wts и edge_wtгде словарь wts имеет веса ребер в качестве ключа и значения для городов, имеющих это расстояние
  3. e edge_wtимеет 2 города в качестве ключа с их соответствующим расстоянием в качестве значения веса.
  4. В словаре ребер хранятся соседи городов.
  5. В input1 мы читаем входной файл и сохраняем города в src и destи расстояния между ними в wt.
  6. После их прочтения мы возвращаем словари edge и edge_wt.

Расчет

Пояснение 🕵️‍♂️

Мы добавляем src с Dist 0 в list fifo и его родительский элемент как None с Dist 0 вместе с его дочерним элементом в parent list. .

Цикл while выполняется до тех пор, пока список FIFO не станет пустым.

  • Стоимость и название города хранятся в переменных cost1 и node1, а переменная count увеличивается.
  • Если узел 1 совпадает с целью, отображается количество и расстояние от списка FIFO.
  • Мы сортируем родительский список в соответствии с расстояниями.
  • Текущий узел добавляется в список parent1.
  • В противном случае мы извлекаем первый элемент из списка FIFO.
  • Если узел отсутствует в списке посещенных, используйте цикл for, чтобы просмотреть словарь ребер с node1 в качестве ключа, и в результатах сохраните расстояние между node1 и I в for цикл для словаря edge_wt в качестве ключа, имеющего Dist в качестве значения.
  • Затем вычисляем общую стоимость, беря cost1 из node1 и списка результатов и добавляя их в список FIFO, а также в родительский список.
  • Сортировка списка fifo так, чтобы сначала взять минимальное расстояние, а затем добавить узел в список посещенных.

Пояснение

В командной строке первым аргументом должны быть введенные имя файла,город источника и город назначения.

Вызов storage_input(имя файла)

Затем вызов ucs() с src, dest и edges , edge_wt в качестве параметров, возвращаемых из storing_input().

2) Информированный поиск

Прицелиться🏹

Имея список городов с указанием их расстояний друг от друга, найдите кратчайшее расстояние пути, если заданы исходный и конечный город и файл эвристического расстояния(звездочка)т. е. информированный поиск.

Ввод📥

Файл данных, который будет содержать все расстояния между городами и источником, пунктом назначения, а также другой файл данных, содержащий название города и эвристические расстояния.

Вывод📤

Путь, по которому нужно добраться до пункта назначения с минимальным расстоянием или стоимостью.

Алгоритм👨‍🎓

  1. Вставьте начальный город в очередь.
  2. Поместите все соседние города в очередь и отсортируйте их по расстоянию с учетом эвристических расстояний каждого города.
  3. Удалить из очереди первый элемент и, если вставленный узел является целевым состоянием, напечатать его и остановить программу.
  4. Если нет, то повторяйте процесс до тех пор, пока очередь не станет непустой.

Программа 👇

Пояснение 🕵️‍♀️

Функция имеет имя файла в качестве параметра, который задается при вызове функции.

Мы используем словариedges, wts и edge_wt по умолчанию, где словарь wts имеет веса ​​ребер в качестве ключа, а значение — это города, находящиеся на этом расстоянии.

edge_wt имеет 2 города в качестве ключа с их соответствующим расстоянием в качестве веса его значения.

В словаре ребер хранятся соседние города.

В input1 мы читаем входной файл и сохраняем города в src и dest и расстояния между ними в wt.

После их чтения мы возвращаем словари edge и edge_wt.

Объяснение

Функция имеет filename1 в качестве параметра, который задается при вызове функции.

Мы используем эвристический список. filename1 читается до тех пор, пока слово END не будет прочитано. Затем строки разбиваются на название города и расстояние до целевого состояния, которое добавляется к эвристическому списку.

Эта функция возвращает эвристический список.

Пояснение

Функция имеет исходный город, целевой город, словарь ребер, словарь edge_wt и эвристический список в качестве параметров.

Цикл for длится до длины эвристического списка, и если исходный город соответствует названию города в эвристическом списке, мы добавляем его в fifo список эвристического расстояния, расстояния и исходного города. имя, а в родительском списке — расстояние до города,расстояние, имя родителя и название исходного города. Затем мы выходим из цикла, используя break.

Цикл while выполняется до тех пор, пока список FIFO не станет пустым.

  • Стоимость и название города хранятся в переменных cost1 и node1, а переменная count увеличивается.
  • Если узел 1 совпадает с целью, отображается количество и расстояние от списка fifo.
  • Сортируем родительский список по расстояниям.
  • Текущий узел добавляется в список parent1.
  • В противном случае мы извлекаем первый элемент списка fifo.

Если узел отсутствует в списке посещенных, используйте цикл for для просмотра словаря ребер с node1 в качестве ключа.

Другой цикл for j соответствует длине эвристического списка, и если i в ребрах[node1]словарь совпадает с городом в эвристическом списке (heuristic[j][0]), то результаты переменная хранит расстояние между node1 и i в цикле for для словаря edge_wt как ключ, значением которого является расстояние.

Затем вычислите total_cost1, взяв сумму cost1 из узла, списка результатов и эвристического списка.

Точно так же вычисление total_cost2 путем получения суммы cost1 и списка результатов.

Затем добавьте total_cost1, total_cost2andi в список fifo и родительский список с добавлением node1 в родительском списке. Затем мы выходим из цикла с помощью оператора break.

Сортировка списка fifo, чтобы сначала взять минимальное расстояние, а затем добавить узел в посещенный.

Пояснение

В командной строке первым аргументом должно быть имя входного файла, исходный город, город назначения и эвристическое имя файла.

Вызов storage_input(имя файла) и sotring_input2(имя файла1)

Затем вызов astar()с src, dest, edges , edge_wt и heristic list в качестве параметров, возвращаемых из storing_input() и storeing_input2().

3) Апостериорная вероятность

Прицелиться🏹

Чтобы определить апостериорную вероятность различных гипотез, учитывая априорные значения для этих гипотез и данную последовательность наблюдений, и определить вероятность того, что следующее наблюдение будет определенного типа, априорные значения для различных гипотез и заданную последовательность наблюдений.

Пять возможных гипотез для нашей сумки:

  • h1 (ранее: 10%). Пакеты этого типа содержат 100 % вишневых конфет.
  • h2 (ранее: 20%): пакет этого типа содержит 75% вишневых леденцов и 25% лаймовых конфет.
  • h3 (ранее: 40%).Этот пакет содержит 50% вишневых леденцов и 50% лаймовых конфет.
  • h4 (ранее: 20%):пакет этого типа содержит 25% вишневых леденцов и 75% лаймовых конфет.
  • h5 (ранее: 10%):Этот пакет содержит 100 % лаймовых леденцов.

Ввод📥

Строка, представляющая последовательность конфет, которые мы уже выбрали. C должен быть для вишневого леденца и L для лаймового леденца.

Вывод📤

Вероятность каждой гипотезы при заданной последовательности и вероятность того, что следующая конфета будет выбрана при заданной последовательности, будут записаны в файл result.txt.

Алгоритм👨‍🎓

  1. Поместите начальный город в очередь.
  2. Поместите все его соседние города в очередь и отсортируйте их по расстоянию с учетом эвристических расстояний каждого города.
  3. Удалите из очереди первый элемент и, если вставленный узел является целевым состоянием, распечатайте его и остановите программу.
  4. Если нет, то повторяйте процесс до тех пор, пока очередь не станет пустой.

Программа 👇

Объяснение🕵️‍♀️

  • Последовательно мы сохраняем последовательность, которую пользователь вводит через командную строку, и сохраняем ее длину в lseq.
  • p_cc и Prior — это вероятности, заданные в самой задаче.
  • Цикл for проходит по всей длине последовательности, чтобы вычислить количество вхождений C и L.
  • Существует цикл for, который выполняется до диапазона5, так как существует 5 гипотез. Таким образом, для каждой гипотезы мы вычисляем ее апостериорную вероятность, беря значение p_cc и увеличивая его до количества C, умножая на 1-p_cc, повышая количество до L и умножая априорную вероятность 1гипотез.
  • sum1 используется для сложения всех значений. Такой же расчет выполняется для каждой гипотезы и добавляется в список, называемый апостериорным.
  • Открываем файл result.txt в режиме записи. В цикле for с длиной апостериорного числа мы делим все его элементы на sum1, чтобы получить вероятность, и записываем ее в файл.
  • Для вычисления вероятности следующей конфеты снова используется цикл for до длины апостериорного значения путем умножения апостериорного значения каждого наp_ccкаждого и взятия суммы этих значений, что даст >e вероятность того, что следующая конфета будет выбрана, равна C, а 1-эта сумма равна вероятности того, что следующая выбранная конфета будет равна L, что записано в файле.
  • Мы закрываем файл.

Пример

python compute_a_posteriori.py LCCCCCCCCCCCLLLLLLLLLLLLLLLLLLLLLLL
result.txt
Observation sequence: LCCCCCCCCCCCLLLLLLLLLLLLLLLLLLLLLLL with length: 35
P(h1|Q)=0.0
P(h2|Q)=5.0447788251e-07
P(h3|Q)=0.195698804445
P(h4|Q)=0.804300691077
P(h5|Q)=0.0

Вероятность того, что следующей конфетой, которую мы выберем, будет C, при условии Q: 0,29892495335

Вероятность того, что следующей конфетой, которую мы выберем, будет L, при условии Q: 0,70107504665

4) Байесовские сети

Проблемы легче понять с помощью пояснений и алгоритмов, которые мы предоставляем вместе с кодом. Если у вас есть какие-либо сомнения, не стесняйтесь комментировать в блоге. Хватит пытаться увеличить аудиторию :p . Давайте рассмотрим проблему.

Прицелиться🏹

Для приведенной выше Байесовской сети напишите программу, которая вычисляет и распечатывает вероятность любой комбинации событий при наличии других комбинаций.

Ввод📥

Во-первых, имеется от одного до пяти аргументов, каждый из которых определяет переменную из списка Взлом, Землетрясение, Тревога, Звонки Джона и Звонки Мэри и значение, равное true или false. Каждый из этих аргументов представляет собой строку из двух букв.

Первая буква: B (для ограбления), E (для землетрясения), A (для тревоги), J (для JohnCalls) или M (для MaryCalls).

Вторая буква – t (истина) или f (ложь).

Затем, необязательно, следует слово "данный", за которым следуют от одного до четырех аргументов. Эти последние аргументы задают комбинацию событий C2, так что нам нужно вычислить вероятность C1 при условии C2.

Вывод📤

Вероятность сочетания типов пользователей в

Программа👇

Пояснение

Импортировать деление необходимо, чтобы деление имело ответ с десятичной точкой и sys для приема ввода через командную строку.

Создание словарей для хранения значений (логическое значение true или false или пусто, т.е. -), которые пользователь вводит для соответствующих ключей, которые уже известны.

Объяснение🕵️‍♀️

  • Создан класс под названием Bayesian_network.
  • Конструктор __init__ инициализирует значения 5 переменных, рассчитанных по байесовской сети, указанной на диаграмме, и составляются два списка.
  • Функция calculateProbability() принимает 5 входных значений var, заданных пользователем. Мы создаем пустой список «l».
  • Для каждого значения переменной написано несколько условий if, чтобы проверить, пусто ли оно и нет ли в списке, а затем добавить его в список data1.
  • В противном случае, если у него есть какие-то значения, то для каждой переменной мы проверяем, является ли это значение истинным, и добавляем его в ‘l’ и 1-var_value в ‘l’, если оно ложно.
  • Если событие происходит с вероятностью x, то вероятность того, что событие не произойдет, равна 1-x.
  • Тревога имеет двух родителей Взлом и Землетрясение, поэтому в «l» мы добавляем значения в соответствии со значениями Взлома и Землетрясения.
  • MaryCallas и JohnCallsзависят от значения сигнала тревоги, поэтому к 'l' будет добавлено значение true или false. Затем используется цикл для доступа к каждому элементу списка 'l' и умножения их вместе и добавить в список 'data2'.
  • В первой переменной мы сохраняем первый элемент списка data1, а в списке 'data1' мы сохраняем элементы от второго элемента до его длины. >
  • Затем, если используются условия для проверки «первого», какое из имен переменных и внутри этого снова, если это имя переменной имеет значение true или false, и, соответственно, вызывается функция computeProbability() с отправкой этих параметров.
  • В конце возвращается список ‘data2’.

Объяснение👨‍🔧

  • Сначала мы проверяем, что длина argv равна 1, затем она недействительна и выходим из программы.
  • В противном случае, если данное есть в argv, мы получаем индекс этого слова, а в num var мы сохраняем значения от начала до index-1 и index+1 до конца. И denum мы храним значения после индекса данного до конца.
  • Создается объект bayesian_network() с именем bnet. Цикл for используется для доступа к элементам в словарях numvar и dict1, инициализированных с помощью __init__, ключи создаются с использованием item[0], а его значения — item[1] из числовая переменная.
  • Затем мы берем сумму результата, возвращенного функцией computeProbability() в n. Тот же процесс для переменной denum и сохранения приводит к d var. Затем вероятность печатается путем деления n/d.
  • В противном случае мы создаем объект класса и добавляем аргументы argv в список данных. А для элементов данных мы создаем ключи dict1 of items[0] и его значения с помощью item[1]. Вероятность представляет собой сумму значений, возвращаемых функцией computeProbability().

если __name__ == ‘__main__’:

основной(sys.argv)

Вызывает основную функцию, отправляя аргументы, введенные пользователем в командной строке.

Вывод

Не забудьте нажать кнопку подписаться✅, чтобы получать обновления, когда мы публикуем новые задачи по программированию. Расскажите нам, как вы решили эту проблему, в разделе комментариев ниже. 🔥 Мы будем рады их прочитать. ❤

Я опубликовал электронную книгу. Подборка 100 задач программирования на Java (интервью), которые были решены . (HackerRank) 🐱‍💻

Нажмите ЗДЕСЬ 🧨🎊🎃

Это совершенно бесплатно 🆓, если у вас есть подписка Amazon Kindle.

Предыдущие записи в блоге