Добро пожаловать на форумы Боевого Народа (бывший форум Live.CNews.ru)!

ВАЖНЫЕ ТЕМЫ: FAQ по переезду и восстановлению учеток | Ошибки и глюки форума.
О проблемах с учетными записями писать СЮДА.
AI в Battlefield 1942 - Форумы Боевого Народа
IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
AI в Battlefield 1942, Перевод официального руководства от DICE
сообщение 10.11.2003, 18:07
Сообщение #1





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Почитал тут на досуге перве официальные туториалы от DICE - наконец-то вспомнили они там о простых модмейкерах. Но к сожалению не все наши товарищи в совершенстве владеют языком Шекспира, а потому я решил перевести эти туториалы на великий и могучий. В свое время перевод статьи для начинающих модмейкеров от товарища Скомороха сильно помог мне - может теперь и мои переводы кому сгодятся.
При переводе я использовал в основном только свое знание английского языка, иногда прибегая к помощи переводчика "Сократ". Я старался адаптировать сложные конструкции под нормальный русский язык, то что адаптировать не получалось продублировано мною в английском варианте в скобках после русского.
Сейчас я привожу только перевод первой части BasicAI (как мне показалось, самой бесполезной). Думаю дня через два, а то и раньше переведу StrategyAI, а потом и VehicleAI - там действительно много инетерсного. А пока то что есть.

Введение в ИИ в Battlefield1942TM

Автор: Tobiass Karlsson

Этот документ постарается дать краткое введение в то, как работает ИИ в Battlefield1942TM . Он не претендует на исчерпывающее описание и предназначен в качестве помощи людям, собирающимся поэкспериментировать с ИИ.

Это первый документ из числа документов, которые стремятся описать, как использовать ИИ в Battlefield1942TM.

Понятие ИИ.

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

Reactive Agents. («реактивные агенты»).

Боты сконструированы как Reactive Agents. Это означает, что они запрограммированы с использованием принципов агентного программирования и реактивного ИИ. Это имеет важное значение для окончательного поведения ботов.

Агентное программирование и боты.

Исследователи поля были неспособны сойтись во мнении о точном определении агента, каждое определение имеет свои особенности. Несмотря на нечеткость определения агента, имеется несколько разных свойств, которыми должен обладать агент. Среди них способность агента выполнять его задание в условиях недостатка полного контроля и сведений. Применение агентов в Battlefield1942 проявляется во множестве интересных свойств; наиболее яркое из них – это независимость ботов. Боты обладают относительной способностью управлять собой без любого вмешательства со стороны человека с момента начала игры. Это также означает, что бот может быть создан, когда игра уже началась, и бот в состоянии вступить в игру без участия в предварительной предыгровой стартовой фазе.
Будучи агентами, боты также способны оперировать с новыми, альтернативными и конфликтными целями. Это означает, что боты могут получать приказы от других ИИ и человеческих игроков, сравнивать их со своими собственными задачами и выбирать линию действия, которая по их мнению будет лучшим образом удовлетворять различным требованиям. В результате, это боты, которые имеют окончательную определенность в своих намерениях, и они свободны отклонять любые отданные им приказы.
Боты также способны собирать собственную информацию об окружающем мире, и они делают это, используя несовершенные и локальные сенсоры. Это означает, что боты способны судить об окружающих признаках, в окружающем их мире.

Реактивный ИИ

Почти все ИИ-программы могут быть разделены на планирующие и реактивные системы.. Планирующая система тратит некоторое время на создание плана, которому она в дальнейшем старается следовать. Планирующая система нуждается в хорошем знании окружающего мира и способна предвидеть как минимум наиболее яркие результаты своих действий. Эти системы загружают CPU, а также имеют проблемы, когда мир развивается по пути, не предусмотренному их планами.
Реактивная система работает совершенно по-другому. Она только реагирует на изменения в мире, и она делает это, имея более или менее простые непосредственные данные от сенсоров к исполнителям. Она не мешает ИИ иметь долговременные планы, но она требует от агентов, чтобы они меняли свое внутреннее состояние или положение во внешнем мире в зависимости от того, на каком этапе плана они находятся. Реактивные агенты не могут предвидеть какие-либо действия других агентов - они могут наилучшим образом реагировать на эти действия.
Боты в Battlefield1942 реактивные. Это имеет большое влияние на то, как они себя ведут и что они могут делать. Важно реализовать ограничения обратной связи. Невозможно использовать ботов для долговременных планов, если любые попытки заставить ботов следовать долговременному плану будут в большинстве своем проваливаться.
Так как боты только реагируют на их окружение, они могут включиться в действия сразу после своего появления в игре. Даже если они используют малое количество памяти, чтобы проследить за изменениями множества различных переменных окружающего мира, они могут работать и с некоторыми из этих переменных, установленными на дефолтные значения.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 10.11.2003, 18:11
Сообщение #2





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Базовая концепция ИИ в Battlefield1942

