Перейти к содержимому
Для публикации в этом разделе необходимо провести 50 боёв.
qMBQx8GH

Немного математики в применении к новым рангам.

В этой теме 31 комментарий

Рекомендуемые комментарии

1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв

Всем привет!

 

Вот и случилось, то что все давно ждали, а именно изменение системы ранговых боёв.

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

 

А вот на сколько больше боёв надо сделать?

И тут нам на помощь приходит математика.

 

Вооружаемся цепями Маркова, это такой не сложный статистический метод оценки вероятности перехода системы между состояниями.

А продвижение по ранговой лестнице с получением и потерей звёзд и есть переходы между "состояниями".

 

Запускаем python ноутбук с установленными пакетами numpy и matplotlib (поищите по словам python jupyter).

Копипастим немного кода раз:

Скрытый текст

# подключаем библиотеки
import numpy as np
import matplotlib.pyplot as plt

### вспомогательные функции ###

# функция составляющая на основании правил граф переходов между состояниями
def make_states(rank_rules):
    states = []
    for rank in rank_rules:
        for star_num in range(rank_rules[rank]['stars']):
            states.append({
                'rank': rank,
                'star_num': star_num,
                'is_safe': (star_num == 0) and (rank_rules[rank]['is_safe'] == 1),
            })
    return states

# матрица переходов между состояниями
def make_transition_matrix(states, win_rate):
    # заполняем нулями
    P = np.zeros((len(states), len(states)))

    # в случае победы переходим в новое состояние:
    for i in range(len(states)-1):
        P[i][i + 1] = win_rate

    # в случае поражения остаёмся в текущем:
    for i in range(len(states)-1):
        # при условии несгораемого ранга
        if states[i]['is_safe']:
            P[i][i] = 1.0 - win_rate
        elif i > 0: # или переходим в предыдущее
            P[i][i - 1] = 1.0 - win_rate
    # для первого ранга вероятность 100%
    P[len(states)-1][len(states)-1] = 1.0
    return P

# построение графика вероятности получения первого ранга
def make_plot(rank_rules, win_rate, limit):
    states = make_states(rank_rules)
    P = make_transition_matrix(states, win_rate) 

    N = P.copy()
    X = []
    Y = []
    x = 1.0
    while True:
        y = N[0][len(states)-1]
        X.append(x)
        Y.append(y)
        if y > limit:
            break
        N = np.matmul(P, N)
        x += 1.0
    return X,Y

 

 

и два:
 

Скрытый текст

