Форум » Общий форум РГ » Поведенческие модели ИИ » Ответить

Поведенческие модели ИИ

hippocamus: Стандартные модели поведения (потом будем добавлять): Строитель (собрать ресурсы, отобрать шахты, приоритет строительства - Цитадель - Замок, различные укрепления, скупка юнитов - в первую очередь с максимальной защитой) Воин (строить в первую очередь войска, скупить и идти нападать на слабых героев, города противника. По карте ходит много героев с одинарным-двойным приростом) Экспедитор (Исследование земель, поиски Грааля. Приоритетные навыки - Поиск пути, разведка, логистика. Не агрессивен, не нападает даже на явно слабые войска противника, если при этом ему придётся отклониться с дороги) Маг (упор на Гильдию магов и магические навыки. Из войск предпочитает с максимальной скоростью) Капиталист (Похож на строителя, но его интересует накопление денег. Дойдя до самоокупаемости, скупает высшие войска даже из разных замков (на них меньше ежедневная трата), шестого уровня, и стреляющих. Игнорирует героев, захватывает города) Навигатор (держит под контролем море - в первые же дни собирает все ресурсы, захватывает нейтральные города на островах) Странник (вначале похож на Воина, строит и скупает войска, остальная инфраструктура его не интересует. На 4-й неделе собирает все войска в один отряд и идёт главным героем безвозвратно - сметая всё на пути, жертвуя своим замком и новозахваченными).

Ответов - 26, стр: 1 2 All

Arseny: У меня раньше была тактика странника Политик - часто заключает союзы с другими игроками, много торгует, часто убегает. Часще всего изучает дипломатию, казначейсво.

hippocamus: У меня и сейчас тактика Странника, поэтому я её и добавил. Политик - тоже имхо неплохо. Тогда нужно, что заключались альянсы во время игры? Вассал (выбирает игрока, с которым заключает на невыгодных условиях вечный мир, затем всю игру ему помогает ресурсами, войсками, городами, если тот потерял)

Arseny: Крыса(вор?) - пользуется союзами, постоянно требует ресурсы(сам их не дает), делает союзникам подлости, на врагов почти не нападает, копит у себя в замкав большую армию.


jude: Манчкин... Специализируется на грамотной прокачке героев. Любыми средствами копит опыт и артефакты. Стремится собрать коллекции. Накачавшись до 20± уровня. Начинает активно пи.дить героев противника. Не,- я серьезно. Меня всегда удивляла дибильная прокачка компа, даже у воина какой-то бредовый алгоритм.

Arseny: а может еще сделать такое: ИИ противника может быть: на 25% Строитель, на 50% Политик, на 25% Маг. И другое вроде этого.

pokrik: Согласен с jude

hippocamus: Смешанный тип? В каждом конкретном случае считается рандом? Имхо, тогда: 1. Потеряется колоритность поведения. 2. Будет эффект Лебедя, Рака и Щуки - начнёт заниматься одним, бросит, сделает противоположное... Лучше разработать смешанные типы самому, обозвать их, тогда это будут чёткие стратегии.

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

jude: Necronix, поддерживаю)

hippocamus: Да, хорошо.

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

hippocamus: Прикольно. Думаю, стоит взять.

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

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