ИИ в Battlefield1942 состоит из трех основных систем, которые кратко будут описаны ниже, и более детально в последующих документах. Это боты, стратегический ИИ (SAI) и вспомогательные системы.
SAI и боты ответственны за ведение войны вместе. Каждый бот – это солдат, который самостоятельно действует на поле боя, их задача состоит в том, чтобы прожить как можно дольше и в то же время убить как можно больше вражеских солдат. Задача SAI состоит в координации усилий ботов так, чтобы они защищали и атаковали определенные позиции.
К вспомогательным системам относится несколько систем. Большинство из них связано с ответами на вопросы о мире ботов.

Боты

Каждый бот состоит из множества вариантов поведения, которые по очереди отвечают за поведение ботов. То, какой вариант поведения действует в данный момент, зависит от того, каким транспортным средством управляет бот. Поэтому можно заставить бота динамично менять транспортные средства без необходимости запрашивать какую-либо информацию о них в установках бота. Чтобы сделать систему еще более гибкой, варианты поведения разделены на три части, которые могут меняться независимо друг от друга, так что код становится более применимым. Первая часть называется «поведением» (behavior), она отвечает за проверку необходимости применения того или иного варианта поведения в данный момент. Вторая часть – это «генератор плана» (plan-generator). Она создает статичный краткосрочный план на языке BAP (BAP-language), общем языке для ботов Battlefield1942. Третья часть – это «интерпретатор плана» (plan-interpreters). Её задача состоит в интерпретации команд языка BAP и их исполнении.

Стратегический ИИ (SAI)

SAI - это частично распространенная реактивная система. В зависимости от данных, полученных от так называемых «стратегических зон» (Strategic Areas), она обеспечивает последних большинством необходимой им информации. Стратегические зоны отвечают за вычисление «температуры», которая показывает, насколько важна та или иная зона, и насколько она нуждается в ресурсах. SAI, в свою очередь, отвечает за сравнение нужд стратегических зон и распределение ресурсов между ними. Стратегические зоны и SAI вместе занимаются передвижением и командование войсками.

Вспомогательные системы

Как уже упоминалось, существует несколько вспомогательных систем, используемых ИИ. Ниже будет приведено описание наиболее важных систем.
«Система знаний» (knowledge system) – это прослойка между ИИ и остальным миром, она закручена вокруг системы объектов. Она состоит из трех основных частей. Первая – это AI Object Templates, которая содержит информацию о разных типах объектов. Шаблоны содержат информацию, которая может быть написана вручную в con-файле, также как и информация, которая была извлечена из объекта во время работы программы. Объекты ИИ (AI Objects) – это примеры которые были присоединены к каждому объекту, интересующему ИИ; они соединяют реальный объект и соответствующий поведенческий шаблон. «Информация» (information) – это класс, соединенный с объектами ИИ. Информация, это не то же самое, что и объекты ИИ, она содержит то, что одна сторона знает об объекте. Возможно, что информация может довольно сильно отличаться от соответствующего ей объекта ИИ.

Сенсорные системы (sensing system) отвечают за зрительное восприятие ботов. Система испускает лучи в мир на другие объекты, чтобы они стали видимы боту. Сенсорная система - одна из наиболее загружающих процессор систем ИИ.

Путеводительная система (path finding system) отвечает за создание путей, по которым боты могут двигаться в мире. Она использует иерархический ИИ на двухмерной bitmap-карте. Одно важное ограничение этой системы в том, что с момента начала использования двухмерной карты, боты не могут двигаться по местам, находящимся одно над другим (например по этажам многоэтажных зданий), так как для описания этих мест используется только один пиксел.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 10.11.2003, 18:15
Сообщение #3





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Реальное время и разделение времени.

Battlefield1942 – система, действующая в реальном времени, что означает, что все подсистемы имеют очень небольшое количество времени для выполнения своих вычислений. Это очень серьезное ограничение системы, и ИИ также вынужден соблюдать его. ИИ система разделена по времени (time slicing). Это означает, что все основные системы могут прекратить, прервать, или отложить свои вычисления, если время вышло. Часто могут встретиться ситуации, где ИИ не может выполнить все операции, которые необходимы для его оптимальной работы. Это результат множества типичных задержек (в порядке частоты появления, самые редкие в конце):

прерванный поиск пути

неудавшийся осмотр (failed sensing)

неадекватный выбор плана

отсутствие плана

выполнение просроченных действий

отдан приказ ничего не делать (No action due to stalled action updating)

Важно обнаружить эти симптомы, так как легко подумать, что проблема не от ИИ, не от отсутствия времени. Все симптомы описаны ниже.

Прерванный поиск пути

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

Провалившийся осмотр

