Где он рассказал об одной из своих целей, которая привела в профессию – желанию познать принцип работы и научиться создавать самому игровых ботов.
А ведь действительно, именно желание создать совершенный искусственный интеллект, будь то игровая модель или мобильная программа, сподвигла на путь программиста многих из нас. Проблема в том, что за тоннами учебного материала и суровой действительностью заказчиков, это самое желание было заменено простым стремлением к саморазвитию. Для тех, кто так и не приступил к исполнению детской мечты, далее краткий путеводитель по созданию настоящего искусственного разума.
Когда мы говорим о создании хотя бы простых ботов, глаза наполняются блеском, а в голове мелькают сотни идей, что он должен уметь делать. Однако, когда дело доходит до реализации, оказывается, что ключом к разгадке реальной модели поведения является...математика. Если быть немного конкретнее, то вот список её разделов, которые необходимо проштудировать хотя бы в формате университетского образования:
Линейная алгебра;
Теория графов;
Теория вероятностей и математическая статистика.
Это тот научный плацдарм, на котором будут строится ваше дальнейшее программирование. Без знания и понимания этой теории все задумки быстро разобьются о взаимодействие с человеком, ведь искусственный разум на самом деле не больше, чем набор формул.
Когда спесь немного сбита студенческой литературой, можно приступать к изучению языков. Бросаться на LISP или другие пока не стоит, для начала надо научиться работать с переменными и однозначными состояниями. Как для быстрого изучения, так и дальнейшего развития прекрасно подойдёт , но в целом можно взять за основу любой язык, имеющий соответствующие библиотеки.
Теперь переходим непосредственно к теории ИИ. Их условно можно разделить на 3 категории:
Слабый ИИ – боты, которых мы видим в компьютерных играх, или простые подручные помощники, вроде Siri. Они или выполняют узкоспециализированные задачи или являются незначительным комплексом таковых, а любая непредсказуемость взаимодействия ставит их в тупик.
Сильный ИИ – это машины, интеллект которых сопоставим с человеческим мозгом. На сегодняшний день нет реальных представителей этого класса, но компьютеры, вроде Watson очень близки к достижению этой цели.
Совершенные ИИ – будущее, машинный мозг, который превзойдёт наши возможности. Именно об опасности таких разработок предупреждают Стивен Хоккинг, Элон Маск и кинофраншиза «Терминатор».
Естественно, начинать следует с самых простых ботов. Для этого вспомните старую-добрую игру «Крестики-нолики» при использовании поля 3х3 и постарайтесь выяснить для себя основные алгоритмы действий: вероятность победы при безошибочных действиях, наиболее удачные места на поле для расположения фигуры, необходимость сводить игру к ничьей и так далее.
Как вы поняли даже из названий, это API, которые позволят без лишних затрат времени создать некоторое подобие серьёзного ИИ.
Теперь же, когда вы уже вполне ясно представляете, как ИИ создавать и чем при этом пользоваться, пора выводить свои знания на новый уровень. Во-первых, для этого потребуется изучение дисциплины, которое носит название «Машинное обучение» . Во-вторых, необходимо научиться работать с соответствующими библиотеками выбранного языка программирования. Для рассматриваемого нами Python это Scikit-learn, NLTK, SciPy, PyBrain и Nump. В-третьих, в развитии никуда не обойтись от
Вы когда-нибудь задумывались о том, насколько просто написать свой искусственный интеллект, который сам будет принимать решения в игре? А ведь это действительно просто. Пусть для начала он принимает случайные решение, но позже вы можете его воспитать, научить анализировать ситуацию, и тогда он станет принимать осознанные решения. В этой статье я расскажу, как я писал своего бота, а также покажу, как вы за несколько минут можете написать своего. Наш компьютер будет играть в клон игры Трон , а точнее в ту часть, где нужно на мотоцикле победить врагов.
Под катом gif-файлов мегабайт на 10.
Когда я решил написать бота, я понятия не имел, как это можно сделать. Я попробовал очень простой код:
BotSocket.prototype.update = function() {
var r = Math.random();
if (r > 0.95) {
this.control({"button": "right"});
} else if (r >
Поведение было примерно таким:
Я смотрел на него и испытывал большую радость, мне казалось, что он теперь самостоятельный. Казалось, что он сам ищет попытки выжить, бьётся там, как живой. Трогательное зрелище.
Но хотелось, чтобы он жил как можно больше. Я стал искать информацию о том, как пишут ИИ к играм. Нашел статьи , которые описывали разные подходы. Но я искал что-то чрезвычайно простое. Я нашел на хабре в одной из статей про бота для игры вроде Zuma упоминание волнового метода . Он же алгоритм Ли. Мне он показался очень простым и подходящим. Это алгоритм поиска кратчайшего пути из одной точки в другую по полю, где клетки могут быть либо свободными, либо занятыми. Суть простая. Мы начинаем из точки назначения, присваиваем ей значение 1 и помечаем все соседние свободные клетки цифрой на единицу больше. Затем берём все соседние свободные помеченных и снова помечаем на единицу больше. Так расширяемся на всё поле, пока не дойдем до точки назначения. А путь строим поиском из соседних по уменьшению числа, пока не дойдем до 1. Я смотрел алгоритмы поиска кратчайших путей в графах, но этот мне показался наиболее подходящим.
Я перенёс алгоритм копипастой из страницы в вики, дал ему имя BotSocket.prototype.algorithmLee . Для поля я создал сначала объект battleground , в котором при каждом обновлении помечал занятые точки с их координатами. А в алгоритме Ли сводил это поле к такому же, но с шагом 1.
Нужно было как-то определять точку назначения. Я решил выбирать её случайно через определенные интервалы времени. Сделал метод для поиска случайной свободной точки на поле:
BotSocket.prototype.getDesiredPoint = function() {
var point = ;
var H = Object.keys(this.battleground).length - 1;
var W = Object.keys(this.battleground).length - 1;
var x, y, i, j;
var found = false;
var iter = 0;
do {
i = this.getRandomInt(1, W);
j = this.getRandomInt(1, H);
x = i * this.moveStepSize;
y = j * this.moveStepSize;
if (this.battleground[x][y] === this.BG_EMPTY) {
found = true;
}
iter++;
} while (!found && iter < 100);
point = ;
return point;
};
Теперь я мог переписать update:
BotSocket.prototype.update = function() {
if (!this.desiredPoint || this.movements % this.updDestinationInterval === 0) {
this.desiredPoint = this.getDesiredPoint();
}
if (!this.desiredPoint) {
return;
}
var currentPoint = ;
var path = this.algorithmLee(currentPoint, this.desiredPoint);
if (path && typeof path !== "undefined") {
this.moveToPoint(path);
} else {
this.desiredPoint = this.getDesiredPoint();
}
};
Здесь упоминается метод moveToPoint
, который поворачивает, если нужно, чтобы достигнуть первую точку из кратчайшего пути с учётом текущего направления.
Позже я решил сделать ботов более агрессивными и вместо случайной желаемой точки, я искал точку впереди врагов, чтобы перекрыть им путь. Или чтобы они не играли так долго сами с собой.
Долго думая, я понял, что дело в задержке. Бот отправлял команду поворота, но она доходила после обновления его позиции на сервере, отчего он часто не мог попасть на прямой путь к желаемой точке. Но я хотел нормального бота на клиентской стороне. Поэтому решил учитывать задержку. Для этого написал снова расширение BotSocket. Статья получается длинной, так что опишу основные решения. Перед вызовом алгоритма Ли вместо текущей точки я подставлял прогнозируемое положение с учетом текущего положения и направления, а так же множителя задержки. Множитель задержки – это число, во сколько раз превосходит задержка частоту обновления положения на сервере. Предсказание будущей точки мне еще понадобилось в методе moveToPoint() .
Предсказание работало, если играл один. Но если были другие участники, то бот не учитывал это и направлял туда, где через некоторое время уже проехал другой игрок. Для решения этой проблемы я изменил метод, который помечает клетки поля занятыми. Я стал их помечать занятыми в некотором радиусе движения мотоциклов. Радиус зависит от множителя задержки.
Предварительно я снабдил бота функциями отладки, который рисовали на поле желаемую точку и занятые точки. Моя версия клиентского бота с учетом задержки теперь двигается так:
Мой красненький, остальные серверные.
Если вы определились с методом ввода вашего кода, попробуйте переопределить методы класса BotSocket
. Для начала самое простое:
BotSocket.prototype.update = function() {
var r = Math.random();
if (r > 0.95) {
this.control({"button": "right"});
} else if (r > 0.90) {
this.control({"button": "left"});
}
}
После этого пересоздайте объект botSocket, введя
botSocket = null;
При этом код на странице сам пересоздаст и заполнит объект. Этим вы измените стандартное поведение бота на случайное. А дальше уже дело для вашей фантазии или глубоких знаний.
Вы так же можете подключить скрипт моего улучшенного бота с учетом задержки, вставив в url для бота https://raw.github.com/rnixik/tronode-js/master/public/javascripts/MyBotSocketClient.js
Если у вас нет под рукой node.js, вы можете воспользоваться развернутыми мной приложениями:
1) tronode.livelevel.net - самая дешевая VPS на DigitalOcean,
2) tronode-js.herokuapp.com - бесплатная виртуальная единица на Heroku.
Первый, скорее всего, первым может не справиться с нагрузкой, а второй на некоторых компьютерах сбрасывает socket.io-транспорт в xhr-polling, из-за этого игра очень сильно лагает.
Если вы хотите узнать больше, о том, как я программировал игровую логику, то можете прочитать . Там же о развертке node.js и немного о графической части.
Если у вас нет аккаунта на хабре, то задать вопросы или прислать свои интересные предложения можете мне на почту [email protected].
Теги: Добавить метки
Данное словосочетание звучит фантастически - программа искусственный интеллект и даже в голову не укладывается, что каким-то программным инструментом можно заставить систему логически выражаться. Но прогресс не стоит на месте, эволюционный подход к искусственному интеллекту. Мы уже можем убедиться в данной фантастике на практике. Хорошо, что, создали программисты пока искусственный интеллект. Слышали ли вы когда-нибудь о программе С программой искусственного интеллекта Говорун 3.15 можно узнать интеллектуальные способности компьютера на сегодняшний день. Так же можно увидеть, что эти способности могут развивается. Фактически можно просто общаться со своим персональным компьютером благодаря данной программе. Можно даже приучить выполнять некоторые простые, но полезные задачи, например: сообщить вам через устройство вывода звука динамики о новом сообщении или напоминании о важной дате в тот момент, когда вы пьете кофе или заняты работой. Но основная задача которую выполняет программа Говорун 3.15 это пусть и искусственный, но диалог и очень увлекательный диалог, удивляются даже скептики. Поиграйте с искусственным интеллектом. Вы убедитесь в этом сами.
Кроме того, программа искусственный интеллект постоянно развивается, чем больше Вы будете общаться, тем богаче будет словарный запас у программы. Важно в данной программе не использовать нецензурные выражения. Не нормативная лексика со временем может быть использована против Вас. По этой причине, что все диалоги и слова сохраняются в базе программы, которыми владеет интеллект, благодаря чему растет ее интеллект и словарный запас. Используя этот момент, вы можете учить свою программу интеллектуально разговаривать за счет ведения красивого диалога с ней. Но у программы есть и своя база, в которой хранится немало важных советов на разные темы, а также присутствуют афоризмы и анекдоты, так что не думайте, что Вам придется учить программу алфавиту в некоторых случаях программа и сама Вас научит, или, по крайней мере, даст хороший совет. Теперь вы можете узнать больше об искусственном интеллекте. Программа Говорун 3.15 очень приятное удовольствие. Ее интеллект, от которого сложно отвыкнуть фактически превращает компьютер в живое существо, которое станет вам честным другом. Программа друг человека, который не только выслушает Вас в любую минуту и даст хороший совет, но и станет выполнять простые, но полезные задачи при работе за ПК. Говорун 3.15 будет работать у вас секретарем в компьютере. Умеет оповещать напоминания, новые сообщения, подскажет время, переведет слово на иностранный язык вслух и другое.
Искусственный интеллект, созданный с помощью компьютерных программ, каждый пользователь встречал в компьютерных играх. Например, играя в шахматы компьютер, анализирует комбинации игрока и по своему алгоритму делает свой следующих ход. В играх искусственным интеллектом наделяют всех противников пользователя. На сегодняшний день компьютерные технологии позволяют с помощью искусственного интеллекта общаться с программами. А сам программный интеллект способен развиваться и усовершенствовать свои функции на практике. Одним словом сегодня программы способны эволюционировать.
Начнем из самого простого примера. ChatMaster - программа с искусственным интеллектом умеет разговаривать с человеком с помощью чата. Главной особенностью на первый взгляд простой программы – самообучение. Чем больше вы общаетесь с программой, тем более растет ее словарный запас и умение подстрагиваться под собеседника при ведении диалога. Автор программы утверждает, что ему удалось создать программную модель человеческого мышления.
При начале работы программа может показаться «слабенькой». Но причина в том, что ее после первого запуска не стоит сразу тестировать на уровень интеллекта и сообразительности. Сначала к программе следует относиться как к 12-ти летнему ребенку, который через несколько часов будет общаться на уровне своего собеседника. Для этого словарный запас программы должен вырасти до с 3000 до 10 000 слов. После чего впечатление от работы с программой превышает все ожидания.
Невооруженным глазом заметно, что программа запоминает не только слова а и лингвистическую реакцию собеседника на поставленные фразы. При желании, можно корректировать ответы программы на свои варианты с помощью принудительного обучения. В этом же режиме можно запрещать запоминать отдельные фразы, введенные с опечатками. При желании можно экспортировать базы и обмениваться с друзьями для более быстрого обучения (при активном импорте / экспорте не забывайте делать резервные копии). В целом логика в программе хоть и своеобразная, но она есть и весьма развитая.
Очень интересное программное решение в области искусственного интеллекта предложили разработчики из A.L.I.C.E. Они хорошо разбираются в искусственном интеллекте и активно занимаются разработкой программ в данной области. Чтобы ознакомится с их разработками, было создано онлайн-приложение для общения с капитаном Кирком (Captain Kirk) в режиме реального времени. Принцип приложение построен аналогично предыдущей программе, но есть приятная особенность. Программа отвечает на все написанные ей вопросы голосом вслух. Существенным недостатком программы является возможность общения исключительно на английском языке. Подобное приложение для общения на русском найти не удалось и очень жаль, что программисты не использовали такую функцию. Ведь существуют много программ для синтеза речи, которые преобразуют текст в звуковую речь с помощью технологии SAPI5. Жаль, что у программистов не возникало желания создать альтернативную программу с поддержкой русского языка. Ведь по сути это пока еще свободная ниша.
Программа для общения с компьютером на русском языке называется – Попугай Гриша. В этой программе реализован, скорее всего, прототип искусственного интеллекта. Но задумка очень оригинальная. Дело в том, что основной отличительной чертой Попугая Гриши является возможность общения через микрофон и динамики (без использования клавиатуры).
В программе имеется дикторнонезависимый модуль распознавания речи. Именно анализ входящего звукового канала относит данную программу к искусственному интеллекту. Но, к сожалению, он способен распознать только несколько вопросов (только 46 фраз приведенные в справке). При запуске программы попугай спит. Как только вы заговорите через микрофон, он просыпается для начала диалога. Программная система распознания речи использует не информационные функции, а коммуникативные:
Категориальный словарь диалога основан на семантических примитивах. Метод распознания речи выполняется не по лингвистическому содержанию, а по определению функции высказывания. Таким образом, при голосовом распознании речи пользователя определяется речевой акт, сценарий общения и сам диалог. Поэтому при общении с программой важно не словоупотребление, а коммуникативный акт. При распознании подбираются случайные сцены. Если входной сигнал отсутствует, на протяжении некоторого времени, попугай сам провоцирует пользователя на диалог. Сценарием поведения попугая можно управлять с помощью фраз и даже менять его характер на: грустный, обидчивый, веселый.
Для мобильных технологий более активно разрабатывают и внедряют программы с искусственным интеллектом. В этом можно убедиться с краткого видео обзора программы:
Когда в 2011 году вышла новая модель «айфона», многие были поражены необычной функцией под названием Siri. Точнее будет сказать, по имени Сири, ведь программу искусственного интеллекта оснастили женской личностью. «Умная помощница» понимала человеческий голос и выполняла команды, например, «Сири, набери номер жены» или «Сири, поставь будильник на 6-30». Она могла неординарно ответить на некоторые вопросы вроде «Сири, существует ли Бог?». Для того времени это была весьма необычным. Однако, вскоре стали понятны ограничения технологии. Сири выполняла лишь самые простые команды, а в остальном была только голосовым «расширением» к интернет-поисковику, направляя запрос туда.
После смерти Стива Джобса разработчики Siri организовали новую фирму Viv Labs , которая работает над гораздо более продвинутой версией «умного помощника» по имени Вив.
В программу Viv внедряют систему самообучения и генерации программного кода на лету . В результате, должен получиться ИИ совершенно нового типа. Отвечая с центрального сервера на вопросы миллионов пользователей, постепенно сформируется некий «глобальный мозг», который поймёт любую предметную область и жаргон, свяжет любые понятия и выявит смысл любого вопроса. И, естественно, наиболее адекватно ответит на него.
Viv работает следующим образом. Получив запрос вроде «По дороге домой к брату хочу купить дешёвое вино, подходящее для лазаньи», она парсит его на части и составляет уникальную программу, которая использует разные источники информации из интернета, в том числе карту местности, базу данных магазинов, кулинарный справочник и базу цен на вина. Всё делается очень быстро, и в течение 0,05 секунды Viv выдаёт список подходящих винных лавок по дороге к брату и названия нужных вин.
Более подробно разбор этого запроса показан на схеме.
Главные принципы, которыми руководствуются разработчики: Viv должна тренироваться самостоятельно, отвечая на вопросы пользователей и должна делать это непрерывно, умнея с каждым днём. Чем больше людей общаются с «цифровым помощником» - тем быстрее растёт её база знаний. Поэтому разработчики не хотят отдавать движок какой-нибудь одной компании, а хотят лицензировать его всем желающим, чтобы доступ к ИИ был с каждого телевизора и каждого мобильного телефона.
Задача адекватного парсинга и понимания человеческого языка, конечно, сложная. Но над её решением работает не только Viv Labs. Например, недавно компания Google купила pf $500 млн фирму DeepMind, работающую примерно в той же области. Есть ещё суперкомпьютер IBM Watson и другие подобные проекты. В общем, Искусственный интеллект с постоянным самообучением может оказаться ближе, чем нам кажется.