Karbofos: Почитав всю тему про ремейк героев, впечатлился грандиозными задумками, решил своей задумкой поделиться авось, по душе придется. Расписываю модель ИИ не примерно, а как он мог бы выглядеть непосредственно в игре (но без формул). И отмечу, что даже несмотря на это, схему еще дорабатывать и дорабатывать. Неизбежна попытка учесть всевозможные игровые ситуации, что не лучшим образом отражается на размерах модели. Этап первый, перед началом игры. 0. Учет типа карты. Очевидно, тактика игры должна сильно зависеть от размера и карты, и количества островов. Поэтому в зависимости от этих параметров запускаем соответствующую модель ИИ. Модели: а). на карты S и M (с островами или без) как требующие уход в войска и игры на раш либо защиту от раша. б). L и XL без островов в). L и XL с островами Подводный камень: бывают особо извращенные XL карты, где месиво начинается с первых дней, такое надо учесть отдельно. Или наоборот, S-ка с 500 титанами, разделяющими игроков. Это можно будет обдумать отдельно, сразу все подводные камни не обойти. Рассмотрю модель ИИ на XL карте (без островов) как наиболее мягкую к мелким ошибкам игрока (до столкновения много времени, можно исправить ошибки). 1. Учет расстояние между замками. Делается перед первым днем игры. Построение минитаблички из n элементов, где n – количество замков на карте минус один (родной замок рассматриваемого компа). j-й элемент ее - минимальное количество дней, требуемых герою, чтобы из родного замка дойти до j-го и обратно. (Почему именно туда- обратно? Потому что в игре есть такая чудная вещь как односторонние телепорты). Техника расчета матрицы. а. Для i-го и j-го рассчитываем минимальное расстояние между замками пешком без учета телепортов (зверей на пути игнорируем, как если бы карта была абсолютно без них). Здесь и далее если прямого прохода не существует, то считаем расстояние между замками бесконечным. б. Смотрим расстояние от родного замка до ближайшего двустороннего телепорта (ближайший двусторонний телепорт определяется по табличке расстояний от родного замка до k-го телепорта). Смотрим расстояние от первого выхода из него до каждого из замков. Корректируем значения таблички, если какие-то расстояния оказались меньше, чем расстояния просто пешком по поверхности. в. Аналогично для одностороннего телепорта. По данной схеме можно учесть и остальные телепорты, не только ближайший. Сложнее учесть случай, когда по выходе из одного телепорта мы шагаем в следующий, откуда и попадаем к искомому замку. Нужно перебирать множество вариантов. Подводный камень: учет монстров. Пусть у нас есть два пути до j-го замка, короче и длиннее. надо учесть неоднородность монстров на обоих путях. Изначально считаем выгодным переход до j-го замка по пути, где слабее звери. По ходу игры и росту силы армии эта оценка меняется на более короткий путь с более сильными зверями. г. Если путь к замку j закрыт ключником, алгоритм двухступенчат: рассчитываем мин. расстояние от i-го замка до палатки по пунктам 1-2, потом от палатки до j-го замка по тем же пунктам. Как понять, что на пути между замками есть непреодолимое препятствие в виде стража границ? Очень просто. Сначала считаем минимальное расстояние между замками без учета стража границ. Затем считаем минимальное расстояние, считая стража непроходимой клеткой. Если получившееся расстояние равно бесконечности, то страж неминуем. Если расстояния совпадают или почти совпадают, игнорируем стража. Сложнее, если наличие стража увеличивает расстояние до замка вдвое (т.е. нам нужно долго его обходить, чтобы добраться до замка). Здесь сравниваем расстояние без учета стража и расстояние с учетом похода к палатке и проход через стража. Плюс учитываем силу зверей на обоих путях). 2. Расчет приоритета замков на основе таблички расстояний. Точную формулу прямо сейчас привести нереально, поэтому ограничусь описанием параметров, которые она должна учитывать. Особняком стоит вражеские замки. Цель всей игры - вынести их, поэтому и приоритет у них особый. Смотрим, какой из вражеских замков находится ближе всего к нам. Обозначаем этот замок как наиболее опасный нам. Наша цель – скорейший его вынос. Далее будем считать именно эту сторону вражеской. Расчет нейтральных замков. Сначала убираем из расчета те замки, расстояние до которых превышает расстояние до вражеской стороны (той, что мы сочли самой опасной). Чем ближе нейтральный замок к родному замку, тем выше приоритет, т.е тем раньше комп будет стремиться его захватить. Чем дальше замок находится от основного пути, тем меньше его приоритет (основной путь - путь до вражеской стороны). После этого ближайшие замки (в 4-5-дневных переходах и ближе) пересчитывают свои приоритеты с учетом зверей на пути (в начале игры армия маленькая, потом охрана на проходе из 7 лвл зверюг несущественна). Итог: важная информация, которая говорит компу, к чему стремиться и в каком порядке захватывать замки для наилучшего результата. 3. Этап второй, глобальный многоходовый план. 1. Если цели глобального плана выполнены, обнуляем его. 2. Если глобальный план существует, переходим к этапу три. 3. Если глобального плана не существует, создаем его: Выбор нейтрального замка, который мы хотим завоевать. Смотрим позицию главного героя. Составляем таблицу расстояний от главного героя до всех замков на карте. Выкидываем из расчета нейтральные замки, находящиеся дальше, чем расстояние от нашего основного замка до вражеского замка. Выбираем ближайший к герою незахваченный нами замок (нейтральный или вражеский), проверяем его гарнизон и ставим целью глобального плана его захват, если сила нашей армии позволяет его взять. В противном случае, выбираем для захвата другой замок (самый ближний к герою после этого). 4. Если ни один из замков в результате перебора нам не подошел, значит, у нас слабая армия. Глобальный план не создается, а выполняется одно из двух действий: А). Идем домой за войсками. Б). Если у нас достаточно финансов, закупаем доп. Героя (с пометкой «несет армию»), который везет армию нам. 5. Если у нас нет вражеской стороны (т.е. мы вынесли того, кого врагом считали), назначаем себе нового врага – ближайшего к нам соперника сообразно табличке расстояний до врага. 4. Этап третий, ежедневные промежуточные цели. Рассчитываем для основного героя. 0. Проверяем наличие у нас основного героя. Если он отсутствует, либо нанимаем его из таверны (мы сбежали с поля боя либо других героев у нас нет), либо (в случае если мы проиграли битву) назначаем среди всех наших героев основным того, который наиболее силен. Герои со статусом «несет войско» делают свои ходы с целью передать свое войско основному герою. После передачи войска они переходят в статус дополнительных героев. 1. Если мы в своем основном замке, нанимаем войска. 2. Стараемся выполнить наш глобальный план. У нас есть маршрут кратчайшего его исполнения. 3. Если в казне недостаточное количество ресурсов для постройки строения либо недостаточно не-золота для покупки войск либо глобальный план вообще отсутствует, откладываем выполнение глобального плана и включаем план по поиску необходимых ресурсов. А). Недостаток ресурсов. Смотрим окрестности (окрестность – это все клетки, на которые наш герой может добраться за один/два хода). нашего героя на предмет недостающих ресурсов (в том числе учитываем пещеру циклопов и прочие сходные постройки). Выкидываем из рассмотрения те свободнолежащие ресурсы, кто охраняется слишком сильной армией. Составляем кратчайший маршрут по сбору этих ресурсов. Б). Отсутствие глобального плана. Ищем в окрестности крутую вещичку, которую мы в состоянии без больших потерь отвоевать и идем ее отвоевывать. 4. Смотрим близость вражеских героев к нам и нашему основному замку. Если расстояния от нас до нашего замка больше, чем расстояние от врага до нашего замка, плюем на все планы и мчимся на защиту. Это можно сделать двумя способами. Либо, если враг слаб, идем к нему, чтобы его прибить (причем идем так, чтобы в любой момент времени быть между врагом и своим замком), либо если враг силен (или до него идти дольше, чем до своего замка), идем к себе на защиту. Игнорируем пункт 4 данного этапа. 5. Итак, у нас есть маршрут, по которому мы хотим идти (глобальный или по сбору ресурсов). Начинаем движение по нему, на каждом шажке героя проверяя наличие в ближайшей окрестности героя: а). халявы (неохраняемые ресурсы, артефакты, строения, повышающие параметры). Отклоняемся от маршрута, чтобы собрать халяву, затем возвращаемся на маршрут. б). охраняемых крутых вещичек (хорошие артефакты, строение +2 ко всем параметрам и тому подобная шняга). Если мы можем побить охрану без существенных потерь, делаем это, собираем вещички, возвращаемся на маршрут. 5. Этап 4. Дополнительные герои. 1. Для каждого из своих замков смотрим близость к ним врага. Если враг близок, по возможности сажаем в замок доп. героя. 2. Для каждого из доп. героев смотрим, есть ли поблизости враг, способный убить нашего доп. героя. Либо прячемся в ближайший замок без гарнизона (неважно, свой или чужой, все равно нашим станет), либо прячемся в свой замок, либо убегаем. 3. Для каждого из доп. Героев смотрим наличие вокруг него халявы (неохраняемые ресурсы, шахты, замки, артефакты и так далее) и идем ее собирать. Для каждой халявы направляем на ее сбор ближайшего к ней доп. героя. 4. Для каждого из доп. героев, у кого остались ходы, а халявы уже нет, отправляем их ходить по повышающим параметры зданиям. Пусть качаются на случай если нашего основного героя вынесут. 5. Если халявы нет (все собрали и все посетили), отправляем каждого доп. героя в ближайший ему замок. Пусть сидит в гарнизоне и выбирается оттуда при появлении халявы (в частности, когда враг оставит свой замок без защиты). 6. Этап 5. Планирование отстройки замка. Здесь должна быть прописана схема построек для каждого замка на каждый день: основная схема строительства; что строить в случае недостатка ресурсов; что строить и кого нанимать, когда враг близок (этот пункт для неосновных замков – пусть там укрепления строят и войска для защиты нанимают).

