Помогите немного в ИИ / матан :: gamedev :: нужна помощь :: диванные психологи :: игрострой :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

игрострой gamedev диванные психологи матан geek нужна помощь песочница 

Помогите немного в ИИ

Добрый день, уважаемые!

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

    Третий день день уже над ним рассуждаю и что-то чувствую что только больше путаюсь. Сам вопрос - ИИ простого жителя в игре у которого есть 4 потребности: еда (жрат), защита (безопасность), блага (богатство и комфорт) и исследования (тяга к изучению нового).

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

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


Заранее благодарю!


Подробнее
игрострой,gamedev,диванные психологи,матан,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,нужна помощь,песочница
Еще на тему
Развернуть
IRL за деньги(3-е) можно купить еду и безопасность. Разделение труда сделало это гораздо проще и безопаснее, чем самому собирать-выращивать еду и защищаться. Это привело к развитию общества и цивилизации. Так что в обществе индивид думает прежде всего, где достать деньги. Такой интеллект проще - он работает, получает зп, покупает еду, платит городским службам за защиту и комфорт.
Но если у тебя борьба всех против всех, такой интеллект гораздо сложнее.
его должно заботить
-убежище на территории без монстров
-склад еды-воды-золота
-адекватное оружие
-где это золото тратить
E. Nigmo E. Nigmo 31.07.201506:33 ответить ссылка 0.1
Ты так рассуждаешь, как будто твой ИИ - реальный человек. Далек от программирования, но сделай по шкале на каждый параметр, которые постепенно растут. Постепенный рандомный прирост, какие нибудь события итд. в итоге значение дойдет до отметки Х и запускается событие. Например: у нас бомж, нихрена нет. Шкала желания жрать максимум, желание денег максимум. Первой бомж попробует реализовать желание денег, чтобы купить пожрать. Находит какого нибудь горожанина/зомби/жителя пустошей и грабит/убивает его. Либо получает по щам, либо никого ничего не находит. Желание жрать превышает отметку Х, бомж идет к мусорному бачку и есть что попало. После этого осталось реализовать потребность денег. Ну... можно тупо сидеть на паперти и ждать маны небесной. Конец.
Хз, как на самом деле нужно делать, но желание вставить 5 копеек было высоко как никогда.
tinisiyo tinisiyo 31.07.201506:57 ответить ссылка 0.5
Да кстати в этом что-то есть! Очень просто рандомный прирост в определенном интервале. Поведение будет разное что хорошо. Сохранится общий тренд что масса бежит за жрат, а единицы за исследованиями. И довольно реалистично.
у тебя уже не просто Idle, а симулятор эволюции получается. В них обычно графона нет, бактерии гоняют по экрану в поисках кусочков пищи и сражаются с конкурентами.
IRL стремление к путешествиям как раз появляется, когда на своей территории плохо живется:
-нечего есть
-появились опасные враги / конкуренты вытесняют с рынка
-дошли слухи, что вдалеке трава зеленее
для исследования новых технологий нужны более сложные условия
-некуда уйти
-имеющееся оружие не справляется с монстрами
-нужно на той же земле выращивать больше пищи

Это будет происходить, если у твоих чубзиков будет способность к размножению. Иначе они побегают-подерутся вначале, потом каждый уползет в свой уголок и будет там сидеть и жевать еду.
E. Nigmo E. Nigmo 31.07.201507:29 ответить ссылка 0.1
Сделай приоритетам вес (0-100), сделав его нелинейным.

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

Что же до риска, то я не знаю как ты его считаешь, но им можно модифицировать веса конкретных действий (например, если риск исследования оценивается как "средний", то вес исследования умножается на 0.5, если как "высокий", то на "0.25").

Дальше, веса сравниваются относительно их суммы, если есть явный победитель (больше 50% от суммарного веса) - go-go-go, если нет - выбор действия рандомом пропорционально весу.

