вторник, 12 декабря 2017 г.

О стартовых взносах

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

Итак, задача: найти оптимальный стартовый взнос для соревнований.
И сразу, чтобы внести ясность - здесь и далее "оптимальный" = "дающий максимальную прибыль". Тыкать пальцем в небо не стану, а применю математику. Для этого нужно построить примерную математическую модель (при этом "примерную" - это может быть даже слишком мягкое слово, модель будет очень примерной - такими же будут и результаты, но об этом я уже предупреждал).

Построение математической модели начну с расходов. Пусть расходы делятся на две категории:
1) Общие расходы, не зависящие от количества участников (работа судей, организация центра соревнований, аренда спорткомлекса/парковки, расходные материалы). Обозначим их "C".
2) Расходы на одного участника (печать/покупка карты, аренда отметки). Обозначим как "a".

От расходов сразу перехожу к доходам. Поскольку искомое значение - это размер стартового взноса, его я и обозначу как "x". Имея конкретные условия старта (время, место, карта, реклама, призы и т.д.), меняем только стартовый взнос. Количество участников в фиксированыых условиях, соответственно, будет функцией от стартового взноса - пока просто обозначаю как "f(x)".
Теперь есть все, чтобы найти суммарный доход от соревнований "P" - количество участников, умноженное на доход от одно участника (стартовый взнос минус затраты на участника), минус общий расход. Если проще, то:
P = f(x) * (x - a) - C

Наша задача - найти х, при котором P максимально (кстати говоря, при этом оно не обязательно положительно - это жестокое жизненное уточнение). Задача, если не ошибаюсь, из школьной программы 10-го или 11-го класса. Для поиска локального максимума (и минимума) нужно найти корни производной. Поехали:
P' = (f(x) * (x - a))' - C' = f'(x) * (x - a) + f(x) * (x - a)' - 0 = f'(x) * (x - a) + f(x)
f'(x) * (x - a) + f(x) = 0

На этом у меня всё.
Шутка.
Ну то есть дальше остается только сделать шаг, который сделает математическую модель "сферическими соревнованиями в вакууме". Ну и ладно.
f(x) - влияние стартового взноса на количество участников. Что, вообще, можно предположить про эту функцию.
1) Она монотонно убывающая. Было бы довольно странно, если бы количество участников росло, при увеличении стартового взноса (хотя с коллективным сознанием чего только не случается).
2) Имея свой максимум при нулевом стартовом взносе (в отрицательный стартовый взнос я не полезу) она сначала уменьшается довольно медленно (стартовый взнос в 1-2 рубля мало кого испугает).
3) Достигнув некоего значения (пусть будет "P1") стартовый взнос уже начинает оказывать существенное влияние на посещаемость, отток увеличивается.
4) Достигнув значения "P2" мы потеряли почти всех участников. Оставшиеся утекают медленнее, но рано или поздно f(x) все таки достигнет нуля. Впрочем, эта часть функции нас уже интересует меньше.

Естественно, для анализа функции ее нужно сделать непрерывной, так что с нецелым числом копеек и участников придется смириться. Кстати, еще одним упрощением модели является одинаковый стартовый взнос для всех участников, иначе считать все пришлось бы для каждой группы отдельно.
Набросаю такие условия:
1) При стартовом взносе 0 рублей наш старт посетит 250 человек.
2) При взносе в 5 рублей 10 человек откололось, осталось 240 человек.
3) Взнос в 25 рублей оставил нас с 10-ю отчаяными фанатами.
4) При 30 рублях участников не осталось.

Дальше воспользуюсь онлайн приложением (https://tools.timodenk.com/cubic-spline-interpolation) и проинтерполирую. Получаю такой график.

Сложно сказать, насколько он похож на правду, но выглядит неплохо.
Запись функции выглядит не так красиво:

Возвращаясь к выражению
f'(x) * (x - a) + f(x) = 0
посчитать его нужно будет для каждой из трех функций отдельно и найти корни, попадающие в соответствующий отрезок. Перед этим, нужно еще установить значение для "a" - расхода на одного участника. Пусть будет 3 рубля для начала, потом с этим можно будет поиграться.
Всю грязную работу я тут показывать не буду, в конце концов результатом будет кубическое уравнение. Его, конечно, я тоже не буду решать сам, для этого использую https://www.symbolab.com/solver/polynomial-equation-calculator/

Ну а результатом всего этого математического безобразия станет число x ~ 13.43 рубля. Количество участников f(x) ~ 148 человек.
Поиграемся значением расходов. При той же функции f(x) установим a = 0 рублей (не очень жизненно). x ~ 12,14, f(x) ~ 166.
a = 6 рублей. x ~ 14.87 рублей, f(x) ~ 127 человек.
В общем, это довольно интуитивно, увеличение затрат на человека двигает оптимальный стартовый взнос вверх (в данном случае примерно в 2 раза медленней самого взноса).

Так получилось, что начал я сразу с более сложной модели, но можно попробовать упростить её вот так:
Проще - не значит хуже, возможно завсимость участников от стартового взноса ближе к линейной. Расчет с похожими входными данными:
f(x) = 250 - 250 * x / 30
Тут уже не нужны сторонние приложения, несколько подсчетов, и получаем:
x = (30 + a) / 2
То есть, в этой модели оптимальное x больше (а f(x), соответственно меньше).
При а = 3, x = 17.5 - дополнительных 4 рубля. f(x) = 125 - минус 23 человека.
С такой зависимостью, кстати, оптимальный стартовый взнос достигается при числе участников меньше половины от максимально возможного.
Тогда хочется верить, что f(x) в реальной жизни всё же ближе к первому варианту. 

Какая она на самом деле? Да кто ж его знает.