ser851: хмм, неплох алгоритм. пара слов про расчёт растояний - эта тема уже обсуждалась, есть (по моим сведением) несколько готовых алгоритмов считающих растояния с учётом всех возможных препятствий и ускорителей (порталы)

GORynytch: Единственное, что меня настораживает, так это то, что компьютер будет знать расположение замков, ресурсов и т.д. Глобальный план должен корректироваться во время самой игры. Иначе будет так, что начинается игра на случайной карте, дальше пока игрок разведывает, что вокруг него находится, комп на 2--3 неделе прибегает и тупо убивает героя игрока, захватывает замок -- и конец игры. Только начал игру - уже её закончил. Т.о. в Глобальный план в начале предлагаю отнести только ЦЕЛИ карты и приблизительная позиция компьютера на карте и расположение окружающих компьютер объектов. А уже после начала игры создавать и редактировать Глобальный план. Тогда это будет больше похоже на игру реального игрока.

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

hippocamus: Молодец, действительно хорошо. Как канва, которая будет в дальнейшем обрастать подробностями.

GORynytch: Вот теперь я согласен.

hippocamus: Опять таки - не забывай про уровни. На Нормальном уровне комп будет знать ровно столько, сколько знал бы человек, игравший за него. А на Невозможном - он будет обладать повышенной "интуицией" - знать куда пойти, когда вернуться...

GORynytch: Ну да, на новичке комп карту будто первый раз видит. На норме комп ходит по дорогам, приблизительно знает, куда идти, если дорог нет или на развилке. На сложном комп частично знает карту, знает расположение игроков, расположение главных объектов типа замков, утопий, двеллингов 5+ уровней. На невозможном комп сразу знает всю карту, раположение объектов, игроков и т.д. и сразу знает, куда идти. Однако действия игроков всё равно видит только после того, как они попадают в разведанную область.

Arseny: Лучше ИИ каждого игрока выборочным сделать. От этого зависит его знание карты и расчет определенных ситуаций. А сложность попрежнему влияет на ресурсы на старте и т.д.

GORynytch: И на ИИ тоже.

hippocamus: Не, кстати идея - сделать для каждого игрока свой уровень. это хороша балнсировка (типа фора) в мультиплейере, а также удобно для сюжетных карт - одного ущемить, другому дать все условия.

GORynytch: Тоже вариант...



полная версия страницы