В таком раскладе персонаж будет более мотивирован на "жрать" с повышением чувства голода. Будет искать шмот, а найдя - стараться обеспечить себя золотом под уровень шмоту, будет исследовать по мере потребности или согласно риску. Коэффициенты можешь как подобрать сам, так и заставить делать это программу (100500 симуляций с переборами разных коэффициентов). Можешь сделать их разброс для разных "типов" поведения ИИ (исследователь, скупердяй, обжора).
Hellsy Hellsy 31.07.201507:31 ответить ссылка 0.8
Во-первых, используй конечные автоматы. Так проще отслеживать состояние NPC. Далее, у тебя должно быть большое количество параметров твоего ИИ, такие как: голод, усталость, жажда приключений, деньги и т. п. Эти параметры меняются со временем, или от действий ИИ. В определенном состоянии, и если определенные переменные превышают пороговое значение, то ИИ переходит в новое состояние. Например, если ИИ находится в состоянии ДОМА_ОТДЫХ, имеет мало денег, не сильно устал, и жаждет приключений, то пеходит в состояние ИСКАТЬ_ЗОЛОТО. Автоматов лучше использовать несколько. Можно выстроить даже некоторую иерархию.
Вот с этого я и начал. Но потом просто возник конфликт автоматов, и пришлось обратиться за помощью.
Нужно просто выстроить правильную иерархию. Должен быть самый главные автомат, и ему подчиняющиеся, которые будут выполнятся для каждого стостояния главного автомата (ну, или почти для каждого).
Да, делается двухуровневый автомат. Скажем так: стратегический и тактический.
Стратегический - определяет цель: поесть, обзавестись/починить оружие, добывать блага, заниматься исследованием.
Тактический - определяет цепочку действий для достижения цели. Например при переключении автомата в состояние поесть в этом автомате идёт подпрограмма перебора вариантов: если есть в инвентаре еда - съесть её, иначе есть ли в поле зрения доступная еда - взять и съесть её, иначе есть ли достаточно средств для покупки её - съесть, иначе отправиться на охоту и так далее.
Естественно для всего этого должно быть достаточное количество параметров для создания корректных условий переключения между состояниями.
При переключении стратегического состояния тактический в любом случае сбрасывается и начинает выполнение другого, соответствующего автомата. Для того чтобы бот не начал есть во время драки делается булев параметр "угроза жизни" и тогда условие переключения в поесть из любого другого состояния можно записать так:
Если (Cытость
Недописал.
пришлось на совещание бежать, а сообщение джой обрезал.
Если (Cытость меньше 40% и не угроза жизни) то
переключиться в поиск еды
иначе если (Сытость меньше 5%) // чтобы голод сам не стал угрозой жизни
переключиться в поиск еды

Естественно финальная версия будет адски сложной и учитывать множество частных случаев, да и стратегических состояний должно быть больше значительно, первое что приходит на ум: спасать свою жизнь при малом количестве хп. Из-за этой сложности собственно даже в топовых играх появляются забавные глюки в ИИ )
Спасибо всем огромное за отзывы! Не зря говорят многоголовие хорошо.
Из всех идей очень понравилась идея tinisiyo, сделать просто рандомный прирост в некоторых интервалах и как только тик переходит определенную отметку запускается действие. Это очень просто и довольно интересно смотрится. Запущу на своих букашках посмотрю что получится на практике.
Чтобы твой ИИ куда-нибудь ломился, сделай, к примеру, прирост параметров за тик рандомом от 0,01 до 1, но при этом жажду бабла и и приключений умножай на коэффициент вида (1 + X*N), где X - задаваемый параметр для ускорения прироста и N - количество промежутков времени без необходимости денег. После срабатывания зануляй N и параметр денег/приключений.
можно, например, строить дерево решений жителя на некоторую глубину (N) и оценивать либо лист дерева (состояние жителя после цепочки действий), либо всю цепочку от листа до корня(текущего состояния жителя), а затем выбрав наиболее профитную цепочку выполнить некоторое количество (M меньше N, часто M=1) шагов из неё, а затем снова строим дерево и т.д..
в каждом узле дерева, в зависимости от состояния жителя получаем множество доступных ходов (ведь воровать@убивать без меча нельзя и пр.), и рекурсивненько перебираем каждую возможность.
предположим состояние жителя описывается некоторыми численными значениями его потребностей, пусть каждый ход удовлетворяет потребность на +x, а остальные потребности становятся менее удовлетворенными на -y. x и у придется подбирать, чтоб жители не впадали в депрессию, но и не жировали.
самое мутное в таком представлении - оценочная функция. т.е. как житель решит, что профит1 больше профит2 или наоборот.
в простом случае это набор множителей, например неудовлетворенность в еде умножается на z, потребность в приключениях на b, для класса Беар Грилз (z=1, b=10), для класса хиккан (z=2, b=-2), ибо ну к черту эти приключения.
при смерти жителя возвращать из оценочной функции ноль, ибо шекели мертвецу не нужны, ну или ввести жизнь как одну из потребностей, в случае если завоевать пол мира, но в итоге помереть - геройский поступок в игре.
можно ввести более сложные зависимости от потребностей, т.е. чем меньше удовлетворена потребность, тем больший вклад вносит её удовлетворение в общую оценку.
можно еще шум небольшой в оценки ввести, чтоб житель мог ошибаться и для устранения неопределенности, когда появляется несколько равнопрофитных веток.
про Маслоу и самураев, ну так пирамида, можно сказать, усредненные значения коэффициентов оценочной функции в нашей голове, именно усредненные, под действием воспитания, окружающей действительности и прочего оно все перенастраивается, в голове самурая честь превыше всего.
Kypara Kypara 31.07.201508:07 ответить ссылка 0.2
пока слоупочил тут много написали, после прочтения возникли еще мысли.
деревья много жрут, а конечные автоматы не умеют прогнозировать профит.
предположим ситуацию, житель удовлетворяет свою потребность в исследовании пустыни, внезапно прокнул поиск чопожрать, если порталов не существует, то может оказаться, что житель просто не дойдет ни до одного источника пищи.
а что если строить усеченное дерево на основе того как будет вести себя конечный автомат до горизонта прогноза и если его действия привели бы к резко негативным последствиям (смерть и т.п.), то пытаться их расхлебывать достраивая дерево, пытаясь заставить жителя решать жизненно важные вопросы заранее.
получилось бы менее прожорливо чем полное дерево, но более смышлено чем конечный автомат.
в случае прокнувшего желания чопожрать ИИ будет "думать" примерно так:
0:на горизонте прогноза (через N ходов) в случае следования конечному автомату: смерть, причина - голод
1:смогу ли я выжить на горизонте прогноза если пойду искать способ устранить причину вероятной смерти на 1 ход раньше? для того чтоб понять достраиваю дерево где выбрал другой вариант (либо можно просто увеличить коэффициент, оценивающий желание жрать и переоценить прогноз)
таки смог выжить норм, нет - шаг 2
2: -//- на 2 хода раньше? -//-

