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

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

Описание рассматриваемых случаев

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

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

Список событий для установления количества фабрик от торговли

1 установить_торговлю 18
120 установить_торговлю 10
210 установить_торговлю 7
365 установить_торговлю 5
730 установить_торговлю 9
1100 установить_торговлю 13
1450 установить_торговлю 25
1800 установить_торговлю 18

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

Список событий для улучшения технологий

188 construction_tech # технология строительства 1
328 industry_tech # технология индустрии 1
511 construction_tech # технология строительства 2
511 industry_tech # технология индустрии 2
1285 construction_tech # технология строительства 3
1285 industry_tech # технология индустрии 3
1950 construction_tech # технология строительства 4
1950 industry_tech # технология индустрии 4

В-третьих, обратим внимание на фокусы. Рассмотрим 4 варианта:
1) Стандартное быстрое закрытие паранойи с советником на гражданское строительство и частичной мобилизацией
2) Оно же, но дополнительно поставим свободную торговлю, когда будет политка
3) Также быстро закрываем паранойю, но частичную мобилизацию берем до советника на гражданское строительство (это будет стоить нам 30 политки)
4) Вообще никаких фокусов не берем, только советник и частичная мобилизация.

1 вариант. Быстрое закрытие паранойи

sov # тэг страны.
140 добавить_гражданского_советника # если идти по пути Сталина то политки как раз хватает
245 продвинуть_экономику # ранняя
245 продвинуть_экономику # частичная
350 добавить_товары_народного_потребления -0.02 # фокус ветки паранойи
350 добавить_лимит_фабрик 0.1 # фокус ветки паранойи
350 добавить_бонус_строительства 0.05 # фокус ветки паранойи
350 добавить_фабрики 2 # фокус ветки паранойи
540 продвинуть_экономику # фокус на военную экономику
540 добавить_военные_заводы 2 # +2 военные фабрики от фокуса на военную экономику

2 вариант. Добавляем свободную торговлю

sov
140 добавить_гражданского_советника # если идти по пути сталина то полики как раз хватает
245 продвинуть_экономику # ранняя
245 продвинуть_экономику # частичная
320 pull_trade # можно поставить свободную торговлю
350 добавить_товары_народного_потребления -0.02 # фокус ветки паранои
350 добавить_лимит_фабрик 0.1 # фокус ветки паранои
350 добавить_бонус_строительства 0.05 # фокус ветки паранои
350 добавить_фабрики 2 # фокус ветки паранои
540 продвинуть_экономику # фокус на военную экономику
540 добавить_военные_заводы 2 # +2 военные фабрики от фокуса на военную экономику

3 вариант. Сначала мобилизация потом советник

sov
245 добавить_гражданского_советника
140 продвинуть_экономику # ранняя
140 продвинуть_экономику # частичная
#320 pull_trade # можно поставить свободную торговлю
350 добавить_товары_народного_потребления -0.02 # фокус ветки паранои
350 добавить_лимит_фабрик 0.1 # фокус ветки паранои
350 добавить_бонус_строительства 0.05 # фокус ветки паранои
350 добавить_фабрики 2 # фокус ветки паранои
540 продвинуть_экономику # фокус на военную экономику
540 добавить_военные_заводы 2 # +2 военные фабрики от фокуса на военную экономику

4 вариант. Обходимся без фокусов

sov
245 добавить_гражданского_советника # если идти по пути сталина то полики как раз хватает
140 продвинуть_экономику # ранняя
140 продвинуть_экономику # частичная

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

Изучение результатов симуляции

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

Срок - 5 лет с 1 января 1936 по 1 января 1941. x: количество построенных фабрик, y: количество построенных военных заводов.
Срок - 5 лет с 1 января 1936 по 1 января 1941.
x: количество построенных фабрик, y: количество построенных военных заводов.

Видим что 5% от свободной торговли дают нам лишь 4 завода, при том что 2 завода мы можем получить за 30 политки, просто взяв частичную мобилизацию до советника. Скупают ресурсы у СССР или не так активно чтобы свободная торговля была в плюс, или слишком поздно, когда ресурсы уже нужны для производства.

Также видим что бонусы от фокусов в ветке паранойи дают большое преимущество: 116 заводов против 145 (если мы не берем скидку, то нет смысла брать советника до мобилизации экономики). Честно говоря, не ожидал такой разницы, бонусы не выглядели для меня настолько сильными (+5% к скорости строительства, -2% тнп, 10% к лимиту зданий в провинции, 2 фабрики, 2 завода). Товаров народного потребления дают не так много, +5% это как бонус от свободной торговли, места под строительство у СССР и так хватает. Но в сумме разница выходит почти в 30 заводов.

