Рекомендуемая библиотека для линейного программирования в .Net?

Может ли кто-нибудь рекомендовать библиотеку - бесплатную или коммерческую, но доступную (

Здесь перечислены некоторые из них: http://en.wikipedia.org/wiki/Linear_programming#Solvers_and_scripting_.28programming.29_languages

.... но я только начинаю с LP и надеюсь, что кто-то может что-то порекомендовать.

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

Упрощенный пример:

Параметры базового плана
План A: 200 минут голоса, 10 текстовых сообщений, 10 МБ данных = $25
План B: 400 минут голоса, 25 текстовых сообщений, 25 МБ данных = $40
План C: 1000 минут голоса, 50 текстовых сообщений, 50 МБ данных = $65
...
План F: 2500 минут голоса, 150 текстовых сообщений, 150 МБ данных = $95

Сборы за превышение вашего плана (для всех случаев):
$ 0,10 за минуту голоса

$.20 за текстовое сообщение
$ 1,50 за МБ данных

Дополнительные пакеты дополнений (добавлены в базовый план):
Бесплатные выходные $15
Бесплатные вечера и выходные (после 8 вечера) $20
Бесплатные вечера и выходные (после 6 вечера) 35 долларов США Текстовый пакет сообщений №1 (50 текстовых сообщений) $5
Текстовый пакет сообщений №2 (150 текстовых сообщений) $10
Пакет данных №1 (данные 20 МБ) $20
Пакет данных №2 (данные 50 МБ) $30
Chatty User Mixed Pack # 1 (100 минут голоса, 100 текстовых сообщений) $15
Geeky User Mixed Pack # 1 (50 минут голоса, 150 МБ данных) $35
etc, etc etc

У меня есть набор подробных данных использования для 50 пользователей, и вы хотите выяснить, какая комбинация базового плана (A, B, C... F) должна быть включена в каждый пользователь, а также какие дополнительные пакеты (ы), которые они должны иметь.

Ответ 1

Вы можете попробовать Microsoft Solver Foundation. Это библиотека математического программирования, которая поддерживает решение линейного программирования, смешанного целочисленного программирования, стохастического программирования и других задач оптимизации и моделирования.

Он доступен в выпусках Express (Free), Standard и Enterprise (MSDN Subscriptions).

Ответ 2

Во-первых, я предполагаю, что вам может понадобиться нечто более сложное, чем простой решатель LP. Большинство услуг сотовой связи имеют точки останова, где вы можете переключиться с одной службы на другую на основе длины, частоты, времени суток и т.д. Это переключение подразумевает необходимость целочисленных переменных, что означает, что вам может понадобиться MILP (смешанное целочисленное линейное программирование ) решатель. (Если все ваши функции затрат и ограничения являются выпуклыми, вы можете справиться с решателем LP, но это немного опережает нас). Хорошей новостью является то, что там есть также открытые и доступные MILP-ресиверы.

Я бы начал с LP SOLVE или SYMPHONY. Просмотрите сайт COIN-OR здесь для получения какой-либо полезной справочной информации.

В ответ на расширенное описание проблемы, я думаю, вы могли бы просто взять каждого из 50 пользователей и заплатить за каждый план, а затем применить каждый из этих вариантов по отдельности. С n пользователями и возможными планами и возможными параметрами p вам нужно посмотреть параметры m * p для каждого пользователя, но это то, что нужно.

Более интересный вопрос с точки зрения пользователя: где точки разрыва между планами? Можете ли вы определить кривые безразличия - комбинации использования, где пользователь будет безразличным между двумя планами? Этот вопрос можно было бы решить математически, возможно, используя некоторые методы линейной алгебры, но на самом деле нет объективной функции, поэтому это не похоже на MILP.

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