# правила лиги:
ranks = {
    'bronse': {
        7: {'stars': 1, 'is_safe': 1},
        6: {'stars': 1, 'is_safe': 1},
        5: {'stars': 1, 'is_safe': 1},
        4: {'stars': 2, 'is_safe': 0},
        3: {'stars': 2, 'is_safe': 1},
        2: {'stars': 2, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
    'silver': {
        7: {'stars': 1, 'is_safe': 1},
        6: {'stars': 2, 'is_safe': 0},
        5: {'stars': 2, 'is_safe': 1},
        4: {'stars': 2, 'is_safe': 0},
        3: {'stars': 2, 'is_safe': 0},
        2: {'stars': 3, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
    'gold': {
        10: {'stars': 1, 'is_safe': 1},
        9: {'stars': 2, 'is_safe': 0},
        8: {'stars': 2, 'is_safe': 0},
        7: {'stars': 2, 'is_safe': 0},
        6: {'stars': 2, 'is_safe': 0},
        5: {'stars': 2, 'is_safe': 0},
        4: {'stars': 2, 'is_safe': 0},
        3: {'stars': 3, 'is_safe': 0},
        2: {'stars': 3, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
}

# параметры игрока:
win_rate = 0.5

# строим графики вероятности получения 1-го ранга на N боёв
lines = []
for league in ['bronse', 'silver', 'gold']:
    X, Y = make_plot(ranks[league], win_rate, 0.99)
    line, = plt.plot(X, Y, label='{} ({})'.format(league, X[-1]))
    lines.append(line)

plt.legend(handles=lines, loc='lower right')
plt.grid(b=True, color='black', alpha=0.3, linestyle='-', linewidth=1)
plt.show()

 

 

И можно наглядно увидеть сколько боёв для достижения первого ранга с вероятностью 99% надо сделать.

 

45%:

Скрытый текст

image.png.fd679028ec777bcb4b1ddecebdd5b636.png

50%:

Скрытый текст

image.png.0f72c133b6585187989c6a8ef489a28e.png

65%:

Скрытый текст

image.png.aa702c7d742ec6aadd843f8937a98727.png

 

Всем удачи в боях!

 

С уважением, Максим

 

PS: пояснение по осям графиков:

стоя - вероятность

лёжа - количество боёв

 

PPS: модель не учитывает механику сохранения звёзд, но пытливый человек сможет легко её "прикрутить"

  • Плюс 18
  • Круто 2
  • Ха-Ха 2

Рассказать о публикации


Ссылка на публикацию
2 608
[-GG-]
Бета-тестер
3 778 публикаций
18 631 бой

Спасибо за расчеты, но увы я гуманитарий:Smile_sad:

  • Круто 1
  • Ха-Ха 2

Рассказать о публикации


Ссылка на публикацию
1 731
[GANG]
Участник
1 074 публикации
19 396 боёв

пили уж кулькулятор сразу, чтоб циферки подставлять

  • Плюс 1
  • Круто 1
  • Ха-Ха 1

Рассказать о публикации


Ссылка на публикацию
1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв
Сегодня в 16:13:22 пользователь kostyn80 сказал:

Или это спецом , для разного читателя ?

привет! Совершенно верно - чисто разбавить "сухой" текст))

можно было про абсцисс и ординат конечно))

  • Круто 1
  • Ха-Ха 1

Рассказать о публикации


Ссылка на публикацию
39 015
[9-MAY]
Старший бета-тестер, Коллекционер
8 383 публикации

Вот и берут потом таких в Лесту, а мы мучаемся :cap_cool:

  • Ха-Ха 7

Рассказать о публикации


Ссылка на публикацию
3 735
[GAZ3L]
Участник
1 783 публикации
19 959 боёв

если держать 50% в рангах, значит чтобы закончить золотым дипломом мне нужно 1300 боёв...? моя не понимать... 

Рассказать о публикации


Ссылка на публикацию
1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв
Сегодня в 16:14:31 пользователь TomoGavkus сказал:

пили уж кулькулятор сразу, чтоб циферки подставлять

Не уверен, что стОит времени на полноценную разработку.

Речь ведь о чисто умозрительных вероятностях.

Может просто повезти и я со своими 50% закончу бронзу за 10-15 боёв (1 на 1000 но может).

 

Это упражнение для оценки порядка сложности прохождения лиг.

 

С уважением, Максим

Сегодня в 16:35:27 пользователь Tolik_koromyslo сказал:

Вот и берут потом таких в Лесту, а мы мучаемся

Старый я для Лесты :cap_old:

  • Круто 1
  • Ха-Ха 1

Рассказать о публикации


Ссылка на публикацию
63
[DOG44]
Участник
31 публикация
6 520 боёв

Спасибо за расчеты))

Интересно было бы сравнение с прежней системой рангов. Больше или меньше нужно сыграть боев для 1 ранга. Может уже считали раньше?

Изменено пользователем Puzan_s_motorom
  • Плюс 1
  • Круто 1

Рассказать о публикации


Ссылка на публикацию
39 015
[9-MAY]
Старший бета-тестер, Коллекционер
8 383 публикации
Сегодня в 16:43:10 пользователь Puzan_s_motorom сказал:

Спасибо за расчеты))

Интересно было бы сравнение с прежней системой рангов. Больше или меньше нужно сыграть боев для 1 ранга. Может уже считали раньше?

Поддержу!

Интересно сравнить.

Рассказать о публикации


Ссылка на публикацию
1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв
Сегодня в 16:43:10 пользователь Puzan_s_motorom сказал:

Может уже считали раньше?

Очень давно для второго или третьего сезона делал чисто для себя расчёты.

Боюсь, что результаты не сохранил.

Сегодня в 16:43:10 пользователь Puzan_s_motorom сказал:

с прежней системой рангов

Поищу инфу по прогрессу (количество рангов, несгораемые и кол-во звёзд).

Если найду, то посчитать уже не долго будет

Рассказать о публикации


Ссылка на публикацию
Гость
Гость
0 публикаций

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

  • Круто 1
  • Ха-Ха 1

Рассказать о публикации


Ссылка на публикацию
1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв

Ух ты как интересно получилось:

 

для 50% сравнение с 16-м сезоном:

Скрытый текст

image.png.b806204c81a25af0cc9c8029c273e969.png