Ну и самое важное: видим малые производные на достаточно широком участке. В сущности, при строительстве от 28 до 50 фабрик, количество военных заводов на 1 января 1941 года остаётся +/- стабильным.

Более подробное изучение свойств внутриигровой экономики

Как было сказано выше, количество заводов относительно постоянно на участке от 28 фабрик до 50 фабрик, рассмотрим это две точки подробнее:

случай 1 - 28 фабрик, случай 2 - 50 фабрикx: дни, y: количество фабрик/военных заводов
случай 1 - 28 фабрик, случай 2 - 50 фабрик
x: дни, y: количество фабрик/военных заводов

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

О инфраструктуре

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

Код для оценки выгоды инфраструктуры


MILITARY_FACTORY_COST = 7200
FACTORY_COST = 10800
INFRASTRUCTURE_COST = 6000

BUILDING_COST = MILITARY_FACTORY_COST


def get_cost_of_construction(
        building_slots, building_cost,
        start_infrastructure, end_infrastructure,
):
    total_cost_without_inf = (
        building_slots * building_cost / (1 + 0.2 * start_infrastructure)
    )
    total_cost_with_inf = 0
    for inf in range(start_infrastructure, end_infrastructure):
        total_cost_with_inf += INFRASTRUCTURE_COST / (1 + 0.2 * inf)
    total_cost_with_inf += (
        building_slots * building_cost / (1 + 0.2 * end_infrastructure)
    )
    return total_cost_without_inf, total_cost_with_inf


for start_inf in range(5):
    print(
        f"Начальная инфраструктура региона - {start_inf}."
    )
    for slots in range(10):
        best_result = 0
        amount_of_inf_to_build = 0
        for end_inf in range(start_inf, 6):
            x, y = get_cost_of_construction(
                slots, BUILDING_COST, start_inf, end_inf
            )  # x без инфр, y с инфр
            if x > y and best_result < (x-y):
                best_result = int(x-y)
                amount_of_inf_to_build = end_inf - start_inf
        if best_result > 0:
            print(
                f"Кол слотов: {slots}, строим инфр: {amount_of_inf_to_build}, "
                f"выгода: {best_result}"
            )

Отдельно отмечу, что приведенный выше код не учитывает что построенные в процессе фабрики тоже будут строить.

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

Выводы

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

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

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

Графический интерфейс, readme.txt, репозиторий

С интерфейсом пока всё совсем не здорово. Идеи приходящие мне в голову или звучат очень сложно или звучат еще менее удобно чем редактирование текстовых файлов. Так что gui пока застопорился.

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

Весь код репозитория распространяется по лицензии MIT, которая гласит следующее: "делайте с кодом что хотите, но не надо из-за него со мной судиться". В общем, свободное ПО и всё такое, развлекайтесь, если хотите.

Комментарии (7)


  1. MAXH0
    02.06.2024 18:23
    +2

    Как и зачем Сталин расстреливает в игре случайных генералов?

    Потому что разработчики так захотели. Вот упомянуть холокост при игре за Германию посчитали не этичным, а шуточки про штрафбаты и паранойю Сталина - самое то!


    1. Glasssparrow Автор
      02.06.2024 18:23

      Да, это правда. Но на грустном мне заканчивать статью не хотелось, поэтому я предпочел закончить сатирой.


  1. ion2
    02.06.2024 18:23

    Неуместная голосовалка. Репрессии в армии очень дорого ударили по нам в 1941-1942 годах. Неудачный повод для шуток.


    1. Glasssparrow Автор
      02.06.2024 18:23
      +2

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


      1. ion2
        02.06.2024 18:23

        У вас шутка из разряда "Она утонула".


        1. Glasssparrow Автор
          02.06.2024 18:23
          +1

          Сразу видно человека не игравшего в игру (может, конечно, человека без чувства юмора, но судя по первому комментарию, все же не игравшего в игру или, как минимум, не видевшего переработанные фокусы СССР).


    1. MAXH0
      02.06.2024 18:23
      +3

      Не неуместная голосовалка, а неуместная игровая механика. Разработчики захотели в политоту. Причём в одностороннею политоту. С учетом однозначных военных преступлений стран Оси о которых в игре ни слова - это выглядит странно.