Применение конечных автоматов для моделирования поведения

Использование автоматов для эмулирования жизни

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

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

Рисунок 1 - Поведение змейки

Охота змеи состоит из нескольких основных задач: найти добычу, выследить, дождаться подходящего момента и напасть. Если жертва смогла спастись, то змея ищет новую жертву. Как видно на рисунке 1, то ничего сложного в поведении змеи нет, она просто ходит, ищет жертву, а в нужный момент нападает, то есть все ее действия следуют определенным правилам поведения и происходят в определенном порядке — это и есть главное преимущество конечных автоматов.

Усложним задачу змее: пусть она может на своем пути встретить не только жертву, но и врага, которого она не в состоянии одолеть. В таком случае змея должна будет убегать от врага. Змея может встретить врага в любой момент времени, когда находится в одном из следующих состояний: «поиск добычи», «выслеживание», «отправиться домой». Важно понимать, что если змея находилась в состоянии «выслеживания добычи», то добыча скрывается из виду, и змее придется вернуться к поиску добычи. Если в состоянии «поиск добычи», то змее все равно придется вернуться к поиску цели. Если змея отправлялась домой, то ей нет необходимости после ухода от врага возвращаться к поиску добычи, и змея просто пойдет дальше домой. Изобразим изменения на рисунке:

Рисунок 2 - Усложнение действий в поведении змейки

Казалось бы, ничего существенно не поменялось. Однако перед программистом, который решил сымитировать жизнь змеи, встала огромная проблема. Теперь из состояния «убежать от врага» змея может попасть сразу в 2 состояния: «поиск добычи» или «отправиться домой». Как было сказано ранее, змее надо отправиться домой, если она уже была в пути домой; в противном случае ей надо продолжать охотиться. Для решения таких задач были придуманы конечные автоматы, основанные на стеке.

Такой конечный автомат позволяет положить в стек все незавершенные действия, а переходы будут возникать при добавлении или удалении состояний из общего стека. Например, змея отправлялась домой, как вдруг ей пришлось убежать от врага, тогда она запоминает свое состояние «отправиться домой» (то есть кладет его в стек) и начинает выполнять действие «убежать от врага». При завершении своего текущего действия, змея возьмет из стека последнее действие и начнет его выполнять. Вот как это выглядит:

Рисунок 3 - Пример стека состояний змеи

Рассмотрим теперь более детально жизнь змеи: пусть помимо охоты змея также может выходить на разведку территории из своего дома. Тогда перед тем, как выйти куда-либо автомат, моделирующий поведение змеи, будет выглядеть примерно так:

Рисунок 4 - Пример усложненного графа состояний змеи

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

Так мы увидели, что большая задача может быть разбита на несколько более мелких конечных автоматов, где каждый автомат (не нижнего уровня) может содержать в себе в качестве состояний другие автоматы. Автоматы нижнего уровня не могут ссылаться на другие автоматы, так как это может вызвать бесконечную рекурсивную последовательность вызова состояний в стеке.

Сети Петри

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

Приведем простой пример, для того чтобы понять устройство сетей. Представим, что человек возвращается домой с работы и не хочет терять время на приготовление еды. Лучшим способом будет заказать еду в каком-либо магазине. Также представим, что человек захочет заехать в магазин по пути домой. Садясь в машину, человек может позвонить в службу доставки еды, а затем в навигаторе указать номер ближайшего магазина. В таком случае решение задачи “заказать еду” и “съездить в магазин” может быть записано в виде автомата:

Рисунок 5 - Пример простого автомата выбора человека

Однако человек может звонить в службу доставки еды и параллельно искать нужный магазин в навигаторе. Тогда человек сможет сэкономить время и быстрее добраться домой. Человек не может поехать, пока он не выполнит все нужные действия. Как раз такую ситуацию можно показать с помощью Сети Петри. Две задачи будут вершинами сети, а переход фишки из одного состояния в другое будет организован функцией завершения действия. Наглядно это будет выглядеть так:

Рисунок 6 - Сеть Петри действий человека

Сейчас многие простые чат-боты моделируют решение задач средствами обычных автоматов, тем самым такие боты могут решать простые человеческие задачи по типу: “найти подходящий фильм по нескольким вопросам”, “забронировать билет”, “заказать такси”. Решения таких ботов не выходят за рамки решения только одной текущей задачи, а решение проблемы многозначности решения сводится к выбору одного решения без анализа.

Применение NLP для автоматического построения сетей Петри

Одна из проблем всех современных ботов это невозможность построить свои сети или автоматы для решения новой задачи в ходе общения с человеком. Но стоит отметить, что для построения системы, способной автоматически решать ряд задач и быть универсальной в отношении решаемых задач, необходимо построить сильный ИИ. Такой ИИ должен решать ряд простых задач: уметь определять смысл разговора с человеком, уметь извлекать необходимую информацию в структурированном виде из текста,  уметь делить сложные задачи на подзадачи, уметь находить оптимальный вариант решения задачи с учетом решения каждой подзадачи.

Для того чтобы система сама научилась выстраивать в своей голове задачи в виде сетей Петри (или конечных автоматов), ей необходимо овладеть навыками NLP: пониманием текстов и умением распознавать причинно-следственные связи между ситуациями (действиями, фактами и прочими), описываемыми в тексте, а также умением делать логические выводы из обрабатываемых данных. Так, например, читая инструкцию к какой-либо технике, ИИ должен делать выводы на основе полученных данных и закреплять эти данные у себя в памяти, чтобы в будущем использовать их для построения логической цепочки при решении какой-либо задачи. 

Аналогичным образом ИИ должен поступать при прочтении какой-либо книги из художественной литературы. Например, если в тексте рассказывалось как человек выбирал себе машину, какие критерии рассматривал, на что обращал внимание, то ИИ должен запоминать не индивидуальные выводы человека, а именно последовательность проводимых действий при выборе машины. Так, если человек заговорит с ИИ о машинах, то ИИ должен вспомнить, что он слышал раньше про машины и какие делал из этого выводы. Таким образом, ИИ построит у себя внутри автомат или сеть, по которым дальше сможет продолжать вести диалог и задавать вопросы. Также если человек захочет купить машину, то ИИ сможет перестроить автомат таким образом, что в ходе общения с человеком на каждом этапе ИИ будет искать лучшие варианты машин по описанию, для этого можно использовать раскрашенные сети Петри.

Проблема при построении такого подхода ИИ к пониманию окружающего мира сводится к тому, что необходимо иметь мощные методы обработки языка, которые позволят ИИ обучаться новым данным в процессе общения с человеком или при чтении книг. Например, можно использовать нейронные сети, которые будут обучаться на размеченных корпусах текстов для того, чтобы ИИ после обучения мог сам в тексте искать закономерности, по которым в будущем будут строиться автоматы. Однако такой подход затрудняется тем, что составление датасета займет очень много человеческих ресурсов, так как обучающая выборка должна иметь сложную структуру и огромный объем по каждому направлению области знаний; а также обучающая выборка должна быть переведена на несколько языков, что делает невозможным обучение такой нейросети. Еще одним вариантом может быть обучение нейронной сети переводить текст из языкового представления в абстрактные представления данных, которые затем может обрабатывать вторая нейронная сеть, но такая модель построения ИИ не является гибкой, так как для каждого языка необходима своя нейронная сеть и постоянно пополняющаяся выборка данных для обучения.