Сенсорная система также очень чувствительна к возможностям процессора. Если доступно только ограниченное количество времени, лишь несколько ботов смогут выполнять осмотр одновременно, а также его качество может быть снижено. Ограниченное время на осмотр означает, что может не оказаться времени на обнаружение близких объектов, а более далекие лучи могут отразиться от них, тем самым увеличивая риск оставить объект незамеченным. Боты, которые ограничены в своем осмотре, могут полностью игнорировать врагов.

Неадекватный выбор плана

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

Отсутствие плана

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

Выполнение просроченных действий

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

Отдан приказ ничего не делать

В крайних случаях, когда у ботов совсем нет времени, и нет обновления их действий на протяжении нескольких последующих кадров, их приказы будут переустановлены, и они не будут делать ничего. Если это происходит, вся система, вероятно, серьезно перегружена.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 10.11.2003, 20:53
Сообщение #4





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Пример написания стратегии для ИИ Battlefield1942

Автор: Tobias Karlsson

Этот документ постарается дать общую информацию о том, как написать стратегии в Battlefield1942

Этот документ – часть серии документов об ИИ Battlefield1942

Написание стратегий

Этот документ попробует описать, как писать стратегию для стратегического ИИ (SAI) в Battlefield1942. Первая часть этого документа опишет разные части стратегии, а вторая часть даст некоторые общие указания, как написать эффективную стратегию. За пределами этого документа осталось описание всех деталей ИИ Battlefield1942, и предполагаются некоторые базовые знания.

Стратегия? – Что, когда, как?

Назначение стратегии – помочь направить SAI в ее намерениях, на какие стратегические зоны нападать и какие защищать. SAI оценивает важность стратегических зон посредством их «температуры». Стратегия обычно изменяет эти температуры, поэтому SAI будет выделять приоритетные зоны в зависимости от стратегии.
Стратегии - очень неопределенный и тонкий инструмент, но также и очень гибкий. К сожалению, невозможно научиться писать стратегии только по этому документу, поэтому читателю рекомендуется посмотреть существующие стратегии и поэкспериментировать с ними на различных картах.

Создание блоков стратегии

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

Strategies.con (стратегии)

prerequisites.con (предварительные условия)

conditions.con (условия)

Ниже будет детально описан каждый из этих файлов.

Strategies.con

Strategies.con содержит определения стратегий. В этом файле находится вся информация, за исключением части, определяющей, когда стратегия может использоваться.

createStrategy

aiStrategy.createStrategy name(string)

Эта команда создает стратегию и дает ей имя name

Agression

aiStrategy.Agression percent(float)

Эта команда устанавливает уровень агрессивности стратегии. Значение percent указывает процент ресурсов стороны, которые будут отряжены на наступательные действия. Percent – это число в промежутке от 0.0 до 1.0.

NumberOfAttacks

aiStrategy.NumberOfAttacks number(int)

Эта команда устанавливает максимальное количество number атак, которые SAI может осуществить в любой заданный промежуток времени когда стратегия в действии.

NumberOfDefences

aiStrategy.NumberOfDefences number(int)

Эта команда устанавливает минимальное количество number оборон, которые SAI должна выдержать в любое одно время, когда стратегия в действии. Заметьте разницу между NumberOfDefences и NumberOfAttacks.

TimeLimit

aiStrategy.TimeLimit seconds(int)

Эта команда является опцией. Установленная, она означает, что когда стратегия была в действии указанный промежуток времени seconds, ее важность, как жизнеспособной стратегии, медленно уменьшалась (думаю, что со временем увеличиваются шансы на смену стратегии с 0 до 100% - прим. перевод.). Это хороший способ принудить SAI к смене стратегии.

setPrerequisite

aiStrategy.setPrerequisite name(string)

Эта команда устанавливает предусловие, которое решает, насколько интересна стратегия, и возможно ли еще ее использование в данный момент.

SetStrategicObjectModifier

SetStrategicObjectModifier flagType(enum) modifier(float) status(enum)

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

Flank
Centre
Base
Close
Remote
AirSpawner
LandSpawner
NavalSpawner
SoldierSpawner
StrongPoint
ChokePoint
Bridge
AirField
SupplyPoint
Route
ControlPoint
North
West
South
East
Front
Safe
Enemy
Neutral
Unreachable

Front означает, что стратегическая зона имеет по меньшей мере одну соседнюю, которая не контролируется SAI.

Safe означает, что все соседние стратегические зоны контролируются SAI.

Enemy означает, что стратегическая зона контролируется врагом.

Neutral означает, что стратегическая зона никем не контролруется.

UnReachable означает, что стратегическая зона не имеет соседей, контролируемых SAI.

Modifier это число с плавающей точкой, указывающее, насколько изменить температуру стратегической зоны. Modifier – это множитель.

Status – это опциональный параметр, и если он установлен, он ограничивает действие модификатора только теми стратегическими зонами, которые имеют указанный статус. Возможные значения status следующие:

Hostile
Neutral
Owned

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

addRequiredPrecedingStrategy

addRequiredPrecedingStrategy name(string)

