Давайте предположим, что у игрока есть фиксированная функция score = f(difficulty)
, которая дает для каждой сложности ожидаемый процент очков.Как только мы узнаем эту функцию, мы можем ее инвертировать и найти уровень сложности, который даст нам ожидаемый результат, который мы хотим.
Однако функция неизвестна.Но у нас есть образцы этой функции в виде наших предыдущих вопросов.Таким образом, мы можем приспособить функцию к этим образцам.Если у вас есть знания о форме зависимости, вы можете включить эти знания в форму вашей подходящей функции.Я просто приму усеченную линейную функцию:
score = f(difficulty) = max(0, min(m * difficulty + n, 1))
Два параметра, которые нам нужно найти, это m
и n
.Если мы удалим все примеры вопросов, где пользователь набрал 100% или 0%, мы можем игнорировать усечение.Затем у нас есть список выборок, которые образуют линейную систему уравнений:
score1 = m * difficulty1 + n
score2 = m * difficulty2 + n
score3 = m * difficulty3 + n
...
Эта система обычно не имеет решения.Итак, мы можем найти решение для наименьших квадратов.Для этого мы будем постепенно строить матрицу 2x2 A
и двумерный вектор b
, представляющий систему A * x = b
.Начнем с нулевой матрицы и нулевого вектора.Для каждого вопроса мы будем обновлять:
/ A11 A12 \ += / difficulty * difficulty difficulty \
\ A21 A22 / \ difficulty 1 /
/ b1 \ += / difficulty * score \
\ b2 / \ score /
Как только мы добавим по крайней мере два вопроса, мы можем решить:
m = (A12 * b2 - A22 * b1) / (A12 * A12 - A11 * A22)
n = (A12 * b1 - A11 * b2) / (A12 * A12 - A11 * A22)
И мы можем найти трудность для ожидаемого результата:P
as:
difficulty = (P - n) / m
Давайте сделаем пример.В следующей таблице приведены несколько вопросов и состояние функции после добавления вопроса.
diff score | A11 A12 A22 b1 b2 | m n
--------------+----------------------------+-------------
70 0.3 | 4900 70 1 21 0.3 |
50 0.4 | 7400 120 2 41 0.7 | -0.005 0.65
40 0.5 | 9000 160 3 61 1.2 | -0.006 0.74
35 0.7 | 10225 195 4 85.5 1.9 | -0.010 0.96
Вот примерная функция и примеры вопросов:
И если мы хотим найти сложность для ожидаемого результата, например, 75%, мы получаем:
difficulty(0.75) = 21.009