Узнайте, как доминировать над искусственным интеллектом.
Привет, ребята! Сегодня я представляю набор базовых программ для искусственного интеллекта, которые помогут вам начать свое приключение в основах программирования искусственного интеллекта. сильный>
У меня 100-дневный челлендж. Где я каждый день решаю 1 вопрос по программированию, который был задан на предыдущих собеседованиях.
Все эти задачи взяты из следующей электронной книги. 🎓
Теперь без дальнейших прощаний,
Алгоритмы, которые мы рассмотрим:
- Неинформативный поиск
- Информированный поиск
- Апостериорная вероятность
- Байесовские сети
1) Неинформированный поиск
Цель🏹
Имея список городов с указанием их расстоянийдруг от друга, найдите кратчайшее расстояние, когда исходный и конечныйгород данный.
Вход📥
Файл данных, который будет содержать все расстояния между городами и пунктом назначения.
Выход📤
Путь, по которому нужно добраться до пункта назначения с минимальным расстоянием или затратами.
Алгоритм👩🎓
- Вставьте начальный город в очередь.
- Поместите все соседние города в очередь и отсортируйте их по расстоянию.
- Удалите первый элемент из очереди, и если узел, вставленный в состояние цели, напечатайте его и остановите программу.
- Если нет, то продолжайте повторять процесс, пока очередь не станет пустой.
Код👇
Пояснение🤩
- Функция имеет имя файла в качестве параметра, который задается при вызове функции.
- Мы используем словари по умолчанию edges, wts и edge_wtгде словарь wts имеет веса ребер в качестве ключа и значения для городов, имеющих это расстояние
- e edge_wtимеет 2 города в качестве ключа с их соответствующим расстоянием в качестве значения веса.
- В словаре ребер хранятся соседи городов.
- В input1 мы читаем входной файл и сохраняем города в src и destи расстояния между ними в wt.
- После их прочтения мы возвращаем словари 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) Информированный поиск
Прицелиться🏹
Имея список городов с указанием их расстояний друг от друга, найдите кратчайшее расстояние пути, если заданы исходный и конечный город и файл эвристического расстояния(звездочка)т. е. информированный поиск.
Ввод📥
Файл данных, который будет содержать все расстояния между городами и источником, пунктом назначения, а также другой файл данных, содержащий название города и эвристические расстояния.
Вывод📤
Путь, по которому нужно добраться до пункта назначения с минимальным расстоянием или стоимостью.
Алгоритм👨🎓
- Вставьте начальный город в очередь.
- Поместите все соседние города в очередь и отсортируйте их по расстоянию с учетом эвристических расстояний каждого города.
- Удалить из очереди первый элемент и, если вставленный узел является целевым состоянием, напечатать его и остановить программу.
- Если нет, то повторяйте процесс до тех пор, пока очередь не станет непустой.
Программа 👇
Пояснение 🕵️♀️
Функция имеет имя файла в качестве параметра, который задается при вызове функции.
Мы используем словари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.
Алгоритм👨🎓
- Поместите начальный город в очередь.
- Поместите все его соседние города в очередь и отсортируйте их по расстоянию с учетом эвристических расстояний каждого города.
- Удалите из очереди первый элемент и, если вставленный узел является целевым состоянием, распечатайте его и остановите программу.
- Если нет, то повторяйте процесс до тех пор, пока очередь не станет пустой.
Программа 👇
Объяснение🕵️♀️
- Последовательно мы сохраняем последовательность, которую пользователь вводит через командную строку, и сохраняем ее длину в 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.
Предыдущие записи в блоге