Эта команда опциональна, и если она установлена, SAI, не будет рассматривать возможность активации стратегии, до тех пор, пока не будет активна требуемая предшествующая стратегия name(string). Можно указать несколько требуемых стратегий. В этом случае достаточно, чтобы активной была одна из стратегий. Name – имя требуемой стратегии.

addProhibitedPrecedingStrategy

addProhibitedPrecedingStrategy name(string)

Эта команда опциональна, и если она установлена, SAI не будет рассматривать возможность активации стратегии, если активна одна из препятствующих предыдущих стратегий Name. Можно указать несколько препятствующих стратегий. В этом случае достаточно, чтобы активной была одна из стратегий. Name – имя препятствующей стратегии.

addSpecificObjectModifier

addSpecificObjectModifier name(string) modifier(float)

Эта команда опциональна. Она позволяет стратегии иметь модификатор для указанной стратегической зоны с именем name. Modifier – это множитель, который показывает во сколько раз будет изменена температура стратегической зоны.

completeStrategies

completeStrategies

Эта команда должна быть выполнена если используется команда “addSpecificObjectModifier”. В противном случае, игра, скорее всего, рано или поздно вылетит. Эта команда не может быть успешно быть успешно выполнена до того, как загружены стратегические зоны. Назначение команды – инициировать команды “addSpecificObjectModifier”, когда игра проверяет существование стратегических зон.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 11.11.2003, 9:30
Сообщение #5





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



а где-бы оригинал посмотреть?
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 11.11.2003, 12:56
Сообщение #6





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Ссылки товарищ Скоморох давал в теме про MDT, но приведу их еще раз

BasicAI.pdf
StrategyAI.pdf
VehicleAI.pdf
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 12.11.2003, 20:38
Сообщение #7





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Prerequisites.con

Назначение предусловий состоит в том, чтобы решить, как то, является ли данная стратегия подходящим выбором в данный момент, так и определить, насколько интересна данная стратегия, если она является подходящим выбором. Всякий раз, когда SAI заинтересован в смене стратегии, вызывается предусловие этой стратегии и возвращается десятичное значение. Когда значение равно нулю или ниже, стратегия не подходит. Если значение выше 0, стратегия подходит в данной степени. Шкала этого значения, которое считается по принципу больше-меньше, зависит только от остальных стратегий, доступных SAI на данный момент. То есть создатель стратегии сам выбирает шкалу. Относительно более высокое значение, возвращенное предусловием, означает, что более вероятно будет выбрана данная стратегия.

createPrerequisite

createPrerequisite name(string)

Создает предусловие с именем name

addCondition

addCondition name(string) weight(float)

Главный компонент предусловий – условия (conditions). Предусловие собирается из результатов его условий, и возвращает свой собственный результат. Эта команда используется для добавления условия с именем name к предусловию. Модификатор weight опциональный, и он умножает результат условия на указанное число. Если он не установлен, то по умолчанию считается 1.0.

Conditions.con

Условие – это одинарное или двойное сравнение. Задача сравнения – проверить конкретную часть состояния окружающего мира. Условие возвращает десятичное значение, которое показывает, насколько условие выполнено.
Чтобы получить конечный результат, каждое условие сравнивает два значения (одно из которых может быть константой) с целевым значением (targetValue). То, как будет выполнено сравнение, зависит от параметров, заданных условию. По умолчанию целевое значение установлено 0.0, но это значение может оказаться непригодным.

Создание условий

Для создания условий существует несколько команд:

createConstantCondition
createHomogenousCondition
createHeterogenousCondition

Первые две команды являются лишь специализациями последней – createHeterogeneousCondition. Все эти команды содержат одни и те же параметры, с тем лишь замечанием, что первым двум командам необходимы не все параметры, которые нужны последней. Ниже приводятся команды со списком параметров:

createConstantCondition name(string) compareType(enum) compare(enum) conditionSide(enum) conditional(enum) constant(float)

createHomogenousCondition name(string) compareType(enum) compare(enum) conditionSide(enum) conditional(enum)

create HeterogeneousCondition name(string) compareType(enum) compare(enum) conditionSide(enum) conditional1(enum) conditional2(enum)

Далее описываются значения параметров.

Name – имя условия

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

Crisp (четкий)
Fuzzy (нечеткий)
FuzzySqr (нечеткий без знака)

Если тип сравнения Crisp, результат, возвращенный условием, может быть только 1.0 (истинно), 0.0 (неопределенно) и –1.0 (ложно). Это простейший тип сравнения, но и наименее гибкий.

Если тип сравнения Fuzzy, условие вернет любое значение между -Ґ и +Ґ. Чем выше значение, тем более выполнено условие. Соответственно, чем меньше значение, тем более неверно условие. Если значение равно 0.0, результат неопределен.

Если тип сравнения FuzzySqr, условие вернет такое же значение, как если бы использовался тип сравнения Fuzzy, с одним исключением – значение сохраняет свой знак.