получается, что новая система в РАЗЫ лояльнее к игрокам.

 

65%:

Скрытый текст

image.png.ea1a187ff0234622fc0fbd243329afc5.png

с повышением винрейта пропорция лояльности рангов снижается :cap_cool:

Сегодня в 16:55:18 пользователь Hans012 сказал:

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

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

Изменено пользователем qMBQx8GH_real
  • Круто 1

Рассказать о публикации


Ссылка на публикацию
Гость
Гость
0 публикаций
Сегодня в 16:57:36 пользователь qMBQx8GH_real сказал:

Ух ты как интересно получилось:

 

для 50% сравнение с 16-м сезоном:

  Показать содержимое

image.png.b806204c81a25af0cc9c8029c273e969.png

получается, что новая система в РАЗЫ лояльнее к игрокам.

 

65%:

  Показать содержимое

image.png.ea1a187ff0234622fc0fbd243329afc5.png

с повышением винрейта пропорция лояльности рангов снижается :cap_cool:

похоже, что нет

Я что-то не так понял? Для прохождения сезона с 65% винрейтом нужно 237 боя, а это как бы в 2-3 раза больше, чем было до этого

upd: глянул свои ранговые, как раз при 65% винрейте получалось вдвое меньшее количество боев 

Изменено пользователем Hans012

Рассказать о публикации


Ссылка на публикацию
1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв

Если все лиги новых рангов объединить в одну "лестницу" с несгораемыми квалификациями между ними, то получаются такие графики:

 

для 65%

Скрытый текст

download.png.4191a3261737bf76f64e0863728e6eb8.png

на треть "легче" взять первый золотой ранг

 

для 50%:

Скрытый текст

1143993318_download(1).png.d0cce176c978a6e4d7ad33d1f4df768a.png

раза в два примерно.

 

 

Сегодня в 17:01:11 пользователь Hans012 сказал:

237 боя, а это как бы в 2-3 раза больше, чем было до этого 

до этого было 274

 

UPD:

код модельки:

Скрытый текст

