Немного основополагающих рассуждений.
Активный объект (АО). Выражаясь простым языком, любой «представитель фауны» игрового мира – NPC, моб и т. д. Собственно, для «модели души» которого и осуществляются изыскания в данной теме.
Раздражитель. Любое (любое!) внешнее воздействие на активный объект, как составляющее геймплея.
Реакция. Выбранное действие из множества действий (в ответ) для соответствующего раздражителя. То есть, для каждого раздражителя имеем свое множество реакций. Более точная формулировка в данном случае: множество реакций для конкретного раздражителя – суть вектор реакций v_reflex_i для этого (i-го) раздражителя, т. к. в данном случае имеет место быть упорядочивание реакций (по приоритетам). Когда, и какую именно реакцию осуществить, определяет AI АО.
Актуальное множество событий (АМС). Актуальное множество событий – GI_i – подмножество всего множество событий, в интервале между двумя раздражителями, потенциально полезное для адаптации AI АО. То есть, с момента возникновения i-го раздражителя до возникновения i+1 раздражителя, регистрируются AI АО все события потенциально полезные для адаптации AI АО.
Адаптация AI АО. Основная функция адаптации AI АО – редактирование векторов реакций.
Остальные объекты (ОО). Все те объекты игрового мира, которые имеют единичные векторы реакций, и отличаются отсутствием адаптации AI, и при этом остающиеся активными составляющими геймплея. То есть, в данном случае, AI этих объектов имеет примитивную организацию, на уровне: для конкретного раздражителя предусмотрена всегда одна и та же реакция (единичный вектор) – аля скрипты к вашим услугам!
Теперь перейдем к сути концепции. И начнем с более конкретного рассмотрения АМС.
По каким признакам и критериям AI АО определяет, будет ли событие потенциально полезным для адаптации или нет? В чем будет выражаться эта «степень полезности»?
Ответы на эти, и другие вопросы, я нашел в классике теории AI.
ГЕНЫ – вот главная суть адаптации в данной концепции!
Естественно, механизм генов в классической теории AI, я «приправил» заданием своего набора параметров (о чем речь пойдет далее).
Итак, вот вам ЧЕТЫРЕ уникальных гена для всего всей «активной фауны» множества АО.
1. Выживаемость (Survival). По сути, характеризуется как обратная величина от вероятности смерти в той или иной ситуации.
2. Познание (Cognition). Отвечает за любознательность и склонность к разного рода исследованиям.
3. Известность (Fame). Синоним славы. По сути, можно считать мерилом конструктивного взаимодействия рассматриваемого АО с остальными представителями «активной фауны» (планирую отвести под роль Fame в данной концепции – «уникального квесторесурса» (УКР), см. ТУТ).
4. Собственность (Property). По сути, характеризует все то «игровое-материальное» чем может владеть наш AO.
Естественно, раз гены являются сутью адаптации AI АО, то имеет место быть их композиция, как главная отличительная черта рассматриваемого АО от остальных АО. Иными словами, по степени важности, для одного АО может быть последовательность Property->Survival->Fame->Cognition (например, «торговца»), для другого – Survival->Property->Cognition->Fame (например, «разбойника»). Не трудно подсчитать, что эта композиция будет равна … архитипам по важности среди генов.
Для дальнейшего понимания нижеизложенного, отвлечемся пока на более подробном рассмотрении механизма адаптации AI АО.
Данный этап носит название: «предварительный этап адаптации AI АО – набор статистики для интервала в N раздражителей».
Предполагается, что механизм адаптации будет следующую структуру. Как уже упоминалось ранее, в промежутке между двумя любыми раздражителями AI АО осуществляет выборку (из всего множества событий) и регистрирует все потенциально полезные для адаптации события в виде множества GI_i (АМС). Далее, AI АО осуществляет сортировку АМС по принадлежности к тому или иному гену. Результатом данной сортировки является появление 4-х подмножеств GI_Survival_i, GI_Cognition_i, GI_Fame_i, GI_Property_i, множества GI_i.
И наконец, AI АО вычисляет значения Survival_i, Cognition_i, Fame_i, Property_i, в виде функций от этих подмножеств: Survival_i=fS(GI_Survival_i), Cognition_i=fC(GI_Cognition_i), Fame_i=fF(GI_Fame_i), Property_i=fP(GI_Property_i). Которые (значения) и регистрируются, в виде добавления в соответствующие множества G_Survival, G_Cognition, G_Fame, G_Property – окончательно для будущей (т. е. текущей) адаптации (кэш подмножеств GI_Survival_i, GI_Cognition_i, GI_Fame_i, GI_Property_i освобождается для следующего [i+1,i+2] интервала). Предполагается, что отличие AI АО по расовым/фракционным/классовым признакам будет, в частности, характеризоваться отличиями по функциям Survival_i=fS(GI_Survival_i), Cognition_i=fC(GI_Cognition_i), Fame_i=fF(GI_Fame_i), Property_i=fP(GI_Property_i). Механизм адаптации предусматривает их осуществление через каждые N раздражителей, т. е. максимально возможная мощность любого из множеств G_Survival, G_Cognition, G_Fame, G_Property будет равна N. Предполагается, что lvl АО, наряду со сложностью его подпрограммы AI, будет так же определять обратно пропорциональная зависимость от интервала адаптации («N раздражителей») – т. е. чем выше lvl АО, тем чаще будет происходить адаптация его AI (предположение спорное).
Результатом данного предварительного этапа, станет определение k-й матрицы статистики MS_N_k для интервала в N раздражителей.
Теперь снова вернемся к рассмотрению генов. Как упоминалось выше, для отдельно взятого АО, гены, в первую очередь отличаются (ранжируются) по степени важности (т. е. определяют архетип). А так же, они отличаются по значениям следующих пяти параметров.
1. Размах R, по каждому из множеств G_Survival, G_Cognition, G_Fame, G_Property.
2. Среднее абсолютное отклонение по среднему арифметическому a_Mean_X, по каждому из множеств G_Survival, G_Cognition, G_Fame, G_Property.
3. Среднее абсолютное отклонение по медиане a_Med_X, по каждому из множеств G_Survival, G_Cognition, G_Fame, G_Property.
4. Среднеквадратическое отклонение по среднему арифметическому sigma_Mean_X, по каждому из множеств G_Survival, G_Cognition, G_Fame, G_Property.
5. Среднеквадратическое отклонение по медиане sigma_Med_X, по каждому из множеств G_Survival, G_Cognition, G_Fame, G_Property.
(в вышеизложенных формулах вариационного исчисления, знак «~» в имени функций, показывает, что формулы имеют расчетный вид).
И наконец, для каждого АО, генная характеристика будет иметь вид матрицы генов MG, по всем шести вышеизложенным параметрам, в данном случае константам. Ниже представлен пример вида матрицы генов для «разбойника».
Собственно сам процесс адаптации.
Назовем его: «завершающий этап адаптации AI АО – вычисление k-й матрицы «индикатора генов» MD_N_k для интервала в N раздражителей».
По сути, результаты (матрица «индикатор генов») и будут определять характер редактирования векторов реакций. Матрица «индикатора генов» MD_N_k будет иметь следующий вид.
VICTOR_JD
очень радует то, что эта тема ещё кому-то интересна.
> Надеюсь, что нам удастся придумать такой ИИ, который смог бы сам генерировать
> приключения, историю, эмоции. И каждый поход в такой мир был бы немного
> уникальным. Пока я не знаю как это сделать. Но, надеюсь, что это возможно.
Считаю что ненужно этого делать, будет только лишняя нагрузка на AI
А вы читали мой пост #38 ? Согласен, он коряво написан, но постарайтесь. Там я предполагаю, что достаточно будет умножения вектора на коэффициент, матричное умножение и нахождение наибольшего элемента в векторе и прочие небольшие вычисления. Самое долгое - это загрузка необходимых данных с жесткого диска, в том случае, если мало оперативной памяти. При этом, такие вычисления вряд ли потребуются делать часто для каждого моба, т.к. алгоритм будет включатся в случае определенных событий. К тому же, мобы могут "встать в очередь" со своими "размышлениями" и подождать несколько фреймов. Это наоборот добавит больше реалистичности.
Недавно проработал свой вариант (концепцию) квестовой составляющей, ознакомиться можно ТУТ.
Если я вас правильно понял, то вы предлагаете множество квестов, которые выдаются в определенных условиях. Вообще-то, везде так.
Еще вы предлагаете, чтобы сами мобы выполняли квесты других мобов. Если вы не знаете, то это было реализовано в ещё в Космических рейнджерах и кажется в альфа версии Сталкера. Не знаю про релизовую версию, не особо заметил...
Как альтернативный вариант: создание обширной базы квестов "на все случаи жизни", с постепенным открытием их персонажами (не только игровыми!), а так же создать что-то в виде динамической доступность для квестов (как по выполнению, тоак и по выдаче).
Боюсь, что все эти квесты превратятся в поди-поговори, поди-принеси, поди-поговори-принеси, поди-убей, поди-убей-принеси и т.д. Советую глянуть вот это: http://habrahabr.ru/post/154729/
И понять, что квест - это головоломка, которую интересно решить. Но сам квест не наполняет мир эмоциями. Их создаёт автор, который умеет описать персонажей, местность, ситуацию и т.д. Вспомните квестовую игру Ходячие мертвецы. Там довольно мало было головоломок, большую часть времени игрок разговаривает с другими персонажами или смотрит экшн. Это как раз и позволяет игроку почувствовать мир игры.
...как на некий социум всех мобов в игре (как на систему взаимодействий) - то тогда все становится на места:) Вот вам ключевые понятия: "иерархия", "моральные нормы", "расовые обычия".
мне кажется, что моя идея (пост #38) способна это реализовать. Иерархия задается формальными отношениями (это список возможных действий на определенное события при определенных формальных отношениям. Например, господин может поругать, побить, убить, продать, приказать что-то делать и т.д. своему рабу. Отец может поругать, побить, попросить что-то сделать и т.д. своего сына.
Моральные нормы и расовые обычаи определяются вектором оценок. Это то же самое, что вектор характера, только характер меняется редко, а оценки меняются намного чаще.
VICTOR_JD
Признаюсь, ваш пост #45 я совсем не понял. Хотя первый вопрос, вы тут пишите:
Раздражитель. Любое (любое!) внешнее воздействие на активный объект, как составляющее геймплея.
Реакция. Выбранное действие из множества действий (в ответ) для соответствующего раздражителя.
Это напоминает черный ящик... и вы почему-то не учитываете состояние, ведь от простой машины человек отличается памятью, мировоззрением, эмоциями... Это вы собираетесь учитывать?
Да и адаптация... вы хотите реализовать ии, который не похож на человеческий, я постоянно встречаю множество людей которые продолжают наступать на одни и те же грабли. Кстати, сам я такой же ))) И ни о какой адаптации или обучения на своих ошибках и речи не идет.
Человек далеко не всегда поступает рационально. Хотя это уже философия, и мне кажется, что рациональность - это понятие относительное.
VICTOR_JD
> Тут я что-то не понял: в случае, если элементы матрицы в посте #33 будут функциями (например, от векторов действий и векторов состояний) от N предыдущих состояний, какой смысл тогда вводить эту доп. зависимость?
Матрица может быть не просто матрицей чисел, а полноценным оператором. Тогда получается, что вектор входных данных может быть вектором функций, то есть тоже оператором от уже числовых данных, а также вектор полученных результатов тоже может быть аргументом оператора и таким образом у нас получается три множества функций: входное, матричное и конечное. Это весьма сложная техника и я её пока не использую на всю мощность. Матрицу функций я придумал сам, но её точно изобрели, а я просто догадался. Это что-то вроде оператора набла, но более в широком смысле.
Теперь, как этим пользоваться. Исходный вектор просто формируется на основании воздействий. Зависимость может быть нелинейной, так реакция на похвалы и оскорбления может быть степени полтора, то есть sign(x)*abs(x)^1.5, это взято для примера. Дальше у нас идёт матричный оператор и на каждую величину результата влияет со своей функцией. Например настроение может получать квадратичный со знаком вклад sign(x)*abs(x), а усталость просто прямую пропорциональность. Но после суммирования вектор может быть обработан ещё одним оператором и обычно это уже приведение к вероятностям. Основное неудобство это необходимость полного понимания, что и как на что влияет и линейный рост числа вычислений по каждому вектору.
в ходе реализации "живого" ии, появились вопросы.
В общем, получается, что у каждого моба будет свой большой набор разнообразных действий с очень многими объектами. Только ТАК можно реализовать адекватного бота. Можно, кончено, сэкономить памяти и бот будет учитывать взаимодействия только с теми объектами, о которых он знает, а также реализовать забывчивость.
Вот например, жил был бот, у него есть домик, домик в деревне, в деревне сотня жителей, с которыми он иногда пересекается. С кем-то у него хорошие отношения, с кем-то по-хуже, кто-то ему должен, кому-то он завидует и т.д. Кроме этого в деревне много других объектов, с которыми он может взаимодействовать. Это и колодцы, деревья(например яблони), рядом огороды и т.д. Вот например ему не нравиться кто-то, так этот бот пойдет и поломает все яблони и потопчет огород. Около деревни тоже много всего есть. Как это всё учесть? Или сделать автоматическое изучение мира? Хм, а это идея!... Т.е. встретил новый объект, он добавляется в память к боту с определенными параметрами, например, что это за объект и его характеристики, и на основе этих данных принимаются решения.
Буду делать так, если есть другие мысли, то пишите.
Придётся пойти на расходы с двухмерными матрицами памяти отношений. Одномерные векторы, конечно, менее прожорливы, но если в игре даже 1000 объектов, то 1000 в кубе может быть хорошо упакована потому, что матрицы будут разрежены очень сильно.
Алексей Патрашов
по поводу оптимизации буду думать потом, сначала лучше придумать, как легче создать "живого" бота.
Интересная статья была недавно на гамасутре. Автор, насколько я помню, предлагал не столько учить ИИ взаимодействовать с каждым элементом окружающей среды, сколько делать "умными" сами элементы среды, чтобы они сами сообщали мобам какую-то информацию о себе и возможные с собой действия.
Oxeren
Интересная статья была недавно на гамасутре. Автор, насколько я помню, предлагал не столько учить ИИ взаимодействовать с каждым элементом окружающей среды, сколько делать "умными" сами элементы среды, чтобы они сами сообщали мобам какую-то информацию о себе и возможные с собой действия.
Я читал, что есть такой алгоритм поиска пути, где сами препятствия подсказывают боту, как их лучше обойти, но вот чтобы объекты сообщали "информацию о себе и возможные с собой действия"... Я боюсь, что тогда будет сложно реализовать некоторые действия по изучению объекта. Например, вы идете по дороге и видите пустой автомобиль с открытыми дверьми. Вы не знаете, чей он, на машина сама начинает подсказывать: я принадлежу тому-то и тому-то... и на мне можно ездить! Для начала сядьте за руль... на эту педаль нажмите... и вот этот рычажок...
Oxeren
> и возможные с собой
> действия.
это перебор.
ну так кто-нить здесь уже запилил какого-нить скромного ии? или все закончится теорией?
Ryhor1
> но вот чтобы объекты сообщали "информацию о себе и возможные с собой
> действия"... Я боюсь, что тогда будет сложно реализовать
Это не сложный и надежный способ реализации, когда речь идет про не самообучающихся мобом неписей и любых других сущностей в игре. Ничего в этом сложного нет, зато не даст той фигни, которая будет происходить, если пытаться реализовать так, как тут напридумывали велосипедов и костылей (по причине рандомных болванчиков муравьиных).
С другой стороны, даже совместно с самообучающими сущностями, система обратной связи (умные элементы) более правильно позволит реализовать Аквариум, а не Зоопарк Столкновений...
> Например, вы идете по дороге и видите пустой автомобиль с открытыми дверьми. Вы
> не знаете, чей он, на машина сама начинает подсказывать: я принадлежу тому-то и
> тому-то... и на мне можно ездить!
Именно так. Персонажу не нужно закладывать тучу алгоритмов для осознания каждого элемента виртуального мира!
То есть, ему не нужно останавливаться на каждом булыжнике (на каждом элементе), чтобы проверить свои эмоции и потребности, что будет происходить при внедрения любого уровня и мощности AI !!!
Сталкиваясь с элементами, они будут нести значимость и важности, а не наоборот проверять у персонажа все параметры, чтобы он поздоровался с машиной, рассказал ей новость. А потом попрыгал на ней и далее решил прокатиться, чтобы по пути затоптать того булочника, который на него косо посмотрел вчера в кабаке...
...только из-за того, что матрица поведения - чистый рандом, а машина не сказала ему "иди ты со своими новостями" и спокойно слушала сплетни, ведь ей спешить некуда:)
skypo
не волнуйся, ии пилится )))
D-Prince
То есть, ему не нужно останавливаться на каждом булыжнике (на каждом элементе), чтобы проверить свои эмоции и потребности, что будет происходить при внедрения любого уровня и мощности AI !!!
А я как раз так и собирался сделать...
Алексей Патрашов
> Пятьдесят лет назад такие задачи могли решать полторы машины в мире и одна стояла в Пентагоне.
Не было. В пентагоне первая сеть проста была внедрена, вот и всё.
А за 7 лет до этого, наши военные испытывали уже 40-разрядный процессор:)
Но вернемся из оффтопа к дискуссии.
Ryhor1
> Алексей Патрашов
> Это очень круто. Мне кажется, что ещё немного додумать систему и можно будет браться за программирование.
В сложных алгоритмах поведения и осознания действий в первую очередь используют параметры:
- состояние нейтральности ("мимо ушей", без перезаписи данных)
- актуальность потребности
- скорость нарастания
- удержание (это главнейший атрибут)
- коэффициент неудовлетворенности
- активность контакта (насыщенность!)
- фрустрация
Случайные величины только на проверку от заполненности параметров, а не случайный выбор что и как.
Хотя на первых порах и рандом будет важным ходом, если первые попытки.
Ryhor1
> А я как раз так и собирался сделать...
Я и говорю, обыденные попытки - это и есть реализация Зоопарка Столкновений
...а не жизнь виртуальных сущностей в Аквариуме.
Еще и загнется или дергаться будет на "коллизиях" вся эта кухня:)
D-Prince
Я и говорю, обыденные попытки - это и есть реализация Зоопарка Столкновений
...а не жизнь виртуальных сущностей в Аквариуме.
непонятно. А чем вы вообще говорите? какой ещё Аквариум?
Тема в архиве.