Условие обычно сравнивает два значения. Compare – это параметр, который определяет то, как осуществлено это сравнение. Он может принимать следующие значения:

Equal
EqualGreater
EqualSmaller
Quotient (частное)
QuotientGreater
QuotientSmaller
Difference (разность)
DifferenceGreater
DifferenceSmaller

Если сравнение Equal и тип сравнения Crisp, условие вернет 1.0, если разность между первым и последним значением соответствует targetValue, и –1.0 – если значения не соответствуют. Если тип сравнения Fuzzy, оно вернет с обратным знаком абсолютное значение разности первого и последнего значений минус targetValue (думаю, что-то вроде -||value1-value2|-targetvalue| - прим. перевод.).

Если сравнение EqualGreater и тип сравнения Crisp, условие вернет 1.0, если разность между первым и последним значением соответствует или больше targetValue, и –1.0 в противном случае. Если тип сравнения Fuzzy, оно вернет разность между двумя значениями минус targetValue.

Если сравнение EqualSmaller и тип сравнения Crisp, условие вернет 1.0, если разность между первым и последним значением соответствует или меньше targetValue, и –1.0 в противном случае. Если тип сравнения Fuzzy, оно вернет с обратным знаком разность между двумя значениями минус targetValue.

Если сравнение Quotient и тип сравнения Crisp, условие вернет 1.0, если первое значение, деленное на второе равно targetValue, и –1.0 в противном случае. Если тип сравнения Fuzzy, оно вернет с обратным знаком абсолютное значение разности между частным от деления первого значения на второе и targetValue. ( -|value1/value2-targetvalue| - прим. перевод.). Оно вернет –1000.0, если второе значение равно 0.

Если сравнение QuotientGreater и тип сравнения Crisp, условие вернет 1.0, если первое значение, деленное на второе равно или больше targetValue, и –1.0 в противном случае. Если тип сравнения Fuzzy, оно вернет разность между частным от деления первого значения на второе и targetValue. Оно вернет 1000.0, если второе значение равно 0.

Если сравнение QuotientSmaller и тип сравнения Crisp, условие вернет 1.0, если первое значение, деленное на второе равно или меньше targetValue, и –1.0 в противном случае. Если тип сравнения Fuzzy, оно вернет с обратным знаком разность между частным от деления первого значения на второе и targetValue. Оно вернет -1000.0, если второе значение равно 0.

Сравнения Difference, DifferenceSmaller, DifferenceGreater – это аналоги соответствующих Eqal-типов сравнений. Существовал баг со сравнением Differecne, который был исправлен в версии 1.3.

Параметр ConditionSide определяет какая база данных (каждый SAI имеет базу данных на каждую сторону) будет использоваться при извлечении значений. Он может иметь следующие значения.

Friendly (дружественная)
Enemy (вражеская)
Both (обе)

Если установлен параметр Friendly, оба значения извлекаются из базы данных, описывающей дружественную сторону.

Если установлен параметр Enemy, оба значения извлекаются из базы данных, описывающей вражескую сторону.

Если установлен параметр Both, первое значение извлекается из базы данных, описывающей свою сторону, а второе – из базы данных, описывающей вражескую сторону.

Conditional(1&2) показывают, какие значения извлекаются из выбранных баз данных. Возможны следующие значения:

Carrier
HeavyNaval
LCVP
Naval
Bomber
Fighter
AntiAir
Air
Infantery
Artillery
AntiTank
HeavyAttack
FastAttack
Security
AverageStrategicStrength
AttackStrategicStrength
DefenceStrategicStrength
Ticket
ControlPoint
Time
StartTime
Attacks
Defences
NumberOfFriendlyAreas
NumberOfNeutralAreas
NumberOfHostileAreas
Flank
Base
Close
Centre
Remote
Route
Bridge
North
West
South
East
FrontFlank
FrontBase
FrontClose
FrontCentre
FrontRemote
FrontNeutral
Front
Safe
EnemyObject
Unreachable
UnitConstant

