Подтвердить что ты не робот

Как мне приступить к разработке алгоритма AI для артиллерийской войны?

Вот фон... в свободное время я разрабатываю игру для артиллерийской войны под названием Staker (вдохновленный старыми ОСНОВНЫМИ играми Tank Wars и Scorched Earth), и я программирую его в MATLAB. Ваша первая мысль может быть "Почему MATLAB? Существует множество других языков/программных пакетов, которые лучше подходят для разработки игр". И ты был бы прав. Тем не менее, я дорка, и я заинтересован в изучении орехов и болтов о том, как вы будете разрабатывать игру с нуля, поэтому я не хочу ничего использовать с модулями prefab. Кроме того, я много лет использовал MATLAB, и мне нравится делать что-то с этим, что другие на самом деле не пытались сделать.

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

Некоторые конкретные вопросы:

  • Существуют ли конкретные ссылки на дизайн ИИ, которые вы бы предложили мне проверить?

  • Не могли бы вы сконструировать игроков AI с переменным сложностью в непрерывном режиме (сложность 0 (легкая) до 1 (жесткая), все еще использующая один и тот же общий алгоритм) или вы бы разработали специальные алгоритмы для дискретное количество игроков AI (например, легкий враг, который стреляет в случайных направлениях или жесткий враг, способный учитывать последствия ветра)?

  • С какими типами математических алгоритмов (описание псевдокода) вы начинаете с?

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

4b9b3361

Ответ 1

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

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

Конечно, игра, в которой AI бросала первую оболочку на вашей голове, каждый раз не интересна. Как только вы узнаете правильные значения, вам придется сделать ИИ паршивым выстрелом. Примените случайный коэффициент к выстрелу, а затем идите к цели - поместите его 30 + случайный (140)% к истинной цели каждый раз, когда она стреляет.

Edit:

Я согласен с мнением BCS о его улучшении с течением времени. Я сказал это, но потом изменил свое мнение о том, как написать кучу этого, а затем закончил тем, что забыл вернуть его. Чем жестче он должен быть, тем меньше случайный компонент должен быть.

Ответ 2

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

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

Ответ 3

Спасибо Лорен и BCS, я думаю, вы столкнулись с идеей, которую я рассматривал (что вызвало вопрос № 2 выше). Псевдокод для обращения AI будет выглядеть примерно так:

nSims;        % A variable storing the numbers of projectile simulations
              %    done per turn for the AI (i.e. difficulty)
prevParams;   % A variable storing the previous shot parameters
prevResults;  % A variable storing some measure of accuracy of the last shot
newParams = get_new_guess(prevParams,prevResults);
loop for nSims times,
  newResults = simulate_projectile_flight(newParams);
  newParams = get_new_guess(newParams,newResults);
end
fire_projectile(newParams);

В этом случае переменная nSims является по существу мерой "интеллекта" для AI. "Тупой" AI имел бы nSims = 0 и просто делал бы новую догадку каждый ход (по результатам предыдущего разворота). "Умный" ИИ будет уточнять свое предположение nSims раз за ход, моделируя полет снаряда.

Еще два вопроса spring из этого:

1) Что входит в функцию get_new_guess? Как мне настроить параметры трех выстрелов, чтобы свести к минимуму расстояние до цели? Например, если выстрел не соответствует цели, вы можете попытаться приблизить его, отрегулировав только угол места, отрегулировав только скорость снаряда или скорректировав оба из них.

2) Должно ли get_new_guess быть одинаковым для всех ИИ, причем значение nSims является единственным определяющим фактором "интеллекта" ? Или должен get_new_guess быть зависимым от другого параметра "интеллекта" (например, guessAccuracy)?

Ответ 4

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

В результате ваша оценочная функция должна учитывать, какой противник было бы более срочно пытаться устранить. Например, если у меня есть легкое убийство на 90%, но 50% шанс на кого-то, кто пытается убить меня и просто пропустил два выстрела рядом со мной, более важно иметь дело с этим шансом.

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

Ответ 5

Теперь я адресую ответ, который вы опубликовали:

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

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

Сначала get_initial_guess:

Чтобы начать, у меня будет таблица, которая разделяет мир на зоны - чем выше сложность, тем больше зон. Границы между этими зонами имели бы предварительно рассчитанную мощность на 45, 60 и 75 градусов. Сделайте тестовый график, если оболочка ударит по рельефу, попробуйте снова под более высоким углом - если 75 ударов рельефа используют его в любом случае.

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

Теперь, для get_new_guess:

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

Предполагая, что это не ударило о гору, обратите внимание, если она короткая или длинная. Это дает вам оценку. Новое предположение находится где-то между двумя границами (если вам не хватает привязки, используйте значение из таблицы в get_initial_guess в этом месте.)

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

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

Ответ 6

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

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

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

Ответ 7

Я лично создал такую ​​систему - для веб-игры Zwok, используя грубую силу. Я выстрелил много выстрелов в случайных направлениях и записал лучший результат. Я бы не рекомендовал делать это иначе, так как разница между timesteps и т.д. Даст вам неожиданные результаты.