Доброе время суток.
Есть реальная задача, которую я не могу свести к какой-то конкретной математической.
Задача состоит в определении оптимального тарифного плана у сотового оператора(ов).
Входные данные (для упрощения): кол-во исходящих минут, входящих минут, смс, данных, и т.д.
Тарифный план: набор услуг со своими ценами, возможно с ограничениями.
Если выбирать только из тарифных планов, то задача нетрудная: можно представить каждый план как функцию от входных параметров (кусочно-непрерывную), вычислять ее значение для данного набора входных данных и дальше выбирать минимальную (либо просто линейное программирование).
Но есть такое понятие как пакеты. Это наборы типа 1000 смс за ХХ денег, либо 500 смс за YY денег, либо 100 смс + 100 минут и т.д. В общем случае — комбинация услуг за фиксированную плату. Пакеты эти доступны для определенных планов (в общем случае — для всех, но могут быть ограничения). Практически всегда пакет выгоднее просто тарифа в плане, но имеет ограничение по объему, после которого включается сам план. (Для упрощения можно считать, что пакет можно выбрать только раз в месяц, все планы месячные).
Т.о. задача по сути превращается в комбинаторную — найти оптимальную комбинацию "пакеты (как правило несколько) + тарифный план", которая даст минимальную общую стоимость при заданном наборе входных данных.
Задача может быть решена прямым перебором, но мне кажется должны существовать методы либо для решения не комбинаторного, либо для сокращения кол-ва вариантов перебора (например, после сортировки стоимостей пакетов можно отбрасывать дорогие пакеты и т.д.).
Подскажите, пожалуйста, в какую сторону копать?