Carrier подсчитывает число объектов типа Naval, AirField, Mobile. (объект должен быть одновременно всех трех указанных типов, это будет авианосец – прим.перевод.)
HeavyNaval подсчитывает противокорабельную силу объектов типа Naval с корабельной броней.
LCVP подсчитывает число объектов Naval, Transport, Mobile.
Naval подсчитывает всю силу бронированных кораблей.
Bomber содержит сумму сил против тяжелобронированного транспорта всех объектов типа Air.
Fighter содержит сумму сил против самолетов всех объектов типа Air.
AntiAir содержит сумму всех сил против самолетов.
Air содержит всю силу объектов типа Air.
Infantery (да, там есть орфографическая ошибка), содержит сумму всех сил объектов типа Infantry.
Artillery содержит сумму всех сил объектов типа Artillery.
AntiTank содержит сумму всех сил против тяжелобронированного транспорта всех объектов типа Air или Ground.
FastAttack содержит силу объектов типа Mobile, которые могут двигаться быстрее заданной скорости (может быть указана при необходимости).
Security содержит значение между 0.0 и 1.0, которое измеряет уверенность SAI в своих знаниях об окружающем мире. 0.0 означает, что SAI на самом деле ничего не знает, а 1.0 – что SAI уверен в том, что он все знает точно.
AverageStrategicStrength содержит среднее значение суммы стратегических наступательных и оборонительных сил.
AttackStrategicStrength содержит сумму всех стратегических наступательных сил.
DefenceStrategicStrength содержит сумму всех стратегических оборонительных сил.
Ticket содержит число билетов, которые имеет сторона.
ControlPoint содержит число контрольных точек, контролируемых стороной.
Time содержит число секунд, прошедших с момента последнего старта карты.
StartTime содержит число секунд с момента активации текущей стратегии. Для врага это значение всегда установлено на 0.0.
Attacks содержит число атак, которое в данный момент осуществляет сторона.
Defences содержит число оборон, которое в данный момент держит сторона.
NumberOfFriendlyAreas содержит число дружественных зон, контролируемых стороной.
NumberOfNeutralAreas содержит число нейтральных зон.
NumberOfEnemyAreas содержит число зон, контролируемых врагом.
Flank содержит число зон с флагом Flank, контролируемых стороной.
Base содержит число зон с флагом Base, контролируемых стороной.
Close содержит число зон с флагом Close, контролируемых стороной.
Centre содержит число зон с флагом Centre, контролируемых стороной.
Remote содержит число зон с флагом Remote, контролируемых стороной.
Route содержит число зон с флагом Route, контролируемых стороной.
Bridge содержит число зон с флагом Bridge, контролируемых стороной.
North содержит число зон с флагом North, контролируемых стороной.
West содержит число зон с флагом West, контролируемых стороной.
South содержит число зон с флагом South, контролируемых стороной.
East содержит число зон с флагом East, контролируемых стороной.
FrontFlank содержит число контролируемых зон, имеющих флаг Flank и имеющих соседнюю зону, контролируемую врагом.
FrontBase содержит число контролируемых зон, имеющих флаг Base и имеющих соседнюю зону, контролируемую врагом.
FrontClose содержит число контролируемых зон, имеющих флаг Close и имеющих соседнюю зону, контролируемую врагом.
FrontCentre содержит число контролируемых зон, имеющих флаг Centre и имеющих соседнюю зону, контролируемую врагом.
FrontRemote содержит число контролируемых зон, имеющих флаг Remote и имеющих соседнюю зону, контролируемую врагом.
FrontNeutral содержит число контролируемых зон, имеющих флаг Neutral и имеющих соседнюю зону, контролируемую врагом.
Front содержит число контролируемых зон, имеющих соседнюю зону, контролируемую врагом.
Safe содержит число контролируемых зон, не имеющих соседей, контролируемых врагом.
EnemyObject содержит число зон, контролируемых врагом.
UnReachable содержит число зон, контролируемых врагом, у которых нет соседей, контролируемых стороной.
UnitConstant всегда возвращает значение 1.0

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

Constant это константа, котроая используется только для createConstantCondition.

Разные способы создания условий работают следующим образом:

CreateConstantCondition создает условие, которое читает лишь одно значение из базы данных и потом сравнивает его с фиксированным значением, заданным при помощи параметра constant. Если compareSide имеет значение Both, результат будет таким же, как если бы этот параметр имел значение Friendly.

CreateHomogenousCondition создает условие, которое сравнивает дружеское и вражеское значения, тип которых указан при помощи параметра Conditional. Хотя возможно установить параметр CompareSide на значение, отличающееся от Both, это не принесет никакого результата сравнения.

CreateHeterogeneousCondition создает наиболее гибкое условие из всех возможных вариантов. Можно создать все условия, используя только этот метод. Гетерогенное условие может сравнивать любое возможное значение с другим любым возможным значением.

createAreaCondition

createAreaCondition name(string) strategicArea(string) status(enum)

Зонное условие - это специальное условие, которое работает не так, как все предыдущие условия. Это условие, проверяющее статус указанной стратегической зоны, и возвращающее 1.0 если статус равен status, и –1.0 в противном случае.

Name – это название условия.

StrategicArea – это название наблюдаемой стратегической зоны.

Status – это статус стратегической зоны, который и проверяет условие. Возможны следующие его значения:

Owned
Hostile
Neutral

setConditionStrength

setConditionStrength ConditionStrength(enum)

ConditionStrength (сила условия) определяет, насколько важным будет данное условие для стратегии. Возможные силы, такие как следующие, а также их функции будут детально описаны ниже.

Required (требуемое)
RequiredPositive
RequiredNegative
Advisory (рекомендуемое)
AdvisoryPositive
AdvisoryNegative