# правила лиги:
ranks = {
    'bronse': {
        7: {'stars': 1, 'is_safe': 1},
        6: {'stars': 1, 'is_safe': 1},
        5: {'stars': 1, 'is_safe': 1},
        4: {'stars': 2, 'is_safe': 0},
        3: {'stars': 2, 'is_safe': 1},
        2: {'stars': 2, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
    'silver': {
        7: {'stars': 1, 'is_safe': 1},
        6: {'stars': 2, 'is_safe': 0},
        5: {'stars': 2, 'is_safe': 1},
        4: {'stars': 2, 'is_safe': 0},
        3: {'stars': 2, 'is_safe': 0},
        2: {'stars': 3, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
    'gold': {
        10: {'stars': 1, 'is_safe': 1},
        9: {'stars': 2, 'is_safe': 0},
        8: {'stars': 2, 'is_safe': 0},
        7: {'stars': 2, 'is_safe': 0},
        6: {'stars': 2, 'is_safe': 0},
        5: {'stars': 2, 'is_safe': 0},
        4: {'stars': 2, 'is_safe': 0},
        3: {'stars': 3, 'is_safe': 0},
        2: {'stars': 3, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
    'season 17': {
        24: {'stars': 1, 'is_safe': 1},
        23: {'stars': 1, 'is_safe': 1},
        22: {'stars': 1, 'is_safe': 1},
        21: {'stars': 2, 'is_safe': 0},
        20: {'stars': 2, 'is_safe': 1},
        19: {'stars': 2, 'is_safe': 0},
        18: {'stars': 4, 'is_safe': 1},
        17: {'stars': 1, 'is_safe': 1},
        16: {'stars': 2, 'is_safe': 0},
        15: {'stars': 2, 'is_safe': 1},
        14: {'stars': 2, 'is_safe': 0},
        13: {'stars': 2, 'is_safe': 0},
        12: {'stars': 3, 'is_safe': 0},
        11: {'stars': 4, 'is_safe': 1},
        10: {'stars': 1, 'is_safe': 1},
        9: {'stars': 2, 'is_safe': 0},
        8: {'stars': 2, 'is_safe': 0},
        7: {'stars': 2, 'is_safe': 0},
        6: {'stars': 2, 'is_safe': 0},
        5: {'stars': 2, 'is_safe': 0},
        4: {'stars': 2, 'is_safe': 0},
        3: {'stars': 3, 'is_safe': 0},
        2: {'stars': 3, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
    'season 16': {
        18: {'stars': 1, 'is_safe': 1},
        17: {'stars': 2, 'is_safe': 1},
        16: {'stars': 2, 'is_safe': 1},
        15: {'stars': 2, 'is_safe': 1},
        14: {'stars': 2, 'is_safe': 0},
        13: {'stars': 2, 'is_safe': 0},
        12: {'stars': 2, 'is_safe': 1},
        11: {'stars': 2, 'is_safe': 0},
        10: {'stars': 4, 'is_safe': 0},
        9: {'stars': 4, 'is_safe': 0},
        8: {'stars': 4, 'is_safe': 0},
        7: {'stars': 4, 'is_safe': 0},
        6: {'stars': 4, 'is_safe': 0},
        5: {'stars': 5, 'is_safe': 0},
        4: {'stars': 5, 'is_safe': 0},
        3: {'stars': 5, 'is_safe': 0},
        2: {'stars': 5, 'is_safe': 0},
        1: {'stars': 0, 'is_safe': 0},
    },
}

# параметры игрока:
win_rate = 0.50

# строим графики вероятности получения 1-го ранга на N боёв
lines = []
for league in ['season 16', 'season 17']:
    X, Y = make_plot(ranks[league], win_rate, 0.99)
    line, = plt.plot(X, Y, label='{} ({})'.format(league, X[-1]))
    lines.append(line)

plt.legend(handles=lines, loc='lower right')
plt.grid(b=True, color='black', alpha=0.3, linestyle='-', linewidth=1)
plt.show()

 

 

Изменено пользователем qMBQx8GH_real

Рассказать о публикации


Ссылка на публикацию
877
[TRYBA]
Участник
1 034 публикации
20 562 боя

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

Рассказать о публикации


Ссылка на публикацию
1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв

а вот если добавить ещё три прохождения золотой лиги.... стоп! я пожалуй пока пас))

Сегодня в 17:11:05 пользователь vov4ik_strelok_15 сказал:

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

Если цель получить первый ранг золотой лиги, то вывод однозначно стало легче (с учётом квалификаций).

Причём чем ниже винрейт игрока, тем более легче стало.

 

 

Рассказать о публикации


Ссылка на публикацию
877
[TRYBA]
Участник
1 034 публикации
20 562 боя
Сегодня в 18:12:58 пользователь qMBQx8GH_real сказал:

а вот если добавить ещё три прохождения золотой лиги.... стоп! я пожалуй пока пас))

Если цель получить первый ранг золотой лиги, то вывод однозначно стало легче (с учётом квалификаций).

Причём чем ниже винрейт игрока, тем более легче стало.

 

 

Спасибо. Значит мои предположения потвердились.

Рассказать о публикации


Ссылка на публикацию
Гость
Гость
0 публикаций
Сегодня в 17:10:06 пользователь qMBQx8GH_real сказал:

Если все лиги новых рангов объединить в одну "лестницу" с несгораемыми квалификациями между ними, то получаются такие графики:

А как тогда с винрейтом в районе 65% у меня было вдвое меньше боев, значит звезды так сильно влияют на конечный результат? И тогда еще вопрос: а если сопоставить награды и количество боев?

Рассказать о публикации


Ссылка на публикацию
1 554
[0RZ]
Мододел, Коллекционер
802 публикации
19 555 боёв
Сегодня в 17:20:51 пользователь Hans012 сказал:

А как тогда с винрейтом в районе 65% у меня было вдвое меньше боев

речь о вероятности. вам повезло))

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

Сегодня в 17:20:51 пользователь Hans012 сказал:

И тогда еще вопрос: а если сопоставить награды и количество боев?

знать бы как...

Рассказать о публикации


Ссылка на публикацию
Гость
Гость
0 публикаций
Сегодня в 17:25:16 пользователь qMBQx8GH_real сказал:

речь о вероятности. вам повезло))

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

Вряд ли дело в везении. На Прошипсе есть статистика по рангам, за 16 и 18 сезон количество боев у игроков с 65% было не выше 130

Сегодня в 17:25:16 пользователь qMBQx8GH_real сказал:

знать бы как...

Да я бы и сам мог, но что-то  пока лень искать и разбираться. В инфе по рангам есть эта инфа 

Рассказать о публикации


Ссылка на публикацию

×