так или иначе игра описана дюже абстрактно и каждый дополняет эту абстракцию в меру своей фантазии, так что в любом случае конкретные требования смышлености/производительности = конкретный алгоритм
Kypara Kypara 31.07.201509:27 ответить ссылка 0.1
Это понятно, но если добавить сюда условия что существует более чем один житель. То система с одно стороны становиться логичнее, как то в твоем примере другой житель идет ему на встречу и приносит еды. Но и в то же время если учесть что жителей 100 и они взаимодействуют мне даже сложно представить какая это будет чудовищная вычислительная нагрузка.
Я с такой проблемой столкнулся когда думал как собирать жителей в отряд. В итоге пока алгоритм простой. Жажда благ копиться, и считается сумарно. Как только суммарная сумма достигает порогового значения, все неписи желающии профита собираются в точку сбора и идут далее добывать лут и золото.
К чему этот пример, я к тому что хотелось бы все таки каких-то простых решений. Которые даже может и не отражают IRL, но визуально создают впечатление живых мурашиков, а не роботов с углом разворота строго в 90 градусов. =)
Питание и Безопасность с точки зрения моделирования это не потребности а разрешение негативных состояний голода и опасности соответственно. Состояния должны обрабатываться отдельно от желаний чтобы не конфликтовать. В упрощённом виде это должно быть как то так, с некоей периодичностью проверяется пул желаний (намерений) существа, если он пуст кладём туда случайное из возможных (найти что либо, исследовать что либо, размножится и.т.д. Если не пуст начинаем выполнят то которое имеет высший приоритет. Для голода нужно ввести некий убывающий параметр, и постоянно уменьшать его, по достижению определённого уровня в пул желаний кладётся желание поесть его приоритет в 5 например раз выше чем у других. Далее если наше существо попадает в опасную ситуацию, (столкнулось с слишком сильным врагом, упало в воду или ещё что) в пул кладём желание спастись с приоритетом к примеру х10.
Если нужны характеры или развитие, то для каждого конкретного существа можно завести схемы коэффициентов различных желаний. Вроде один чаще хочет есть а у другого шило в заднице, а третий часто встречает врагов и начинает чаще задумываться о сборке дубины/протонного бластера.
братишка, напиши нейронную сеть, пусть она сама решает, что нужнее ЗОЛОТО или какие-то там, ненужная, еда
(кстати, обучить можно несколько сетей по разному, для оной поавторитетней еда, другого - золото, а третья верит в бога)
ogyvv ogyvv 31.07.201521:26 ответить ссылка 0.0
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
■••.statistics.... Приходит константа в поле функций и говорит:
-спасайтесь, грядед дифференцирование!
Функции в панике, все кричат "бежим! Спасаемся". Выходит еЛх и говорит: "мне пох, я елх". Все разбегаются, экспоненте остается
Приходит оператор дифференцирования, смотрит на экспоненту и говорит: -привет, я б/бу
подробнее»

матан geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор песочница научный юмор

Приходит константа в поле функций и говорит: -спасайтесь, грядед дифференцирование! Функции в панике, все кричат "бежим! Спасаемся". Выходит еЛх и говорит: "мне пох, я елх". Все разбегаются, экспоненте остается Приходит оператор дифференцирования, смотрит на экспоненту и говорит: -привет, я б/бу
Как убедить родителей, что ты уже взрослый человек?
Учить матан
вопрос Д НЯ
Чего вам хочется прямо сейчас?
Учить матан
ГЯТТЭЗЗЗ
Как побороть свои страхи?
Учить матан
Как отучить молодежь от ненормативной лексики?
Заставить учить матан
3 ЧПОЩЛ Н534Д
вопросдия
подробнее»

матан geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор учи матан нужно больше матана всем матана! песочница

Как убедить родителей, что ты уже взрослый человек? Учить матан вопрос Д НЯ Чего вам хочется прямо сейчас? Учить матан ГЯТТЭЗЗЗ Как побороть свои страхи? Учить матан Как отучить молодежь от ненормативной лексики? Заставить учить матан 3 ЧПОЩЛ Н534Д вопросдия
Задача 2
Написать каноническое н параметрическое уравнения заданной прямой, а также уравнение плоскости в «отрезках», перпендикулярной данной прямой н проходящей через точку А/у (дг0. у0»г0)
подробнее»

матан geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор помогите песочница удалённое

Задача 2 Написать каноническое н параметрическое уравнения заданной прямой, а также уравнение плоскости в «отрезках», перпендикулярной данной прямой н проходящей через точку А/у (дг0. у0»г0)