Required – это значение по умолчанию. Когда установлена эта сила, это означает, что условие должно вернуть значение большее или равное 0.0, чтобы предусловие использующее его было в состоянии вернуть значение, отличное от 0.0.

RequiredPositive работает также как и Required. Причина создания этого параметра лишь в наличии противоположного параметра RequiredNegative

RequiredNegative Предусловие будет возвращать 0.0, если значение условия больше или равно 0.0.

Advisory означает, что результат условия добавляется к результату предусловия вне зависимости от своего значения.

AdvisoryPositive означает, что результат будет добавлен к результату предусловия, только если его значение больше или равно 0.0.

AdvisoryNegative означает, сто результат будет добавлен к результату предусловию, только если его значение меньше или равно 0.0/

setAbortCondition

setIsAbortCondition is(bool)

Эта команда опциональна. Если она установлена, условие не будет рассматриваться, если предусловие, включающее его в себя, не является предусловием активной стратегии. По умолчанию этот параметр установлен на false.

TargetValue

TargetValue targetValue(float)

Эта команда устанавливает значение целевого значения на targetValue. По умолчанию этот параметр установлен на 0.0.

CompleteConditions

CompleteConditions

Если условие создано с использованием команды createAreaCondition, эта команда должна быть выполнена как только будут загружены стратегические зоны. В противном случае игра может вылететь.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 12.11.2003, 20:41
Сообщение #8





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Вот вроде перевел почти весь StrategyAI1.pdf. Осталось только пример создания стратегии перевести. Думаю, к утру будет и пример.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 13.11.2003, 19:58
Сообщение #9





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Пример

Эта часть документа объяснит, как построить стратегию. Первая часть объяснит, как была создана стратегия для Курска.

Курск как пример.

Какие виды стратегий необходимы?

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

Старт игры
Нормальная битва
Завершение игры

.Старт игры – это самое начало карты. Ее содержание заключается в захвате позиций и быстрейшем продвижении на любые нейтральные земли. Эта часть игры обычно не требует более одной стратегии, тем не менее, если хочется, чтобы одна сторона была в состоянии начинать по-разному время от времени, может понадобиться большее количество стратегий (американская сторона в Market Garden хороший тому пример).

Нормальная битва – это нормальная часть игры. В этой части битва будет происходить без явного преимущества одной из сторон. Для этой части должно быть как минимум две стратегии, кроме случаев, когда карта абсолютно не оставляет выбора (британская сторона на Husky). Стандарт – это три стратегии, обычно что-то в духе «атаковать запад», «атаковать восток» и «атаковать оба».

Конец игры – это последняя часть игры, когда одна из сторон очевидно выигрывает. Эта часть требует стратегии для команды для случаев, когда она выигрывает и когда проигрывает.

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

Какие требуются стратегии?

При создании стратегии важно, во-первых, узнать, как предполагается играть на карте. Обычно это довольно просто - взять грубую идею, которой руководствовался дизайнер при создании карты. Попробуйте полетать по карте в режиме «свободной камеры» и получите первую идею. Потом поговорите с дизайнером. Узнайте, какие типы передвижений войск предусматривал дизайнер при создании карты. Узнайте, какие контрольные точки, узости, укрепленные точки важны. С этими данными легко представить несколько стратегий для разных частей игры, описанных выше.

Выбор стратегии для Курска.

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

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

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

Стратегии для старта карты и нормальной битвы.

Эти две стратегии просты, атака одной или двух контрольных точек, они имеют следующий вид

aiStrategy.createStrategy single
aiStrategy.Agression 1.0
aiStrategy.NumberOfAttacks 1
aiStrategy.NumberOfDefences 0
aiStrategy.TimeLimit 200
aiStrategy.setPrerequisite attackPrereq

aiStrategy.createStrategy double
aiStrategy.Agression 1.0
aiStrategy.NumberOfAttacks 2
aiStrategy.NumberOfDefences 0
aiStrategy.TimeLimit 200
aiStrategy.setPrerequisite attackPrereq


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

Для обеих стратегий установлено ограничение по времени в 200 секунд. Его назначение в том, чтобы SAI изредка менял стратегию.

Обе стратегии используют следующее предусловие:

aiStrategy.createPrerequisite attackPrereq
aiStrategy.addCondition maxOneEnemyCP 10.0


Предусловие простое, его задача лишь проверить, вступила ли игра в завершающую фазу или нет. Для этого оно использует только одно условие, которое выглядит следующим образом:

aiStrategy.createConstantCondition maxOneEnemyCP Crisp EqualSmaller Enemy ControlPoint 1
aiStrategy.setConditionStrength Required


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

Завершение игры – победители.

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

aiStrategy.createStrategy holdAndCamp
aiStrategy.Agression 0.65
aiStrategy.NumberOfAttacks 1
aiStrategy.NumberOfDefences 2
aiStrategy.setPrerequisite holdAndCampPrereq
aiStrategy.setStrategicObjectsModifier Safe 0.2 Owned
aiStrategy.setStrategicObjectsModifier ControlPoint 2.0 Owned


