Вступление
Доктор в ФА13 играет немаловажную роль. На его плечах лежат две функции. Первая это заниматься здоровьем игрока и непосредственно поднимать его до отметки 100, а вторая это помогать игроку восстановиться после тяжёлой травмы, когда физа игрока падает до отметки 70 и ниже.
В газете Футбольной Ассоциации есть отличная статья (и прилагаемый файл с электронной таблицей) о докторе, которая бесспорно поможет менеджеру выбрать оптимального доктора для команды. В статье, которую сейчас изучает читатель, я постараюсь разобраться, какого доктора оптимальнее всего держать в команде используя иной, не теоретический, а практичный, прикладной подход, основанный на тестировании и прогонках тренировок с помощью программирования.
TL;DR или «ниасилил, многабукаф»
В следующем абзаце я вкратце изложу свои выводы для тех, кому интересен результат без деталей эксперимента.
Выяснилось, что оптимальнее всего нанимать доктора с квалификацией k2 (кол-во игроков, лечимых за одну виртуальную неделю) равной количеству игроков в команде со здоровьем, меньшим чем 100 единиц. Если же в команде есть хотя бы один игрок со здоровьем 99, то в таком случае имеет смысл нанят доктора с квалификацией k2 равной количеству игроков со здоровьем, меньшим чем 100 единиц, минус один. Тем не менее, в большинстве случаев, k2 не должно быть меньше 3 либо же превышать 7 или 8. Что же касается квалификации k1 (уровень лечения), она может варьироваться и зависит, пожалуй, только от денежных запасов клуба.
Рекомендую все же прочитать статью целиком для полного понимая, как в ФА работает доктор и как его оптимизировать под нужды команды.
О докторе
Статью можно начать с выписки из правил о докторе:
«Доктор помогает восстанавливать подорванное здоровье игроков, а также помогает восстановиться травмированным игрокам (с физой < 70).»
В самой статье я бы хотел сфокусировать свое внимание именно на восстановлении здоровья (несмотря на то, что доктор играет большую роль в восстановлении физы травмированного игрока), потому что травмированных игроков в команде зачастую мало или вообще нет. Если же такие игроки регулярно есть, делайте на это поправку.
Из правил также становится понятно, что доктор имеет двойную квалификацию (k1 и k2): k1 ― уровень лечения, k2 ― кол-во игроков, лечимых за одну виртуальную неделю. Давайте сначала рассмотрим квалификацию k1.
k1
Квалификация k1, то есть уровень лечения, используется в формуле вероятности лечения игрока:
2 + w × 27, где w = arctan (k1 / 5) × 2 / pi
За одну тренировку здоровье игрока поднимается на 1 единицу, если:
Random (100) < 2 + w × 27, где w = arctan (k1 / 5) × 2 / pi
То есть, если вероятность лечения будет меньше (звучит противоречиво), чем случайно сгенерированное число от 1 до 100, то здоровье игрока будет поднято на 1 единицу.
Рассчитаем значение вероятности лечения игрока для квалификации k1 от 1 до 20.
С ростом уровня лечения доктора, вероятность лечения растет, но рост ее замедляется и после при k1 равно 8, с каждым шагом растет меньше чем на единицу. С этого следует, что держать доктора с уровнем лечение больше 8, пожалуй, не стоит, так как рост его зарплаты, с ростом его уровня лечения, не соответствует росту вероятности лечения.
Random (100)
Дальше я хотел бы рассмотреть, насколько хорошо функция генерации случайных чисел работает в языке программирования Python, поскольку это важно для дальнейших подсчетов, и связать ее с формулой вероятности лечения. Для этого я попробовал полечить одного игрока 10 миллионов раз, зафиксировать, сколько раз мне это удалось и вот что у меня получилось.
То есть, доктор с уровнем лечения 1 должен лечить игрока по формуле с вероятностью 5.39. У меня после 10 миллионов лечений эта вероятность составила 5.01. В таблице выше можно посмотреть вероятность лечения для других значений уровня лечения доктора от 1 до 20.
Как видно, погрешность есть, но небольшая и я решил ее проигнорировать и продолжить эксперимент. Тем более, что мне не известна погрешность функции генерации случайных чисел, которая используется в ФА13.
k2
Перейдем к квалификации k2. В правилах говорится, что каждую неделю из числа травмированных игроков и тех игроков, чьё здоровье меньше 100, случайно выбирается k2 число игроков, которые будут лечиться доктором. Давайте сразу откинем травмированных игроков по причинам, описанным выше, и будем работать только с игроками, здоровье которых меньше 100 единиц. Опять-таки, если же игроки в команде регулярно травмируются, то есть физа падает до отметки 70 и ниже, делайте на это поправку.
Имитация тренировок
Здесь я хотел бы разобраться в вопросе соотношения уровня лечения и количества игроков, которые будут подвергаться лечению. То есть, я хочу понять, какой доктор лучше, например, 6/4 или 4/6. Или может 5/5?
Для эксперимента я допустил, что в команде всегда есть кого лечить. Если же нет, то согласитесь, что, держа доктора с квалификацией k2 (кол-во игроков, лечимых за одну виртуальную неделю) большей, чем количество игроков со здоровьем, меньшим 100 единиц, это деньги на ветер. В таком случае лучше понизить k2 до значения, равному количеству игроков в команде со здоровьем, меньшим чем 100 единиц, и за счет этого поднять k1, что улучшит вероятность лечения.
Для этого я создал следующую таблицу. По одной оси у нас уровень лечения, а по другой – количество лечимых игроков. Эту таблицу можно было сделать математическим подходом с помощью простого умножения вероятности лечения (с таблицы выше) на количество игроков, но мне захотелось сделать это с помощью программы и таким образом приблизить эксперимент к реальности. В ячейках – процентное соотношение от количества тренировок (10 миллионов) и единиц поднятого здоровья.
То есть доктор с квалификациями 1/1 за 10 миллионов тренировок поднял 501000 единиц здоровья, это 5.01% (от 10 млн.). А доктор с квалификациями 20/10 за 10 миллионов тренировок поднял 239.99% (от 10 млн.) единиц здоровья.
На самом деле не важно, сколько тренировок будет проведено, дальше нам лишь важно процентное соотношение. На этом этапе можно ввести новое понятие и назвать его Коэффициент Полезного Действия (КПД) доктора. То есть, КПД доктора 1/1 равно 5.01, а доктора 20/10 – 239. 99. Я буду использовать это понятие дальше.
Оптимальный доктор
Понятно, что доктор с квалификациями 20/10 лучше, чем доктор с квалификациями 1/1, но и зарплата такого доктора в разы больше. Значить, надо искать золотую середину. Только она не одинакова для всех команд. Более того, она не постоянная для одной команды на протяжении сезона, потому что количество игроков со слабым здоровьем в команде меняется.
Надо также понимать, что повышение одной из квалификаций доктора, при этом не понижая другую, стоит денег. Исходя из этого, увольнять доктора на одном ДПП и нанимать на другом, это дорого. Но у менеджера есть возможность сменить квалификации доктора (k1 и k2) без лишних бюджетных затрат, когда сумма квалификаций (k1 + k2), после их изменения, не меняется. Значит, осталось найти вот эту самую сумму квалификаций (k1 + k2), которая будет оптимальной для команды. Она может зависеть от многих факторов, в том числе от того, сколько игроков в команде и на сколько фронтов она играет, насколько усердно игроки тренируются, да и от казны клуба тоже. Делая этот эксперимент, я не ставил перед собой задачу ее найти и предлагаю отталкиваться от той суммы квалификаций, которая есть на данный момент в клубе и изменять ее со временем. Или же можно воспользоваться файлом, приложенным к статье, о которой я упоминал во вступлении.
Итак, у нас есть сумма квалификаций, которая должна оставаться постоянной, при условии, что она оптимальна для данной команды. При необходимости, ее, конечно же, можно подкорректировать. Дальше предлагаю искать оптимальное значение k2 (количество игроков) и k1 (уровень лечения). Начать можно с k2, так как оно, в большинстве случаев, будет равно количеству игроков в команде со здоровьем, меньшим чем 100 единиц. Поскольку число таких игроков будет меняться, то k2 и k1 следует пересматривать на каждом дне построек и приглашений исходя из расчетов в таблице выше.
Есть один нюанс, который я еще не изучил на практике, но мне кажется логичным следующее. Если в команде есть хотя бы один игрок со здоровьем 99, то в таком случае имеет смысл нанят доктора с квалификацией k2 равной количеству игроков со здоровьем, меньшим чем 100 единиц, минус один. В противном случае, доктор может излечить такого игрока и его здоровье станет равно 100, такой игрок больше не будет учувствовать в тренировках оздоровления и его место окажется свободным. КПД доктора при этом упадет. С другой стороны, это место вскоре может быть занято в случае, если тот же или другой игрок получит травму и его здоровье опустится с отметки 100.
Пример
Выше было написано много слов, ниже их тоже будет немало, но давайте все же перейдем к практике и рассмотрим пример. Допустим, что у команды есть доктор с квалификациями 7/3. То есть уровень лечения равен 7, а количество игроков, принимающих участие в оздоровительных тренировках равно 3. Также допустим, что на данный момент у команды имеется 5 игроков со здоровьем, меньшим чем 100 единиц. И хотя бы у одного из этих игроков здоровье равно 99.
Используя таблицу выше, можно узнать, что КПД (понятие, которое было введено ранее) такого доктора равно 54.07. И такой доктор способен за одну тренировку лечить только 3 игроков при 5 больных. А что, если попробовать лечить больше игроков, например, доктором 6/4. КПД такого доктора равно 68.11, что больше предыдущего. Сумма квалификаций при этом не измениться, а, значит, на бюджет клуба не повлияет, но больше шансов на то, что игроки излечатся быстрее. А если рассмотреть доктора с квалификациями 5/5, КПД которого составит 74.92. Здесь уже не все так однозначно, хоть и КПД у него больше, он может достаточно быстро полечить игрока со здоровьем 99, и оно станет равно 100. Больных игроков станет 4, и доктор фактически будет работать с квалификациями 5/4. А КПД такого доктора равно 59.98 и он будет медленнее лечить оставшихся игроков. Логичным, пожалуй, в таком случае, будет оставить доктора с квалификациями 6/4.
Рассмотрим другой пример, с таким же доктором 7/3 и с такой же суммой квалификаций, равной 10, только на это раз у команды имеется только 2 игрока со здоровьем, меньшим чем 100 единиц. Такой доктор лечит игроков с КПД 36.11 (по сути, это КПД доктора 7/2). Используя подход выше, казалось, правильным был бы шаг уменьшить квалификацию k2 до 2 или даже 1. Но данный подход не работает, если k2 становиться слишком маленьким, поскольку количество больных игроков в команде практически всегда больше, чем 1 или 2 и может опускаться до такого уровня лишь иногда, но практически никогда там не задерживается. Если все же изменить квалификации доктора на 8/2, его КПД станет 37.95. Это больше, чем КПД 36.11, но ненамного. Это ничтожно малая разница и такой ход будет неуместен, поскольку количество больных игроков может стремительно пойти вверх. В данном случае, пожалуй, имеет смысл не менять квалификации доктора, либо же наоборот увеличить k2 до 4.
И наконец последний пример, с таким же доктором 7/3 и с такой же суммой квалификаций, равной 10, только на это раз у команды имеется 8 игроков со здоровьем, меньшим чем 100 единиц. Сразу же можно посмотреть на КПД доктора 2/8, оно равно 64.06, что само по себе очень даже неплохо. Но как только количество больных игроков начнет уменьшаться, КПД такого доктора начнет стремительно падать - 56.1 при 7 игроках, 48 при 6 и 39.96 при 5. В таком случае, пожалуй, стоит принять это к сведенью и заранее подготовить доктора для лечения только 7 или даже 6 игроков.
Выводы
Их несколько.
Оптимальнее всего нанимать доктора с квалификацией k2 (кол-во игроков, лечимых за одну виртуальную неделю) равной количеству игроков в команде со здоровьем, меньшим чем 100 единиц. Если же в команде есть хотя бы один игрок со здоровьем 99, то в таком случае имеет смысл нанят доктора с квалификацией k2 равной количеству игроков со здоровьем, меньшим чем 100 единиц, минус один. Тем не менее, в большинстве случаев, k2 не должно быть меньше 3 либо же превышать 7 или 8.
Что же касается квалификации k1 (уровень лечения), она может варьироваться и зависит, пожалуй, только от денежных запасов клуба.
Не стоит постоянно увольнять, а затем нанимать доктора, нужно лишь найти ту самую золотую середину – сумму квалификаций, и менять квалификации так, чтобы сумма их не менялась. k2 и k1 следует пересматривать на каждом дне построек и приглашений.
Имею на вооружении таблицу КПД доктора и знание принципов работы доктора, описанных в этой статье, можно с легкостью подбирать нужные квалификации.
Приложение
Для вычислений использовался язык программирования Python, а для генерации случайных чисел его функция random.randint().
Код
Для прогона оздоровительных тренировок использовался следующий код.
Вероятность лечения
print('Уровень лечения;Вероятность лечения')
for k1 in range(1, 21):
print(k1, ';', round((2 + math.atan(k1 / 5) * 2 / math.pi * 27), 2))
Функция Random (%)
print('Уровень лечения;Вылечено;Процент')
for k1 in range(1, 21):
healthRestored = 0
for trainingSessions in range(10000000):
if random.randint(1, 100) < 2 + math.atan(k1 / 5) * 2 / math.pi * 27:
healthRestored = healthRestored + 1
print(k1, ';', healthRestored, ';', round(healthRestored / 10000000 * 100, 2))
Имитация тренировок для всех докторов
for k2 in range(1, 11): # количество игроков от 1 до 10
for k1 in range(1, 21): # уровень лечения от 1 до 20
healthRestored = 0
for trainingSessions in range(1000000):
for x in range(k2):
if random.randint(1, 100) < 2 + math.atan(k1 / 5) * 2 / math.pi * 27:
healthRestored = healthRestored + 1
print('После 10 миллионов тренировок доктор с квалификацией', k1, '/', k2, 'поднял', healthRestored,
'единиц здоровья.', 'Процентное соотношение:', round(healthRestored / 10000000 * 100, 2))
Имитация тренировок для одного доктора
class Doctor:
k1 = int
k2 = int
healthRestored = int
d = Doctor
d.k1 = 1 # уровень лечения
d.k2 = 1 # количество игроков
d.healthRestored = 0 # единиц поднятого здоровья
for trainingSessions in range(10000000):
for x in range(d.k2):
if random.randint(1, 100) < 2 + math.atan(d.k1 / 5) * 2 / math.pi * 27:
d.healthRestored = d.healthRestored + 1
print('После 10 миллионов тренировок доктор с квалификацией', d.k1, '/', d.k2, 'поднял', d.healthRestored,
'единиц здоровья.', 'Процентное соотношение:', d.healthRestored / 10000000 * 100)
Вложение
Данную статью можно скачать в PDF формате по ссылке:
https://nextcloud.serhiy.eu/s/4fo4e28JcdGk8qE