Модератор форума: GUNNER161, Panikaha |
Форум » РЕДАКТОР - ArmA 3 » Скрипты » Виртуальный противник (Создание управляющей программы для боевых действий) |
Виртуальный противник |
› Понедельник
› 06.10.2014
› 17:10
› Сообщение #
Идея создать подобие искусственного интеллекта возникла уже давно. Подобную задачу я пытался решить в скриптах обороны. В общем, в результате хотелось бы получить набор скриптов, которые определяли бы действия ботов в одиночной игре. Причем собственно не столько важен синтаксис скриптов, сколько порядок их активации, согласно тактической игровой ситуации. Реальный аналог - планы ликвидации аварий, которые есть на каждом предприятии. Попытаюсь объяснить на примере.
Допустим возник пожар. Первое действие - сообщить диспетчеру, что возник именно пожар. Второе действие - диспетчер ничего не выдумывает, он просто открывает план ликвидации аварий на странице "Пожар", и действуя согласно написанному, сообщает подразделениям куда двигаться и что делать. Ну и, понятно, контролирует выполнение и согласованность действий. При наводнении. Первое действие - сообщить диспетчеру, что возникло именно наводнение. Второе действие - диспетчер открывает план ликвидации аварий на странице "Наводнение", и т.д. Чем не скрипт? Ну это идея. Теперь о реализации. У нас есть бойцы и возможность объединить их в группы. Соответственно группы могут иметь специализацию: пехота, танки, артиллерия, авиация. Важно скоординировать их действия, исходя из сложившийся обстановки. И вот тут первая проблема: как классифицировать обстановку? Возможно ли так: атака, оборона, разведка, эвакуация? Я не имею военного образования, но наверняка у других форумчан оно есть. Хотелось бы узнать их мнение. Проблема вторая: структура управления. Т.е. для одного бойца создается скрипт, обеспечивающий большую выживаемость бойца. Он не должен быть громоздким, т.к. будет выполняться для многих юнитов, что сильно нагрузит систему. А вот для группы (отделения) - дело уже другое. У группы есть лидер (командир отделения), который (при условии, что жив хоть кто-то из отделения) назначает своим бойцам точки перемещения, поведение, цели. Причем лидер знает о ВСЕХ объектах, о которых знают его бойцы, их сторону и координаты. Это встроенная функция. Можно лишь скриптом увеличить степень знания лидера о целях, определить их важность, классифицировать обстановку и, согласно шаблону действий, назначить группе построение, поведение и т.д. Несколько групп (три) объединяются во взвод. Командир взвода (при условии, что он жив) имеет возможность вызывать поддержку и определяет кому из вверенных ему отделений она необходима, ну и соответственно регулирует перемещение групп. Смерть командира взвода ведет к тому, что группы не получают поддержку и исчезает взаимопомощь между группами. Другими словами, гибель командира взвода сильно влияет на боеспособность трех групп в целом. Это лишь предполагаемый алгоритм. Хотелось бы узнать мнение о предложенной задаче, примеры скриптов, предложения о построении общего алгоритма, возможно, реальный боевой порядок действий. P.S. Не ругайте меня сильно, я знаю, что я зануда. |
› Понедельник
› 06.10.2014
› 20:43
› Сообщение #
Индеец, ты пытаешься сделать из ботов вундер-солдат:)
А между тем, у них и так есть несколько преимуществ - они видят через траву, видят в темноте, не говоря уж о том, что у игрока поле зрения скукоживается в размер монитора.. я даже подозреваю, что "тремор" прицела\оптики у ботов существенно ниже. Как результат - после короткой перестрелки меня-лежачего убил стоячий бот с 200м. Человеческое поведение игрока скомпенсировано супервозможностями его противников. Реализация твоих задумок - это практически создание нового движка в плане ИИ при условии сведения их в единый алгоритм. А по мелочи наверное можно что-нить воплотить. Скажем.. максимальный станс под огнем - на колене; пулеметчики не высаживают весь магазин на одном дыхании; касаемо командира - при его смерти у подчиненных понижаются все перки, кроме меткости; первоочередные цели для всех - командиры, снайперы и пулеметчики и тп. Что-то уже реализовано в модах, том же ASR Кстати, я заметил, что в А3 боты стали самовольнее.. чаще нарушают запрет открытия огня.. так было в оригинальной кампе при засаде на колонну.. один блин герой чуть весь замысел мне не попортил. |
› Вторник
› 07.10.2014
› 08:45
› Сообщение #
Индеец, тоже думал над стратегическим интеллектом.
Всё описывать не буду. Только самое основное. 1. на карте должны быть маркеры высот, важных пунктов обороны. Маркеры важных направлений. 2. требуется разработать алгоритм подобный шахматной игре. 3. микроструктура боя. ----- Как вижу в целом. Допустим, есть две группы пехоты и один бтр. пехота, используя укрытия продвигается в город (важный пункт обороны) бтр стоит позади и прикрывает наступление огнём. выбор пункта обороны происходит по алгоритму выбора: -важное направление, ближайший пункт обороны к группе бойцов. Если бтр находится ниже по высоте, чем маркер пункта обороны, то он выезжает на более выгодную позицию, но не ближе, чем 800 метров. Т.е это слишком трудно проделать для универсального скрипта. Проще в редакторе на каждую миссию вейпами с триггерами сценарий расписать. О микроструктуре боя, я вообще молчу. Для адекватного алгоритма нужно очень много переменных расположенных на карте (укрытие, зоны эффективного огня (согласно расположения известного противника). Пытался найти в сети математическую модель поведения группы бойцов. Нашёл только роевый алгоритм. В остальных случаях информации нет. ---- как вариант - научить бота играть так, как это делал человек находясь в данном месте карты и в такой же ситуации (+\- 25%) но это процессор будет убивать по ресурсу - база данных будет очень большой, к тому же каждый из ботов будет использовать её возможности. |
› Вторник
› 07.10.2014
› 16:33
› Сообщение #
|
› Среда
› 08.10.2014
› 09:14
› Сообщение #
|
› Четверг
› 09.10.2014
› 18:34
› Сообщение #
|
› Пятница
› 10.10.2014
› 08:06
› Сообщение #
|
› Пятница
› 10.10.2014
› 10:37
› Сообщение #
alex70-03, нет времени тестировать. Если разобрался, подскажи "на пальцах", чего там полезного?
|
› Пятница
› 10.10.2014
› 11:44
› Сообщение #
|
› Суббота
› 18.10.2014
› 21:44
› Сообщение #
Попытался сваять скрипт для одного бойца. Задумался о названии и, напрягшись, дал ему одиозное имя - Slodier. В принципе это все тот-же Unit из скриптов обороны, вобравший в себя Maroder, ну и еще немного другого. На выживаемость в бою влияет не сильно, но было прикольно наблюдать на тестировании, когда пара юнитов, подкравшись как гиены, потрошат своего мертвого товарища. Для заинтересовавшихся поясню назначение: скрипт определяет действия бойца при попадании гранаты рядом (ложится), при нацеливании на него ближайшего врага (ложится), при заканчивании патронов или аптечки (ищет мертвого бойца и, подобравшись, забирает нужное).
По замечаниям andrucio: 1) на колено бойца можно поставить в любой момент, чем и пользуюсь; 2) как заставить пулеметчика не тратить все патроны сразу - не знаю, да и пока не вижу острой необходимости; 3) понижение умений при смерти командира - интересно, но есть закавыка. Дело в том, что при смерти лидера в группе, автоматически назначается другой. Не знаю как в военном деле, но на производстве примерно так же. А гибель командира взвода и так повлечет рзсогласованность действий групп. 4) первоочередные цели - тут проблема. Раньше решал так: определял все известные объекты, потом в зарезервированный массив сохранял всех принадлежащих к определенной стороне, ну, наверное, можно определить ранг, имя класса и потом отобрать в отдельный массив, но это затратно. Буду думать. Есть загадочная команда targetsQuery, имеющая встроенный массив-фильтр(?). Как им пользоваться ума не приложу. Великий метод тыка не дал положительных результатов. Подсказал бы кто? По замечаниям alex70-03: 1) маркеры высот и пунктов обороны - в том то и вся соль (или тут нужно другое слово?), что боты сами должны определить, куда им идти. Согласен, что для обороны (или атаки) нужно направление где враг. Но тут, наверное, нужно определить, что мы хотим получить в результате. Возможно ли поставить один маркер-штаб и от него рассылать вокруг беспилотники или разведгруппы и на базе полученных данных иметь направление действий? 2) шахматный алгоритм -ДА! 3) микроструктура боя - наверное, самое интересное, сложное и нужное. Думаю реализовывать в скрипте отделения. Нужно продумать тактическую расстановку бойцов, исходя из ситуации. Нет опыта. Хотя есть пара идей. Наверное, все сталкивались с ситуацией, когда есть два бойца - центральный и на фланге. Центральный демонстративно появляется, убивает врага (желательно командира) и прячется. Вражеские боты прут напролом, при этом не обращая внимания на огонь флангового бойца. Где-то в нете встречал памятку моджахеда. Там описывалась атака на пункт. Отряд делился на три группы. Первая завязывает бой с охранением, вторая - заходит на территорию и совершает диверсию (кражу, террор и т.д.), третья прикрывает отход первых двух групп. Что-то можно с этим намутить. Добавлено (18.10.2014, 21:44) |
› Суббота
› 18.10.2014
› 22:27
› Сообщение #
Индеец, про командира - можно запустить в спавне параллельный процесс, примерно так:
_kom = grp select 0; // переменной присваивается типа ИД конкретного лидера waituntil {not alive kom}; дальше некоторые умения всех остальных уменьшаются на 0.1 - 0.3 по рэндому. Можно замутить относительную величину от конкретной цифры по каждому юниту и скиллу -10-20% sleep Все это в цикле, который выполняется пару раз. Как бы первый - смерть командира, второй - смерть его зама. Если будет недлинный, можно расписать без цикла: будет два примерно одинаковых блока. Причем при смерти кома скилл уменьшается больше, а при смерти зама - меньше. Про targetsQuery не подскажу, но если есть массив известных врагов (не знаю в каком виде он создается), то его можно отфильтровать по типу _x hasweapon (из массива пулеметов) и items _x из массива оптики. Возможно, еще hasweapon бинокль или дальномер для командира. Вот и цели. Даже если юнит не пулеметчик по классу, но имеет пулемет. Оптику можно определять чисто снайперскую. Массивы для фильтров можно определить заранее один раз. |
› Суббота
› 18.10.2014
› 22:44
› Сообщение #
|
› Воскресенье
› 19.10.2014
› 00:48
› Сообщение #
andrucio, я о закавыке (см. выше), для того, чтобы лишний раз не перелопачивать информацию о известных целях у каждого бойца группы, тем самым нагружая систему, проще спросить о них у лидера группы, ведь все равно он по умолчанию владеет всей информацией. А это может быть и не _kom. Тут нужно принимать волевое решение, как принять отношение бойцов к смерти конкретно _kom: либо им плевать на смерть командира и они исправно слушаются следующего, либо они сильно расстроились, что привело к потере стойкости к отдаче оружия и т.д., но информацию все же исправно передают новому лидеру. Для интереса я склоняюсь ко второму варианту.
Может так: _kom = _group select 0; _zam = _group select 1; waituntil {not alive _kom}; {_x setSkill ["general", 0.7]} forEach units _group; waituntil {not alive _zam}; {_x setSkill ["general", 0.5]} forEach units _group; По поводу важности целей. Как когда-то делал я: // резервируем массив целей _targets = []; //командир отделения _leader = leader _group; // объекты, о которых знает командир отделения _objCOM = _leader targetsQuery ["", "", "", "", ""]; // если сторона объекта ЗАПАД, то добавить имя объекта в массив ЦЕЛИ {if (_x select 2 == west) then {_targets set [count _targets, (_x select 1)]}} forEach _objCOM; // ВЫБОР ЦЕЛИ ПО РЕЙТИНГУ _i = 1; _j = count _targets; while {_j > _i} do { /* если рейтинг одного из элементов массива больше чем рейтинг первого элемента*/ if ( rating (_targets select _j) > rating (_targets select 0)) // то: then { // присваиваем переменной имя выбранного элемента массива _candidate = _targets select _j; // в массиве целей обнуляем выбранный элемент _targets set [_j, objNull]; /* к массиву целей прибавляем имя выбранного элемента (делаем его первым элементом массива целей) одновременно удаляя из него обнуленный элемент*/ _targets = [_candidate] + _targets - [objNull]; }; _j = _j - 1; }; // цель с большим рейтингом _target = _targets select 0; Пока не знаю как это все применить к задаче [командир, снайпер, пулеметчик]. alex70-03, согласен, что нужен анализ местности. Но, возможно есть команды, облегчающие эту задачу? Например findEmtyPosition (найти свободную позицию) (это как?), или isOnRoad (на дороге ли), или terraInIntersect (пересекается ли с местностью). Может получится слепить скрипт, по которому с помощью подобных команд определить места засад, пути скрытого подхода и отхода, направление действий. Может создать в ключевых точках на местности скриптом маркеры и плясать от них? |
› Воскресенье
› 19.10.2014
› 10:15
› Сообщение #
Индеец, я так подозреваю, что нет. Ведь стратегическая карта (в руках живого командира) выглядит как?
Командир смотрит на неё, на ней указаны высоты, города, посёлки, массивы зелени, дороги и естественные преграды, допустим, водные - реки и озёра. Командиру поставлена задача пройти в пункт А. Пункт А есть на карте (поставлен штабом), а дальше командир смотрит, есть ли рядом с пунктом А стратегические высоты В, и, находятся ли они от пункта А на расстоянии эффективного ведения огня. Далее, он смотрит как можно выйти на эту высоту, максимально используя стратегическое превосходство по высоте других ближайших от В точекВ. Возможно ли пройти до пункта В скрываясь в зелёнке или использую складки местности. Потом отправляет небольшую группу разведки в пункт В, которую прикрывают основные силы. Ну а далее выводит в пункт В основные силы, и тут начинается самое сложное для Армы - микроструктура боя. Бойцы должны максимально использовать укрытия, огневые точки в зданиях и т. д. ---- В любом случае требуется нанести на карту массивы стратегических высот и пункты обороны (города). А вот каким образом бот будет ориентироваться в них - вопрос открытый и вопрос большой. Знаю только, что в этом деле замешаны формулы математические, поведение как живых людей, так и ИИ, можно рассчитать мат. уравнением. ---- Было бы неплохо найти пример использования обучения ИИ по действиям живого человека. Слышал, что такие игры, с таким ИИ есть, но не знаю где найти на них ссылку. Добавлено (19.10.2014, 10:15)
|
› Воскресенье
› 19.10.2014
› 16:06
› Сообщение #
Индеец, передача информации - другое дело, пусть передают.
Снижение скилла по смерти кома - совершенно отдельный процесс, не касающийся ничего другого, только перков юнита. Если получится, потом можно расширить - выбрать не весь "general", а пяток конкретных - spotTime, courageи тд. - типа имитация растерянности Я бы все-таки отнимал часть имеющегося скилла или какой-то процент от него же. Юнит может иметь и меньше 0.7, а ты его таким образом проапгрейдишь. Получается тайный карьерист:) Не очень. Зама ведь могут убить и до смерти кома, тогда сразу получится скачок. Лучше поставить паузу после waituntil {not alive _kom}; а там оперировать опять с юнитом select 0 По поводу важности целей - у тебя ведь есть какие-то операции с _targets select _j.. туда можно добавить условие - if (primaryWeapon (_targets select _j) in МАССИВ_ПУЛЕМЕТОВ) then - первоочередная цель. Хотя тут тоже есть нюанс, для человека более очевидный. Если есть автоматчик в 50м, то вряд ли человек будет стрелять сначала в пулеметчика, отдаленного на 300м. А с таким скриптом бот будет:) Тогда, наверное, надо еще и проверку дистанции прикручивать (скажем, не более полуторной от самой близкой цели) |
| |||
Чат сайта |