«Большие батальоны» в непрерывном времени (симуляция сражений)

    «Бог всегда на стороне больших батальонов» — Жак д'Эстамп дела Ферте, французский маршал

    Рис. 1

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

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

    Исходные данные


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

    Поэтому исходными данными у нас будет два числа — количество солдат в каждой армии на момент начала сражения.

    Модель взаимодействия


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

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

    Редко бывает, что армии состоят из совершенно аналогичных солдат и встречаются в абсолютно равных условиях. «Оборона сильнее наступления» (Р. Клаузевиц). Поэтому коэффициент k для каждой армии будет различным. Но мы пока не будем усложнять и предположим, что коэффициент k у обеих армий одинаков, а позже обобщим результаты на случай различных коэффициентов.

    Основные уравнения и их решение


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



    То есть: скорость убыли солдат первой армии пропорциональна количеству солдат во второй армии, и наоборот.

    Получилась система дифференциальных уравнений. Она несложно решается, в частности, с помощью Wolfram Alpha. Общее решение:



    Где C1 и C2 — константы интегрирования, которые необходимо найти исходя из начальных условий. Если количество солдат первой армии в момент начала сражения t=0 равно x0, а второй армии, соответственно, y0 — то подставим и получим C1=x0, C2=y. После упрощения нужное нам частное решение окончательно выглядит так:



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

    Анализ результатов


    Какого поведения можно ожидать от полученных функций?

    Подставим для примера x0=y0, т.е. смоделируем бой между равными армиями и посмотрим, что получится. Член с exp(2*k*t) уничтожается, и остается x(t) = y(t) = x0*exp(-k*t). Обе армии уничтожают друг друга по экспоненте, их численность убывает очень быстро, однако нуля никогда не достигает. Сражение будет длиться вечно, и бесконечно малое количество оставшихся солдат будет компенсироваться бесконечно малой скоростью их убыли.

    Если же теперь подставить разные значения, например, x0=90 и y0=100 (как на рис. 1) — то член с exp(2*k*t) будет действовать для каждой армии по-разному. Та армия, которая исходно имела больше солдат, получит «добавку» от exp(2*k*t) в положительную сторону, то есть, скорость ее убыли замедлится. Другая же армия, более малочисленная, получит ту же «добавку» в минус, так что она будет редеть быстрее. В итоге за конечное время t1 численность более слабой армии достигнет нуля. Сражение закончится разгромом этой армии.

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

    Результат тем более впечатляет, что график на рис. 1 был построен исходя из значения k=0.01. Представим себе, что время измеряется в минутах. Это означает, что каждую минуту солдат одной армии убивает в среднем 0.01 солдата противника. То есть, допустим, он стреляет каждую минуту один раз, и попадает с вероятностью 1%. Это весьма низкие скорострельность и вероятность попадания. Тем не менее, сражение заканчивается примерно за 150 минут полным уничтожением более слабой армии. Это все из-за того, что у нас в решениях экспоненты.

    Вычисление x(t) и y(t) после того, как одна из этих функций достигла нуля (т.е. после победы одной из сторон) не имеет смысла. Так, в частности, при t>t1 x(t) станет меньше нуля, а y(t) начнет расти. Чтобы знать, до какого значения t вести расчеты, следует найти t1.

    Вывод формул для времени победы t1 и потерь победившей армии


    Найдем момент разгрома t1 для случая x0<y0. Подставим x(t1)=0 в формулу (3) и после преобразований получим:



    Теперь можно привести Матлаб-код, который использует формулы (3) и (4) для построения графиков хода сражения.

    Программа рисования графика для рис. 1
    x0 = 90; % Number of soldiers in army-1
    y0 = 100; % Number of soldiers in army-2
    k = 0.01; % Damage to armor factor
    %----------------------------------
    if x0~=y0
        t_end = log((x0+y0)./abs(x0-y0))./2./k;
    else
        t_end = 1000;
    end
    t = [0:floor(t_end) t_end];
    
    x = 0.5*exp(-k*t).*((x0-y0)*exp(2*k*t)+x0+y0);
    y = 0.5*exp(-k*t).*((y0-x0)*exp(2*k*t)+x0+y0);
    
    figure(1);
    plot(t,x);
    hold on
    plot(t,y,'r');
    hold off
    grid on
    ylim([0 max(x0,y0)]);
    
    xlabel('Time')
    ylabel('Forces remaining')
    legend({'Player 1','Player 2'})
    title('Battle progress')
    

    Также представляет интерес найти потери победившей стороны. Подставляя найденное t1 из формулы (4) в формулу (3), после преобразований, получим:



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

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

    Попробуем выразить время сражения и потери победителя не через абсолютные величины x0 и y0, а через их отношение. Пусть r=x0/y0 (0<r<1 при x0<y0), тогда x0=r*y0 и после преобразований получаем:



    Потери победителя найдем как отношение количества солдат после сражения к количеству солдат до сражения:



    На рис. 2 приведен график функции Ry ( r ):

    Рис. 2

    Видно, что армия-победительница несет в общем малые потери, что подтверждает тезис о больших батальонах, вынесенный в эпиграф. Даже при соотношении сторон 10:9 выживает почти половина победившей армии, и только при r>0.95 у победителя наблюдаются существенные потери, что можно говорить о «пирровой побде».

    Обобщение на случай неравных условий боя


    Неравные условия боя (различия в подготовке солдат, вооружениях, броне, оборона против наступления, факторы местности) можно учесть, если в системе уравнений (1) ввести разные коэффициенты k1 и k2 вместо одного k. То есть средняя скорость истребления противника у солдат каждой из армий будет различаться:



    Нужное нам частное решение такой системы, аналогично формуле (3), выглядит так:



    Выражения получились более громоздкими, но если ввести подстановку: p=sqrt(k1*k2), r=sqrt(k1/k2)*x0/y0 — то все существенно упрощается:



    В принципе, если сделать аналогичную подстановку для системы (3) — то системы (3) и (10) будут выглядеть одинаково, и разница между ними будет заключаться только в выражении для r: для случая разных k1 и k2 в выражении для r появляется множитель вида sqrt(k1/k2).

    Критерий победы теперь — сравнение r с 1. Если r>1 — то побеждает первая армия (x), если r<1 — то вторая (y). При r=1 обе армии взаимно уничтожаются за бесконечное время.

    Время победы совпадает с формулой (6) с той лишь разницей, что вместо k теперь фигурирует p:



    И наконец, оставшиеся солдаты победителя: формула (7) применима без изменений в случае использования новой подстановки для r.

    Заключение


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

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

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

    Предложенный мной подход можно развивать в том направлении, чтобы применить к нему теорвер и мат. статистику. Также было бы интересно разработать модель для разнородных армий, состоящих из нескольких видов войск. Но это уже тема для отдельных исследований и новой статьи. Спасибо за внимание.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 58

      +7
      Гхм, выглядит интересно, но что случилось со старой доброй пошаговой эмуляцией смешанной с методом Монте-Карло? В смысле, что проводим (условно) N раундов-обменов уроном, смотрим сколько и кого осталось, записываем, кто победил и повторяем это еще 100,000 раз, чтобы после построить график.

      Это позволяет, среди прочего, работать со сложно формализуемыми параметрами. Вон у вас какие зубодробительные формулы получились на всего лишь несколько видов вооружения. А если туда добавить хотя бы классическую схему, где стрелки стреляют по всем, а солдаты ближнего боя могут атаковать только солдат ближнего боя и лишь если их нет — стрелков? А если нужно протестировать влияние героя, который сам наносит какой-то урон, дает бонусы армии или осуществляет стратегическое управление, например, переводит бойцов ближнего боя в режим защиты, если есть превосходство в стрелках или фокусирует стрелков на наиболее опасных вражеских юнитах? А если есть лечение и вампиризм, т.е. лечение уроном, саммон (включая временный), сопровождающие заклинания, влияние местности (на тех же стрелков), сверхмощные одиночные юниты, из-за которых бой буквально делится на «до» и «после» их гибели и т.д. — что тогда?
        0
        Ну это же игра.
        Делается модель того что придумали.
        Решаются дифуры. Упрощается.
        Потом слегка подправляется игровая логика, чтоб не было совсем уж тяжелых мест.
        Ну и конечно надо считать, стоит ли такой расчет делать, или проще грузить проц полноценным моделированием.
        Но в среднем принцип «Луна не существует, если на нее никто не смотрит» очень полезен в играх.
        Да и не только в играх.
        Я подобный подход в нейронных сетях применял :)
          +2
          Можно поинтересоваться что я написал неправильного?
            0
            Не могу говорить за всех, но рискну предположить, что Вам хотят указать, что подобные методы расчётов возможны только для абсолютно одинаковых армий. В первой же Цивилизации были Фаланги, которые держали оборону лучше чем нападали и Кавалерия, которая была настроена наоборот. То есть расчёт не подойдет, к примеру, для расчёта столкновения армии подобных «Фаланг» с армией «Кавалерии».
              0
              В предпоследнем разделе статьи результат обобщен на случай неравных армий. Пожалуйста, читайте внимательнее.
                0
                Я не претендую на правоту, и читал внимательно (только формулы не вычитывал, уж не обессудьте), но речь в статье о «средняя скорость истребления противника у солдат каждой из армий будет различаться», а не о том, что одна сторона имеет бонус, скажем, к обороне. Можно свести всё к простому, если у стороны А бонус к обороне, то у стороны Б это просто минус к DPM (повреждений в минуту), но бонус может быть огромным. К примеру оборона крепости — какой шанс у атакующей стороны без пушек/требушетов нанести хоть какой-либо урон обороняющимся в прямом столкновении?
                  0
                  Можно свести всё к простому, если у стороны А бонус к обороне, то у стороны Б это просто минус к DPM (повреждений в минуту)

                  Совершенно верно, именно так и следует поступать.
                  но бонус может быть огромным.

                  Ничего страшного. Огромный — так огромный. Просто надо соответствующим образом рассчитать k1 и k2. Если у одной из сторон ну очень сильная оборона — то она, вероятнее всего, и победит в оборонительном бою.
                    0
                    Ну автор привел пример расчета для простой модели которая сводится к паре коэффициентов и двум дифурам.
                    Это заняло статью.
                    Реальная задача может иметь 10-20 дифуров, и пару сотен коэффициентов, что потянет уже на сложность сравнимую с дипломом (со всеми описаниями, упрощениями и коэффициентами). Но сложность будет умеренной, нобеливку не дадут)
                  0
                  Оригинальный метод на что-то указывать тупо понижая рейтинг человеку без объяснений.

                  В каждой статье такое.
                    +1
                    Не обращайте внимание. Их решение политически мотивированное — их заставила моя жена. Чем ниже карма, тем меньше комментариев. Чем меньше комментариев, тем больше времени семье. Она в Штабе Армии Израиля служила (правда), у нее руки длинные :)
                      0
                      Объяснения написаны ниже. Просто так получилось, что они оказались не в этой ветке — а писать комментарий со ссылкой было лень. Но вы меня пристыдили )
                +1
                Гхм, выглядит интересно, но что случилось со старой доброй пошаговой эмуляцией смешанной с методом Монте-Карло?

                «The purpose of computing is insight, not numbers» (Р. Хэмминг).

                Допустим, с помощью методов Монте-Карло и пошаговой симуляции вы получили графики, подобные приведенным в статье на рис. 1 и 2. Как вы определите, какого вида эти функции? Это экспоненты, логарифмы, гиперболы или, может быть, полиномы? Никак не определите. А знание вида функций важно для интуитивного понимания изучаемой системы. Чтобы знать, как она будет вести себя в других условиях или в каких-то предельных случаях.
                … и повторяем это еще 100,000 раз, чтобы после построить график.

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

                Боюсь, вы мало имели дела с математикой, если вам формулы из статьи кажутся зубодробительными! Дифуры вроде приведенных в статье изучаются на втором курсе естественнонаучных специальностей. И любой студент, «доживший» до второго курса, имеет дело с куда более зубодробительными формулами.

                Как уже показал ниже Mendel, многие из описанных вами сложностей могут быть учтены в модели либо путем пересчета коэффициентов k1 и k2, либо путем добавления в систему новых дифуров. Выражения получатся более громоздкими, конечно, но в конце концов и они упростятся до приемлемой сложности. И тогда снова знание ответа в явном виде поможет не только ускорить практические расчеты, но и получить более глубокое понимание процессов битвы.

                В крайнем случае, если какое-то усложнение приведет к невозможности свести задачу к дифурам, то придется откатиться к численным методам, Монте-Карло и т.д. Но даже и тогда знание аналитического ответа в простых конфигурациях задачи поможет лучше понять полученный для более сложных конфигураций численный ответ.
                  0
                  Это экспоненты, логарифмы, гиперболы или, может быть, полиномы? Никак не определите. А знание вида функций важно для интуитивного понимания изучаемой системы.


                  Так для этого же и существуют графики, разве нет? Кроме того, все-таки обычно геймдизайнеры создают свою систему, а не изучают какую-то чужую и примерно представляют как именно она себя ведет.

                  С такими затратными численными расчетами ваш бот просто не сможет работать в реальном времени.


                  А боту будет достаточно и десятка симуляций, чтобы более-менее достоверно предсказать результат поединка. Но есть способы предварительно упростить вычисления. Например, заранее составляется таблица соотношений размена юнитов в боях друг с другом. Условно, сколько нужно юнитов А, чтобы уничтожить тысячу юнитов Б. Затем по ней быстро оценивается взаимная сила армий. В особо примитивных случаях все вообще сводится к вычислению условной средней силы каждого юнита и сравнению суммы этих параметров, если расхождение в нужных рамках — тогда уже симуляция.

                  Боюсь, вы мало имели дела с математикой, если вам формулы из статьи кажутся зубодробительными!


                  Боюсь, вы мало имели дела со стратегическими играми, если представляете себе сведение всех условий (тип местности, броня, выучка и т.д.) к одному линейному коэффициенту k. Он в лучшем случае — степенной. Кроме того, зачастую юниты в стратегических играх обладают лимитированным количеством дополнительных возможностей — способностями к разовому исцелению раненых (вариант: вызов подкрепления), к нанесению резкого (burst) урона с последующим бездействием или без такового, к временному контролю отрядов противника (suppression, cc) и так далее. Именно эти способности требуют наибольшего внимания от ГД, поскольку именно в них таятся опасности критического дисбаланса — как вы все это будете учитывать?
                    +1
                    Дифуры не есть волшебная таблетка на все случаи жизни. Но…
                    Если все эти специфические фичи активизируются автоматически, то под них можно создать отдельные дифуры в нашей системе.
                    Опять таки подход конечно не универсален, но дает отличный профит во многих ситуациях.
                    Да и тому же геймдеву «наибольшее внимание» проще будет уделять имея хорошую математику под рукой, а не только численные методы.

                    Кстати реальные дядьки в погонах, не брезгуют аналитическим подходом, и не ограничиваются только численными методами.
                      +1
                      Так для этого же и существуют графики, разве нет?

                      По графику нельзя определить вид функции. Легко перепутать, например, экспоненту с гиперболой. А если вы не знаете вида функции — то вы лишаетесь такого мощного средства, как оценка ее параметров по экспериментальным данным методом наименьших квадратов или другими.

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

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

                      Ну вот как раз «быстрая оценка взаимной силы армий» по известным параметрам вроде «сколько нужно юнитов А, чтобы уничтожить тысячу юнитов Б» и является темой данной статьи. Вы же должны подставлять измеренные вами экспериментально параметры в какие-то формулы? Вот я и вывел эти формулы, куда вам надо подставлять параметры. Коэффициенты k1 и k2 как раз и имеют физический смысл вида: «сколько нужно юнитов А, чтобы уничтожить тысячу юнитов Б».
                      если представляете себе сведение всех условий (тип местности, броня, выучка и т.д.) к одному линейному коэффициенту k. Он в лучшем случае — степенной.

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

                      Степенной коэффициент k — это как? От чего он зависит по степенному закону? И почему именно степенному? Ведь подобные предположения надо обосновывать. Я допускаю нелинейную зависимость действия армии от ее численности, но эта нелинейность должна появляться не от балды, а как следствие введения в модель интуитивно понятных допущений. Например, экспоненты, логарифмы и квадратные корни, которые присутствуют в моих формулах — они все являются следствиями простых исходных положений, а не берутся «из воздуха».
                      как вы все это будете учитывать?

                      Не в один день Москва строилась. Мой подход идет от простого к сложному. Со временем, если будет вдохновение, буду усложнять модель.
                        0
                        Легко перепутать, например, экспоненту с гиперболой.


                        Если есть такие опасения, то можно по графику воссоздать функцию.

                        Вы же должны подставлять измеренные вами экспериментально параметры в какие-то формулы?


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

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


                        Да, но по принципу «сферического коня в вакууме» — т.е. ничего конкретно применимого. Ну нет игровых систем, основанных только на простейшем размене с плавным падением численности. Везде транзакции, рандом, кучи коэффициентов, мер и контрмер. Иначе, какой интерес?

                        Степенной коэффициент k — это как? От чего он зависит по степенному закону? И почему именно степенному? Ведь подобные предположения надо обосновывать.


                        Работа модификаторов может зависеть от численности нелинейно. К примеру, отряд может иметь дополнительно шанс критического урона, зависящий прямо (или обратно, берсерки, например) от соотношения оставшейся численности отряда к максимальному значению. В случае очень больших значений размена (кстати, в играх обычно соотношение атаки к защите что-то типа 10-25%, т.е. все заканчивается куда быстрее) начинает играть роль неодновременность транзакций (бонус первого удара за засаду на местности, позволяющей делать засады). Или отряд может некоторое время поглощать урон не теряя численности (разнообразные виды защиты).

                        Не в один день Москва строилась. Мой подход идет от простого к сложному. Со временем, если будет вдохновение, буду усложнять модель.


                        Я всячески желаю удачи, поскольку если вы сможете довести идею до уровня конечного приложения, способного к анализу по указанным параметрам — это будет чудесно. Но при этом я полагаю, что вряд ли хотя бы один геймдизайнер из тысячи будет сам составлять и решать систему уравнений, хотя бы в силу того, что большинство из них испытывают головную боль даже от элементарных операций с вероятностями.
                          +1
                          Вопрос, определите пожалуйста по графику, что это за функция:
                          image
                          Скрытый текст
                          А ведь это косинус
                          image
                            0
                            Если есть такие опасения, то можно по графику воссоздать функцию.

                            Выше PsyHaSTe уже привел пример обманчивого графика. Если вас это не убеждает — я могу привести еще множество подобных примеров. И снова повторю вам: по графику воссоздать функцию нельзя. Нет таких методов и быть не может. График несет информацию лишь о поведении функции в конкретных точках. Что происходит в других точках, где функция не вычислялась — вы не знаете. Как она ведет себя за пределами того интервала, в котором строился график — вы не знаете. Как будет выглядеть график, если поменять параметры неизвестной вам функции — вы тем более не знаете.

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

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

                            Погодите. Исходное ваше высказывание было:
                            Условно, сколько нужно юнитов А, чтобы уничтожить тысячу юнитов Б. Затем по ней быстро оценивается взаимная сила армий.

                            Я ответил, что вопрос «быстрой оценки взаимной силы армий» вы оставили без рассмотрения, а на него надо ответить. Каким образом, зная параметры вида «сколько нужно юнитов А чтобы уничтожить тысячу юнитов Б», вы быстро оцените взаимную силу армий? Вам надо для этого либо снова проводить затратную детальную симуляцию (и тогда она окажется совсем не «быстрой»), либо подставить эти параметры в какую-нибудь простую формулу. Откуда взять эту формулу? В данной статье я ее вывел. Именно эту формулу для быстрой оценки. Подумайте над этим.
                            А в вашем случае геймдизайнер обречен на постоянную борьбу с системой уравнений.

                            Зачем бороться с системой уравнений, если я ее уже решил? В статье приведен ответ, выраженный в простых формулах (6), (7), (11). Геймдизайнеру что, сложнее вычислить квадратный корень, чем проводить полномасштабную детальную симуляцию?

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

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

                            Если итог всех этих транзакций, рандомов мер и контрмер можно выразить в простом виде — то это разве плохо? Подумайте и вы над термодинамикой. На уровне молекул и атомов там происходят кучи «транзакций» (взаимодействий), наблюдается сложное, хаотическое движение. Но вот парадокс: на макроуровне результаты всех этих сложных процессов весьма точно описываются простой моделью (термодинамикой). Это плохо? Неинтересно? Но это наш мир какой он есть.
                            Работа модификаторов может зависеть от численности нелинейно.

                            Хорошо, я с этим согласен. Нелинейность возможна. Но вы так и не обосновали степенной закон. Из чего он следует? Я считаю, что нужно в каждом конкретном случае определять вид зависимости исходя из свойств боевых единиц и характера их взаимодействия. Может получиться степенной или другой закон, но в любом случае его надо выводить из исходных положений о свойствах армий.
                              0
                              Что происходит в других точках, где функция не вычислялась — вы не знаете. Как она ведет себя за пределами того интервала, в котором строился график — вы не знаете.


                              Мы изначально рассматриваем строго определенный отрезок, а именно — потери отряда. Они определены от нуля до 100 процентов. Ниже нуля они быть не могут, выше 100% — тоже. Так какое мне дело до вида функции вне рассматриваемых рамок?

                              Я ответил, что вопрос «быстрой оценки взаимной силы армий» вы оставили без рассмотрения, а на него надо ответить. Каким образом, зная параметры вида «сколько нужно юнитов А чтобы уничтожить тысячу юнитов Б», вы быстро оцените взаимную силу армий?


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

                              Если итог всех этих транзакций, рандомов мер и контрмер можно выразить в простом виде — то это разве плохо?


                              А с чего вы взяли, что это возможно? Ваш пример с термодинамикой забавен. Ну да, в идеальном цилиндре, с идеально измеряемыми параметрами системы все просто и модель более-менее соответствует реальности. А теперь представьте, что у вас не цилиндр, а штук сто сообщающихся сосудов, с разной теплопроводностью, часть из которых при разной температуре становится упругой и может менять объем, а часть оборудована автоматическими клапанами, срабатывающими при определенных условиях, некоторые их них даже стравливают часть газа наружу, а в некоторых газ дополнительно охлаждается до состояния жидкости или подогревается до состояния плазмы. Как вы, вооруженные самым передовым знанием, что pV=NRT, сможете определить параметры системы на выходе? При этом сделать тысячу замеров результата работы этой системы сможет даже лаборант.

                              Зачем бороться с системой уравнений, если я ее уже решил? В статье приведен ответ, выраженный в простых формулах (6), (7), (11). Геймдизайнеру что, сложнее вычислить квадратный корень, чем проводить полномасштабную детальную симуляцию?


                              Вы решили задачу об обмене уроном между всего лишь двумя отрядами без каких-либо особенностей. Для ГД это что-то уровня «Hello world!», а «полноценная симуляция» в рамках решенной вами «задачи», это пять минут работы программиста-новичка. Только вот если потребуется добавить особенностей — это будут все те же пять минут, а у вас сложность резко нарастает. Кроме того, в самой игре обмен будет идти точно так же, как в симуляции, собственно, обычно симуляция и делается с использованием модуля для боевки. Это гарантирует отсутствие ошибок, включая накапливающиеся ошибки из-за отсутствия дискретности у вашей модели. Ну, а про использование любимого метода всех ГД — разброса параметров с помощью всемогущего рандома — даже как-то уже упоминать неудобно.

                              Полагаю, что предлагаемый вами метод полезен общего развития, чтобы ГД примерно представляли как проходят размены в простейших случаях. Но никакого практического смысла он не имеет.
                                0
                                Так какое мне дело до вида функции вне рассматриваемых рамок?

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

                                А теперь, пожалуйста, выразите эту мысль на математическом языке, а то непонятно, куда надо подставлять параметры и как вычислять результат.
                                А теперь представьте, что у вас не цилиндр, а штук сто сообщающихся сосудов… Как вы, вооруженные самым передовым знанием, что pV=NRT, сможете определить параметры системы на выходе?

                                А в чем разница? Да, система усложняется, но методы термодинамики к ней по-прежнему применимы. И затратность расчета при моделировании на уровне отдельных атомов по-прежнему останется выше.
                                При этом сделать тысячу замеров результата работы этой системы сможет даже лаборант.

                                И что, каждый раз поручать лаборанту сделать тысячу замеров при любом изменении конфигурации системы? Это настолько затратно, что заставляет искать более оптимальные решения.
                                Вы решили задачу об обмене уроном между всего лишь двумя отрядами без каких-либо особенностей. Для ГД это что-то уровня «Hello world!»

                                Во-первых, многие особенности могут быть учтены в моей модели. Так что это значительно лучше, чем «Hello world». Во-вторых, я не исчерпал весь потенциал изложенного в статье подхода. Исследования в этом направлении можно расширять и углублять.
                                а «полноценная симуляция» в рамках решенной вами «задачи», это пять минут работы программиста-новичка.

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

                                Можем проверить и это. Заодно покажете, каким именно образом в моем подходе резко нарастает сложность при добавлении особенностей.
                                Ну, а про использование любимого метода всех ГД — разброса параметров с помощью всемогущего рандома — даже как-то уже упоминать неудобно.

                                Потерпите, будет вам рандом. Я только начал исследования аналитической модели. Вот применю теорвер — и тогда…
                                Но никакого практического смысла он не имеет.

                                «Бездоказательно, дорогой профессор. Бездоказательно!» (с) Ш. Холмс.

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


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

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


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

                                  Это настолько затратно, что заставляет искать более оптимальные решения.


                                  Почему вы считаете, что это затратно?

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


                                  А я это уже сделал, когда захотел проверить выводы насчет потерь.

                                  Пример
                                  use strict;
                                  
                                  for (my $pp = 0; $pp < 100000; $pp+=100) {
                                  	my $L1 = 100000;
                                  	my $L2 = $pp;
                                  
                                  	my $k = 0.01;
                                  
                                  
                                  	while ($L1 > 0 && $L2 > 0) {
                                  		my $LN1 = $L1 - $L2 * $k;
                                  		my $LN2 = $L2 - $L1 * $k;
                                  		$L1 = int($LN1);
                                  		$L2 = int($LN2);
                                  	}
                                  
                                  	print "$pp	$L1\n";
                                  }
                                  


                                  А вот так выглядит график построенный по выводимым данным:
                                  image


                                  Обратите внимание на характерную точку 80,60 (0.8, 0.6 в вашем случае).

                                  Ну и, чтобы дважды не вставать, про время:

                                  $ time perl a.pl > data

                                  real 0m0.033s

                                  А это один поток на половине ядра шестиядерного процессора 2011г., работающего на пониженной частоте. И язык — интерпретатор.

                                  Заодно покажете, каким именно образом в моем подходе резко нарастает сложность при добавлении особенностей.


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

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


                                  Вообще-то нет. Я утверждаю, что ни к чему учиться брать интегралы в конкретном случае, типа работы портного, который может просто взять сантиметр и измерить весьма сложную и нелинейную фигуру клиента. В задачах, где вычисление одной точки без оптимизации занимает дни, а порой месяцы — безусловно нужна аналитика. Но геймдизайн к таким не относится.
                                    +1
                                    Почему же они затратные? Одна симуляция считается сотые доли секунды.

                                    Сотые доли секунды — при производительности современных процессоров порядка миллиарда оп/с — это значит десятки миллионов машинных операций. Это очень много! Вернемся снова к задаче написания бота для RTS. Шаг времени игры может составлять порядка 1/50с. Это две сотые. Ваша симуляция с такой производительностью может не уложиться в отведенное время!
                                    И множество симуляций нужно только если есть разброс параметров из-за рандома, в т.ч. ведущего к ветвлению, который ваша система вообще не может учитывать

                                    Мой подход отчасти учитывает случайные факторы, он рассчитывает мат. ожидание случайного процесса. Осталось лишь рассчитать функции распределения. Я здесь не вижу принципиальных препятствий. Теорвер нам поможет.
                                    Без проблем, но баш на баш — представьте сначала, скажем...

                                    Чего это вы ставите условия? Я все свои рассуждения подтвердил в статье математическими выкладками. Вы вашу фразу «Так же, как и оценка по среднему, только берется сумма оценок взаимодействия каждого отряда с каждым.» — ничем не обосновали. Ни логическими рассуждениями, ни в виде формулы. И теперь что, я вам что-то должен, чтобы вы устранили пробел в своем рассуждении?

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

                                    Описанные вами условия (кроме брони) не приводят к добавлению или модификации дифуров, а влияют только на коэффициенты k1 и k2. Начнем с простого. Пусть у нас только 2 параметра — очки здоровья (h1, h2) и урон (d1, d2). Тогда k2=d2/h1, k1=d1/h2. При этом считается, что частота атак равна 1.

                                    Теперь учтем шанс крита. Пусть при каждой атаке каждого солдата из отряда-1 обычно наносится урон d1, но есть шанс 0<Pcrit<1 нанести двойной урон. Тогда средний урон, наносимый солдатом за единицу времени, будет d1*(1-Pcrit)+2*d1*Pcrit = d1*(1-Pcrit+2*Pcrit) = d1*(1+Pcrit). Остается только подставить этот результат в формулу для расчета k1. Если исходно k1=d1/h2, то теперь k1=d1*(1+Pcrit)/h2.

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

                                    Поручить лаборантам провести тысячу измерений со сложной системой по-вашему не затратно? Ну, тогда мне остается только пожать плечами.
                                    сможете ли вы при мне за 5 минут написать программу симуляции сражения в тех конфигурациях, что были рассмотрены в статье.
                                    А я это уже сделал, когда захотел проверить выводы насчет потерь.

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

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

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

                                    0.033с для игры в реальном времени — это очень много. Игровая индустрия всегда была областью, где требуется глубокая оптимизация кода и алгоритмов. В данном случае аналитическое решение дифуров оптимизирует алгоритмы, что обычно дает больший выигрыш в производительности, чем оптимизация только кода.
                                      –1
                                      Вернемся снова к задаче написания бота для RTS. Шаг времени игры может составлять порядка 1/50с.


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

                                      Я здесь не вижу принципиальных препятствий. Теорвер нам поможет.


                                      А я вижу принципиальное препятствие — нарастающую сложность и запутанность системы.

                                      Чего это вы ставите условия? Я все свои рассуждения подтвердил в статье математическими выкладками.


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

                                      Начнем с простого. Пусть у нас только 2 параметра — очки здоровья (h1, h2) и урон (d1, d2). Тогда k2=d2/h1, k1=d1/h2. При этом считается, что частота атак равна 1.


                                      Отлично. В первом отряде один огр с 10000hp и уроном 3500 ед., во втором отряде тысяча пехотинцев с 13hp каждый и уроном в 4ед. Кто же победит и с каким счетом?

                                      Теперь учтем шанс крита


                                      И снова проблема, ага. «Броня» вычитается из конечного урона. Если броня равна, например, 300, а урон — 350, то в случае некритической атаки отряд получит урон в 50 единиц, а в случае критической — 400 единиц. Я упростил задачу, обычно еще закладывают ограничение типа «броня не может уменьшить урон ниже 25% от начального», чтобы противники с высокой броней и низким уроном не попали в вечный бой.

                                      Поручить лаборантам провести тысячу измерений со сложной системой по-вашему не затратно?


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

                                      Где метод Монте-Карло?


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

                                      вы понимаете, что ваша симуляция является численным решением дифуров и принципиально от моего подхода ничем не отличается


                                      Кроме одного момента, о котором я уже в который раз пишу. Мне добавить любое, пришедшее в голову ГД условие — дело пары минут. Захочет ГД, чтобы отряд, по достижению половины численности три хода наносил половинный урон (деморализация)? Не проблема. Захочет, чтобы у отряда раз в пять ходов «воскрешался» каждый пятый погибший (типа, полевая медицина) — легко. Захочет, чтобы урон рос каждый ход после десятого на 10%? Элементарно. А уж когда дело дойдет до способностей и эффектов…

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

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


                                      У вас отличное чувство юмора.
                                        +1
                                        А я вижу принципиальное препятствие — нарастающую сложность и запутанность системы.

                                        Учитывая то, какими «зубодробительными» вам показались мои формулы — неудивительно. Но поверьте, есть люди, лучше вас разбирающиеся в математике, и для них некоторый (незначительный) рост сложности решений при добавлении характеристик армий не является неподъемным.

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

                                        Простите, а вы кто? Какое отношение имеете вы к разработке игр, чтобы судить, что имеет к этому отношение, а что — нет?

                                        Пока что все, что я от вас видел — это голословные, огульные утверждения вида «это никому не нужно»; вы ужасались «сложностью» не очень-то сложных формул, и вы наплевательски относитесь к ресурсам компьютера, не понимая, что для игр, особенно интерактивных в реальном времени, ресурсы компьютера на вес золота были всегда — и в 80е годы на 8-битных процессорах, и сейчас.
                                        Поручить лаборантам провести тысячу измерений со сложной системой по-вашему не затратно?

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

                                        Пожалуй, я оставлю это без комментариев. Такое утверждение дает прекрасную характеристику вашей компетентности в области физических измерений. А уверенность, с которой оно высказано, дает прекрасную характеристику другим вашим веским утверждениям из других областей.
                                        Где метод Монте-Карло?

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

                                        При чем здесь то, что есть или нет у меня? Вы утверждали, что можете за 5 минут запрограммировать «полноценную симуляцию» в том понимании, как изначально употребили этот термин. Вы мало того, что написали решение в оффлайне (без контроля времени), так еще и не сделали то, что, как утверждали, можете. Ваша программа всего лишь численно решает систему дифуров (1), которая в моей статье уже решена аналитически.
                                        Кроме одного момента, о котором я уже в который раз пишу. Мне добавить любое, пришедшее в голову ГД условие — дело пары минут…

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

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

                                        Аналитическое решение требует повышенных разовых трудозатрат на его получение, но зато потом оно снижает повторяющиеся затраты на вычисление ответа. Оба подхода имеют право на существование. Это как разница между интерпретатором и компилятором. Вы же не станете утверждать, что один из них всегда лучше другого?
                                        Отлично. В первом отряде один огр с 10000hp и уроном 3500 ед., во втором отряде тысяча пехотинцев с 13hp каждый

                                        Зачем вы меняете условия задачи? Боитесь, что решу? ;) Я ведь первую вашу задачу (с броней) еще не решил, т.к. требуется уточнение условия. Вы так и не уточнили. Повторяю вопрос: как должна действовать броня? Верно ли, что она поглощает весь нанесенный противником урон, при этом сама разрушается (т.е. ее способность поглощать урон конечна), а при критических атаках броня не разрушается, а двойной критический урон наносится только здоровью?
                                          +2
                                          Как я понял оппонента — броня не разрушается вообще. Иначе не было бы оговорки про бесконечный бой.

                                          Если по сути, то по ту сторону есть определенный уровень логики. Я попробовал если не решить (тут лучше инструментально решать, а не ручками на бумажке, а софта у меня под рукой никакого нет), то хоть написать систему дифуров о которой я говорил изначально, и столкнулся с забавной проблемой — я не достаточно прописал мат.модель. Не придумал я как будут «стрелять» разные юниты — случайно, по самому сильному, равномерно и т.п. Опять таки — выбрав соответствующую модель, нужно будет существенно отразить ее в математике. Это не просто количественный переход от 10 уравнений к 20. Тут и решение будет по разному считаться, нужно будет определять точки когда кто-то из групп войск (того или иного противника) погибнет, и дальше считать без него… подставлять эти формулы в новые формулы… Упрощать.
                                          В общем заметный объем работы который потребуется сделать для нескольких вариантов логики.
                                          Лично я бы бутстрапил численно, а потом решал аналитически, перед продакшеном.

                                          Что касается тервера, то зачем он? мы рандомим коэффициенты и получаем репрезентативный результат.
                                          ИМХО дисперсия то как раз из чисто научного а не практического интереса нужна.
                                            0
                                            Как я понял оппонента — броня не разрушается вообще. Иначе не было бы оговорки про бесконечный бой.

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

                                            Wolfram Alpha аналитически решает системы дифуров и многое другое.
                                            Тут и решение будет по разному считаться, нужно будет определять точки когда кто-то из групп войск (того или иного противника) погибнет, и дальше считать без него…

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

                                            Безусловно, этот подход имеет право на существование. Чтобы быстро получить результат. Разве только если удастся автоматизировать аналитический подход (как я описал выше) — тогда можно будет использовать и его при прототипировании.
                                            Что касается тервера, то зачем он? мы рандомим коэффициенты и получаем репрезентативный результат.

                                            Если рассмотреть задачу в рамках теорвера, то разработанные в статье методы, как я сейчас это представляю, рассчитывают математическое ожидание для процесса и результата боя. Мат. ожидание — это важная величина, но все же она зачастую мало говорит об истинных процессах. Скажем, мат. ожидание для игры в орлянку равно нулю, т.е. после бесконечной серии игр вы ничего не выиграете и не проиграете. Между тем, на практике вы можете получить как большой выигрыш, так и проигрыш. Одного мат. ожидания недостаточно. Мой метод предсказывает безусловную победу того войска, которое имеет больше сил (с поправками на коэффициенты). Между тем, на практике бывает наоборот, а при схватке приблизительно равных отрядов шансы на победу примерно равны. С помощью теорвера можно будет вывести формулы, которые позволяют:
                                            1) рассчитать вероятность победы каждого отряда;
                                            2) в случае победы, рассчитать функцию распределения для потерь отряда (мат. ожидание потерь уже рассчитано).

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


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

                                            Простите, а вы кто?


                                            Второй переход на личности.

                                            Такое утверждение дает прекрасную характеристику вашей компетентности


                                            Третий переход на личности.

                                            На этом я, пожалуй закончу. Меня лишь одно еще интересует — вы и правда не поняли пример с огром в котором у отряда пехотинцев выше суммарный урон и больше суммарный запас здоровья, но они проигрывают? Или вы поняли, что формула ошибочна, поскольку заведомо не учитывает дискретности разменов, но упорствуете в надежде, что и так сойдет?
                                              +2
                                              Первый переход на личности.

                                              Если вы обосновываете ваши высказывания только вашим личным мнением, без логического и математического доказательства («зубодробительные формулы», «это никому не нужно», «не имеет никакого отношения к геймдизайну», «проведение измерений обойдется в сотни, если не в тысячи раз дешевле попытки измерить и просчитать вышеупомянутый механизм», «Уберите упоминание об играх и у меня исчезнут все вопросы»), то логично задаться вопросом о том, есть ли у вас заслуги, придающие такой авторитет вашей личности, чтобы на отсутствие логических обоснований ваших высказываний можно было закрыть глаза.
                                              Меня лишь одно еще интересует — вы и правда не поняли пример с огром

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

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

                                              Но конкретно вашу задачу с огром я, честно, еще не рассматривал в деталях, все ждал от вас уточнения условий по броне. Потом собирался рассмотреть огра. Но если вы предпочитаете выйти из дискуссии — то, конечно, ваше дело.
                        0
                        Ну вы прям весь Warcraft III расписали, со всей его составляющей) Не упомянули только о летающих юнитах, осадные орудия, добычу ресурсов, застройка рабочими итд =) будто вроде в игре отлично разбираетесь)
                        +2
                        С первых строчек статьи вспомнил старую-добрую пошаговую стратегию «Генерал» :) Как раз, ваш случай.
                          +2
                          Вспомнилась военная кафедра, на которой на эту тему целый курс был. Разбирали как непрерывную модель, так и дискретные — например, танковый взвод против танкового взвода.
                            0
                            А вот это уже интересно! Хорошая у вас была военка. Нам только ответы приводили для частных случаев, а вывод формул для расчета не показывали. Есть ли у вас ссылки на соответствующую литературу или публикации? Наверняка там все вопросы, которые я рассмотрел в статье, изучаются более подробно.
                            +1
                            Бог не на стороне больших батальонов, а на стороне метких стрелков. (с) Вольтер
                              0
                              Расчеты статьи показывают, что именно на стороне больших батальонов.

                              После формулы (9) в статье записано выражение r=sqrt(k1/k2)*x0/y0, которое определяет исход битвы. Повышение меткости в 2 раза для первой армии увеличивает коэффициент k1 в 2 раза. Это дает преимущество в sqrt(2) раз (~1.41), тогда как повышение численности в 2 раза дает большее преимущество!
                                0
                                При осадах городов, если память не подводит, считалось что имеется хоть какой-то смысл, если армия осаждающих имела трёхкратное превосходство над осаждёнными.
                                Вопрос не такой простой. Спросите у англичанина, увлечённого Наполеоновскими войнами, что лучше, многочисленная французская колонна, или малочисленная английская линия стрелков :) Из объективного, колонная эффективна в нападении, но линия эффективнее в защите, из колонны вести огонь могут только стоящие по периметру, а линия стреляет вся. Получается озвученная в статье «эффективность истребления противника», но есть ещё и психологический эффект, часто малочисленные меткие стрелки просто разбегались при виде многочисленный колонн, а иногда побеждали.
                                Второй пример — немецкий блицкриг против французов в 1940-м году, когда лёгкие танки Гудериана обошли линию Можено и при поддержке самолётов буквально раздавили французов и за месяц взяли всю Францию. Численности армий были сопоставимы, технически французы были даже сильнее немцев (средние и тяжелые танки в двое превосходили по численности лёгкие немецкие).
                                Статистика это такая наука, которая утверждает, что 100% людей хотя бы раз выпивших воду умерли.
                                  0
                                  из колонны вести огонь могут только стоящие по периметру, а линия стреляет вся
                                  А вот ничего подобного :) Линяя не может стрелять вся — просто из-за нехватки дальности и точности.

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

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

                                  Конечно, само по себе построение колонной большей плотности огня не давало. Рассуждения выше лишь показывают, что у линии стрелков преимущество в первой фазе боя было не настолько и большим, и потери колонны на этом этапе не являются критическими. А когда начинается вторая фаза боя — штыковой бой — все преимущество сразу же оказывается у колонны, которая наваливается по линию стрелков по принципу «трое на одного».
                                    0
                                    Линия стрелкой ни когда не была плотной, особенно если построение шло в три линии. Тем более, что вольтижеры не спали :)
                                    И логики не понял или уж «стрелки, стоящие перед колонной, попросту не могли попасть в нее из-за небольшого углового размера колонны. А стрелкам, стоящим сбоку, не хватало уже дальности» или «по плотной линии стрелков тяжелее промахнуться». Как же плотно стояла английская линии, при условии прицельной дальности мушкета ~50 метров?
                                    Про штыковой бой само собой, но тогда и англичане перестраивались.
                                      0
                                      Разумеется, линяя стрелков не была настолько плотной, как фаланга :) Но она куда плотнее цепи.

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

                                      Вообще, наилучшая тактика для метких и малочисленных стрелков — стрелять и убегать, не вступая в бой. Слабость подобной тактики также очевидна — вечно бегать можно лишь когда нечего и некого защищать.
                              +2
                              Упрощенное моделирование событий за пределами области видимости игрока — это верх неуважения к игроку. Игрок мог два часа расставлять свои войска, готовя идеальную оборону — а стоило ему отвлечься на что-то еще, его войска, что, покидают укрепленные позиции и начинают весело умирать по приведенной формуле?

                              Исход боя не должен зависеть от того, смотрел на него игрок или нет (если игра — не про квантовую физику, конечно же).

                              С другой стороны, такие формулы вполне можно использовать при разработке ИИ или выработке общей стратегии.
                                +1
                                Тут всё зависит от логики игры.
                                Если исход от наблюдателя не зависит, а просто при наблюдателе идет визуализация боя, и тогда расходы на пошаговый расчет незначительны, а когда никто не смотрит, а нужен только результат, то почему бы его и не взять по формуле?
                                Пошаговые стратегии раньше вообще не подразумевали визуализацию боя. Столкнулись армии, их посчитали и выдали результат.
                                Да и сейчас у многих игр такая же динамика.
                                Вообще строго говоря СТРАТЕГИЧЕСКИЕ игры и не должны были бы иметь таких эффектов. Эффект «правильно расставленных» юнитов на локальном участке карты это ТАКТИКА, если вообще не оперативная задача. То что жанр «стратегические игры» содержит в себе и стратегические и тактические и чуть ли не элементы шутера, так это ничего не значит :)
                                  0
                                  Одна из первых браузерных стратегических игр — Archmage. Появилась аж в 1998г. Три типа юнитов: наземные, летающие и стрелки. Около сотни разных видов юнитов с десятком параметров и несколькими видами атак у каждого, более полусотни боевых заклинаний поддержки и атаки, герои возглавляющие отряды и меняющие их параметры.

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

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

                                    +1
                                    Ну схема не моя а ТС.
                                    Но я буквально пару месяцев назад играл в браузерку где такая логика имела место.
                                    Там было около 5 категорий юнитов + два основных параметра (защита/нападение).
                                    Различных юнитов там тоже было под тысячу, плюс разные модификаторы развития и всё такое, но если взять математику, то
                                    это просто влияет на коэффициенты k1 и k2.
                                    Реально выходит просто что у нас не два уравнения по одному на каждую армию, а десять (под 5 на армию).
                                    Заклинания опять таки в основном действуют как модификаторы параметров в конце-концов приводящие к изменению коэффициентов или дают урон вначале, или если действуют периодически, то по сути представляют из себя отдельный вид юнитов, который можно или присоединить к существующим или вынести отдельной строкой.

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

                                    В реальности большая часть математики может уложится в относительно разумное усложнение модели. Ну пусть будет даже 20 однотипных дифуров. Если логика детерминированна, то формулы будут относительно простые на выходе… Да, надо будет повозиться, но зато нагрузка на систему будет заметно ниже.

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

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

                                    Выделил арту для артподготовки, собрал отряд, выслал на участок фронта, переключился на следующую задачу, через определенное время получил донесение… Всё.
                                    +1
                                    «Столкнулись армии, их посчитали и выдали результат.» — это нормально. А вот «а когда никто не смотрит, а нужен только результат, то почему бы его и не взять по формуле?» — это баг, который может погубить игру.

                                    Полк пикинеров либо держит удар тяжелой конницы — либо нет. Не должно быть такого, что в режиме визуализации он отбивает все атаки, а в режиме быстрого боя несет тяжелые потери (или наоборот). Потому что в таком случае игровая механика будет либо заставлять игрока тратить время на просмотр всех боев, затягивая игру — либо напротив, перечеркнет старания разработчиков, делавших такую красивую визуализацию.
                                      +1
                                      Ну я собственно с этим тезисом и не спорил.
                                      Если во время боя игрок пусть даже и наблюдает за игрой, но вмешаться уже не может, то моделирование не вызывает никаких проблем — и там и там должна быть одинаковая игровая механика.
                                      Если он вмешаться может, то… а собственно ничего не меняется. Если он не наблюдает, то он НЕ ВМЕШИВАЕТСЯ. Так что расчет идет по модели где параметр «действия игрока» равен нулю, и отыгрывается дефолтная картина боя. Вмешался? Считаем в реалтайме, пока вмешивается. Вмешивается периодически? Ну когда смотрит, тогда мы считаем что произошло за время пока он не смотрел, это можно по формуле, а дальше реалтайм. «отвернулся» — опять всё замерло. Вернулся смотреть — опять считаем что произошло, и опять реалтайм.

                                      Я сейчас в свободное от работы время играюсь с нейросетями с импульсным спайком и некоторыми другими свойствами внутренней механики сходными с живыми прототипами. Идея о том, что пока не будет входящего сигнала, спайка не будет, значит всё что происходит с ним за это время не повлияет на внешний мир, и можно рассчитать всю динамику ретроспективно когда он получит фокус (сигнал на вход) — очень экономит вычислительные мощности. Я бы сказал качественно экономит.
                                        0
                                        Полагать параметр «действие игрока» равным нулю — и полностью менять механику боя — это немного разные вещи, не находите?

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

                                    Конечно, не должен. Никто и не предлагал так делать всегда. Я рассмотрел в статье возможность упрощенной симуляции, когда не ведется наблюдение, но в каждом конкретном случае решение должно приниматься разработчиком исходя из того, чтобы не нарушить игровую динамику.
                                      0
                                      «Иногда» так тоже не следует делать.
                                        0
                                        Если результат упрощенного моделирования боя с высокой точностью совпадает с результатом, полученным при непосредственной симуляции — то можно.
                                          0
                                          Вы никогда не обеспечите достаточной точности, подменяя агентное моделирование системной динамикой.
                                            0
                                            Все зависит от целей и масштабов моделирования и, особенно, количества агентов. Если оно велико — то затраты на индивидуальное моделирование агентов могут просто себя не оправдать. Возьмем, например, термодинамику и статистическую физику. Вы можете моделировать тепловые явления исходя из механики составляющих тела частиц, но, чем больше в системе частиц — тем более затратно будут даваться результаты. И тем меньше будет их расхождение с результатами статистической физики. На определенном этапе будет даже иметь смысл перейти к термодинамике с ее еще более упрощенными моделями.
                                              0
                                              Если исходная модель реализована в таком виде — ради бога. Но нельзя использовать один подход когда игрок смотрит — а второй когда никто не видит.
                                                0
                                                При условии статистической неразличимости результатов — можно.
                                                  0
                                                  Вы не сможете достичь статистической неразличимости результатов агентного и системного подходов на тех количествах агентов, которые допускают использование агентного подхода в реальном времени.
                                                    0
                                                    Ничто не мешает попытаться и проверить. Ну разве если только вы мне представите доказательства невозможности — тогда можно сразу отказаться от попыток.
                                            +1
                                            Это гарантированно приведет к недовольству, т.к. правила игры, разумеется, не будут описывать такие «тонкости», и игрок, положившись на правила, будет очень недоволен (я бы сказал — разъярен), если комп хоть чуточку насрет на свои же правила в каком-нибудь специфическом случае, где, по расчетам игрока на основе правил, ему гарантирована победа. Это во многих играх есть и капец, как неприятно — такое впечатление, что тебе плюют в лицо. Поэтому применять такие упрощения нужно крайне аккуратно.
                                              0
                                              Разумеется, в любом деле нужен аккуратный подход.
                                                0
                                                Восемь категорий юнитов (пехота, стрелки, арта, пушки, броня, заклинания, драконы).
                                                В каждой категории по две сотни видов юнитов.
                                                У каждого юнита есть параметры атаки, параметры обороны, параметры брони от каждой категории юнитов (т.е. 16 параметров у каждого, насколько эффективен против таких то, и насколько они эффективны против него), плюс уровень здоровья и процент повреждений, который нелинейно влияет на эффективность юнита в бою (он же «усталось», потому что повреждения восстанавливаются со временем). Постоянно действующие апдейты зданий изменяющие эти самые параметры по определенным законам.
                                                Добавим к этому еще пару каких-то относительно простых законов нашего игрового мира.
                                                Всё это даст нам систему из двух десятков дифуров которые решаются до такого же количества формул, дающих достаточно точный результат…

                                                К чему я всё это? Да так, мне просто интересно посмотреть на того игрока, который в уме просчитает такую математику точнее чем мат.модель на дифурах, и обидится на небольшую неточность в результате…

                                                ПС: можно еще динамически делить категории, тогда можно сделать модификаторы типа «эффективенность против королевских эльфийских дровосеков +50», что не очень усложнит математику, ведь формулы довольно однородны.
                                                  +2
                                                  Можно не в уме считать, а использовать save/load. Когда сюжетная компания пройдена, бывает интересно провести некоторые бои идеально. И когда спустя два часа попыток обнаруживается, что результат боя зависит не столько от твоих оптимизаций, сколько, к примеру, от настроек графики…

                                      Only users with full accounts can post comments. Log in, please.