Агрессивность установлена на 0.65, что означает, что только 35% войск будут использоваться в двух оборонах. Так как враги должны прорваться через атакующие войска, этого должно быть достаточно.

Любые безопасные зоны, контролируемые SAI, не будут нуждаться в защите. В тоже время, важно, чтобы контрольные точки были защищены. Для этого существуют StrategicObjectsModifier, которые установлены в двух последних строках задания стратегии.

Предусловие имеет следующий вид:

aiStrategy.createPrerequisite holdAndCampPrereq
aiStrategy.addCondition threeFriendCPCond 3.0
aiStrategy.addCondition minFiveFriendlyAreasCond 2.0


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

Условия определяются следующим образом:

aiStrategy.createConstantCondition threeFriendCPCond Crisp Equal Friendly ControlPoint 3
aiStrategy.setConditionStrength Required

aiStrategy.createConstantCondition minFiveFriendlyAreasCond Crisp EqualGreater Friendly NumberOfFriendlyAreas 5
aiStrategy.setConditionStrength Required


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

Конец игры – проигравшие

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

aiStrategy.createStrategy breakout
aiStrategy.Agression 1.0
aiStrategy.NumberOfAttacks 1
aiStrategy.NumberOfDefences 0
aiStrategy.setPrerequisite breakOutPrereq
aiStrategy.setStrategicObjectsModifier ControlPoint 4.0


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

Предусловие содержит два условия:

aiStrategy.createPrerequisite breakOutPrereq
aiStrategy.addCondition noFriendlyCPcond 10.0
aiStrategy.addCondition threeEnemyCPCond 10.0


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

aiStrategy.createConstantCondition noFrindlyCPCond Crisp Equal Friendly ControlPoint 1
aiStrategy.setConditionStrength Required

aiStrategy.createConstantCondition threeEnemyCPCond Crisp Equal Enemy ConteolPoint 3
aiStrategy.setConditionStrength Required


Первое условие проверяет, что у SAI нет контролируемых контрольных точек кроме базы. Второе условие проверяет, что враг контролирует три контрольные точки.

Дополнительные замечания и указания

Этот раздел содержит советы по различным аспектам написания стратегии.

Делайте это просто

Постарайтесь создавать ваши стратегии простыми. Более сложные стратегии будет тяжелее отладить.

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

Некоторые замечания об обороне

Выражение «Лучшая защита – это нападение» на самом деле очень применимо к Battlefield1942. Если из стратегической зоны исходит атака, есть шансы, что собственные атакующие юниты будут встречена атакой вражеских войск. Это означает, что если вы знаете, из которой зоны будет производиться атака, то эта зона, обычно, не нуждается в защите.

В общем случае лучше атаковать, чем защищаться. Battlefield1942 – игра, основанная на действии. Если большая часть ботов защищается, есть вероятность того, что действия будет мало, или не будет вообще.

Отладка

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

Сообщения об ошибках

Ошибки в AI, о которых было сообщено – это общие ошибки в стратегиях (противоположное, к сожалению, тоже верно). Проверьте, что вы обнаружили все ошибки, относящиеся к AI, и определите, какие из них относятся к стратегиям.

Если гора не идет к Магомету…

Иногда карта не работает с AI по некоторым причинам. Часто, даже малые изменения в ландшафте или расположении объектов, чтобы освободить карты поиска пути (pathfinding map), может исправить проблему. Не стоит бояться, что изменения карты не помогут – это может оказаться гораздо действеннее, чем многие могут подумать.

Разница между NumberOfAttack и NumberOfDefences

Помните, что существует важное отличие между значением NumberOfAttacks и NumberOfDefences. Число одновременных атак никогда не может быть больше числа, указанного в NumberOfAttacks, но может быть меньше. Число оборон никогда не может быть меньше числа, указанного NumberOfDefences, но может быть больше.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 17.12.2003, 15:04
Сообщение #10





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Это все здорово, но стратегии АИ и управление им техники, еще туда сюда, терпимо, хотя покопаться стоит. А вот скажем, как исправить то, что АИ в упор не видит и не использует мин и дефпаков(ни своих, ни чужих) или стреляет из САУ только прямой наводкой и не использует бинокль не понятно.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 17.12.2003, 15:49
Сообщение #11





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



Я смотрел все это и могу сказать, что не вижу возможности, как, используя возможности скрипта Баттлы, заставить AI использовать мины, дефпаки и бинокль. К сожалению, тут надо обращаться прямо в DICE.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
сообщение 8.4.2005, 16:53
Сообщение #12





Группа:
Сообщений: 0
Регистрация: --
Пользователь №:



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

Кто-нибудь сумел уже заценить труды?

Также смотреть ссылки по АИ и статьи.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28.4.2024, 2:14
Консультации адвоката по уголовным делам. Бесплатно. По всей России