Как решить задачу линейного программирования с помощью DotNumerics?

Меня очень интересует численный анализ. Я использую приложение с открытым исходным кодом DotNumerics. Моя линейная система выглядит следующим образом:

1 * x + 3 * y <= 150
2 * x + 1 * y <= 100

где x >= 0, y >= 0

z = 10 * x + 15 * y

Я пытаюсь решить z (оптимизация...)

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

using DotNumerics.Optimization;
using DotNumerics;

namespace App.SimplexCalcLinearProgramming
{
    class Program
    {
        static void Main(string[] args)
        {
            Simplex simplex = new Simplex();
            double[] initialGuess = new double[2];
            initialGuess[0] = 0.1;
            initialGuess[1] = 2;
            double[] minimum = simplex.ComputeMin(AmacFunction, initialGuess);
            minimum.ToList().ForEach(q => Console.Write(q.ToString() + "\n"));
           Console.ReadKey();
        }

        static double AmacFunction(double[] x)
        {
            /*
             * 1 * x + 3 * y <= 150
             * 2 * x + 1 * y <= 100
             *
             * where x >= 0, y >= 0
             *
             * z = 10 * x + 15 * y
             *
             * Solve for z
             */
            double f = 0;
            f = 10*x[0]+15*x[1];
            return f;
        }
    }
}

person loki    schedule 18.05.2011    source источник
comment
О, не знал об этом средстве. надо будет посмотреть на это позже   -  person Marc Gravell    schedule 18.05.2011
comment
Не использовали dotNumerics, но если вы пытаетесь решить LP, рассматривали ли вы возможность использования - Microsoft Solver msdn.microsoft.com/en-us/library/ff524509(v=vs.93).aspx   -  person Gangadhar    schedule 18.05.2011


Ответы (1)


Я не думаю, что DotNumerics может решить проблемы LP сама по себе. Насколько я понимаю документацию, Nelder–Mead (симплекс метод) используется только для решения простых задач минимизации, а не задач LP.

В последний раз, когда я решал LP на C#, я использовал оболочку .net для LP_Solve.

Если вы загружаете пакет lpsolve, он должен содержать пример для .net. Вы также можете подключить его к основе решателя Microsoft (см. здесь), но я думаю, что у MSF есть некоторые проблемы с лицензированием, и вы не можете свободно использовать его для коммерческих приложений. Но тем не менее, MSF тоже может быть интересно проверить.

Опять же, вы можете просто использовать lpsolve без MSF. Lpsolve — довольно хороший LP-решатель, если у вас нет проблем с огромным размером. Тогда, возможно, стоит хотя бы поискать альтернативы и сравнить производительность/адаптируемость к вашей конкретной проблеме.

person Ben Schwehn    schedule 18.05.2011
comment
моя математика может стать ржавой, но минимизация IIRC - это подмножество задач линейного программирования (по крайней мере, для линейных систем) - person sehe; 18.05.2011
comment
Я не смотрел на это таким образом. Но я думаю, вы могли бы сказать, что минимизация линейной системы подобна решению LP, у которого нет ограничений? - person Ben Schwehn; 18.05.2011
comment
Я отвечал на то, что минимализация — это подмножество линейного программирования. Я видел алгоритмы, называемые симплекс-методом, которые вообще не имели большого отношения к LP, больше похоже на эй, он вроде как использует треугольники, давайте назовем его симплексом. Но я действительно не уверен. Это было давно :) - person Ben Schwehn; 18.05.2011
comment
Хорошо, я потерялся. Вы, вероятно, правы, и мои расчеты заржавели - person sehe; 18.05.2011
comment
Возможно путаница терминов. en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method, который реализует dotnumerics, кажется довольно простым методом оптимизации и не имеет прямого отношения к симплексу, используемому в LP. Помимо этого, он использует треугольники (или многогранники более высокой размерности). Но у меня нет формального образования в области реальной математики :) Если я несу чушь, меня с радостью поправят! - person Ben Schwehn; 18.05.2011
comment
Привет! мне очень нравится интерес :) Lp_Solve Отлично! @Бен Швен. Но я думаю, что симплексный метод полезен для решения проблемы LP. Можете ли вы привести тот же пример о фундаменте решателя Microsoft... - person loki; 18.05.2011
comment
Я только очень быстро проверил MSF около года назад, извините. Официальные примеры будут полезнее моей сомнительной памяти. lpsolve, вероятно, будет использовать симплексный метод внутренних точек для решения LP, который вы ему даете. Но над этим работало много умных людей, так что я уверен, что они внедрили какие-то причудливые оптимизированные алгоритмы. Старый добрый симплекс-метод (оригинальный от Dantzig) довольно прост в реализации, возможно, это забавное упражнение. - person Ben Schwehn; 18.05.2011
comment
PDF-файл, на который вы ссылаетесь, приводит к сбою моей программы чтения PDF-файлов: / Я посмотрю завтра (возможно :)). Это обсуждение расстроило меня, потому что я явно забыл о пластинках больше, чем помню... :) - person Ben Schwehn; 18.05.2011
comment
во всяком случае, я узнал о LP из конспектов лекций здесь: inf.ed.ac .uk/teaching/courses/agta и книгу В. Чватала, Linear Programming, 1983. Оба очень доступны для тех, у кого мало знаний в математике. Книга научит вас, как выполнять симплекс-метод самостоятельно, в стиле старой школы, с ручкой и бумагой. Также, возможно, полезно то, что lp_solve поставляется с графическим интерфейсом, который позволяет вам играть с простыми LP. - person Ben Schwehn; 18.05.2011