Comments 30
А что за необходимость заставляет писать собственную реализацию симплекс-метода?
Забавно, но в попытке сделать изучение темы доступнее вы сделали такую же сухую, непонятную многим, статью, как и другие)
https://imgs.xkcd.com/comics/standards.png
Это статья направлена на понимание теоретической части вопроса. Например, почему выбор новой базисной переменной происходит именно так, как он происходит. Будет еще одна (а может и не одна) статья по этому поводу, и там будут примеры и практика. А здесь формат другой — подробный разбор теории, с нюансами.
Почему вы ничего не написали про то, как найти начальный базисный план? Вы сами писали симплекс-метод, так что не могли не натолкнуться на эту проблему. К примеру в python/scipy реализован двухфазный симплекс-метод, который в первой фазе как раз ищет начальный базис. Вообще для демонстраций он очень удобен, так как выдает всю последовательность точек, в которых побывал, можно заодно с ним и сравнение сделать.
Еще, кажется, у вас половина формул написаны нормальным TeX-шрифтом (видимо через встроенный в хабраредактор?), половина скриншотами формул не очень хорошего качества, если нужно, могу помочь это поправить.
Возможно вам будет интересно посмотреть (а может даже и что-нибудь оттуда взять) на мой черновик, который я использовал для анимаций траекторий разных оптимизационных методов.
Надеюсь, вы учтете это, когда соберетесь писать еще статьи. Удачи!
Как только прочитал "симплекс-метод", сразу вспомнил Игоря Дмитриевича. :)
Ну представьте себе параболу перевёрнутую, у неё бугор такой посередине — вот это глобальный максимум. Или там гору — у неё на самом высоком пике этот максимум, а у оврага — на самой большой глубине. А у инвестиционного портфеля максимум там, где бабок больше всего, а чуть соотношение акций поменяешь или время пройдёт — сразу бабок меньше станет.
Как искать бугорок у параболы? С помощью отрезка, который мы двигаем по ней, меняя его длину. Как искать дно оврага? Треугольничками, у которых мы меняем длины сторон и аккуратно их по оврагу двигаем. А если овраг четырёхмерный? Тетраэдриками! Ну и так далее. И видео можно вставить, да хоть вот это: youtu.be/HUqLxHfxWqU
Возникает вопрос — а по какому же алгоритму нам эти треугольнички располагать в пространстве? И вот тут вы выпрыгиваете из кустов со своими таблицами, а тем, кто не верит — демонстрируете доказательство.
С такой подачей получится практически целый глубинный курс по оптимизации :) Хотя, если бы всегда его начитывали так подробно, было бы намного эффективней, имхо. Люди понимали бы природу того или иного метода. Как раз то, о чем я писал — следующий шажок: не просто алгоритм используем, а каждое действие осознаем. Но не глубоко, т.к. концепция оптимизационных задач нам не до конца понятна. То, о чем Вы говорите — супер. Это реально принесло бы пользу людям. Займусь этим :)
Что примечательно — на википедии по этому поводу специальный эпиграф, видимо часто путают
This article is about the linear programming algorithm. For the non-linear optimization heuristic, see Nelder–Mead method.
Not to be confused with Dantzig's simplex algorithm for the problem of linear optimization.
Я был на втором курсе, и меня зацепила одна идея. На парах для симплекс-метода мы использовали простые дроби. Алгоритм итеративный, поэтому даже если задача изначально подгоняется под целочисленный конечный результат, то алгоритм нашего преподавателя всё равно давал 1.9999999, так и печаталось на расчётках.
Дело было в конце девяностых, компа у меня своего не было. На ВУЗовских компах был только GW-Basic и офис. Но офис был с VBA, поэтому я решил убить двух зайцев сразу и написал VBA-макрос, который умеет симплекс-метод, причём делает это при помощи простых дробей, т.е. никаких 1.999999.
Написал, показал его преподам, получил какую-то там премию на олимпиаде ВУЗовской.
Даже потроллил препода насчёт дробей.
Макрос в книге Excel закрыл паролем, пароль не помню :(
- Сохранённый в новом формате документ (.xlsm, .xlsb, .xlam) распаковываем zip-архиватором (7-zip умеет это делать даже без пердварительной смены расширения на .zip)
- Среди файлов находим vbaProject.bin и открываем его в hex-редакторе
- Меняем DPB на DPx
- Обратно запаковываем zip-архив и возвращаем изначальное имя книги
- При открытии книги нажимаем ОК на предупреждении
- Обязательно задаём новый пароль на проект, после чего можем его полностью разлочить
Кстати, похожим образом можно распаролить защиту листов и книги — удалив элементы sheetProtection и workbookProtection в компонентах соответственно листа или книги.
2. Если «статья направлена на понимание теоретической части вопроса», то стоит ссылаться не на графический метод решения, а на теорему о том, что экстремум выпуклой функции на выпуклом многограннике достигается в его вершине.
3. Альтернативные решения — это не только другие крайние точки, но и вся грань, ими образованная, т.е. решений может быть бесконечно много (но значение целевой функции на каждом из них, разумеется, одинаковое).
Достижение «более глубокого понимания теоретической части» без единого упоминания двойственности остаётся под вопросом. Вот Вы пишете: «Коэффициенты в строке функционала берутся со знаком “-”.». Или про критерий оптимальности: «в строке функционала нет положительных коэффициентов». Но никак не объясняете, почему же это так. Хотя критерий оптимальности — это, фактически, ограничения двойственной задачи. В случае канонической задачи они имеют вид uA ⩽ c или же uA — c ⩽ 0. При u = 0 как раз и возникнет знак минус у «коэффициентов в строке функционала».
Помимо своей фундаментальной значимости, двойственность используется и на практике (при исследовании устойчивости, например). Если к решённой задачи ЛП добавить новое ограничение, то с помощью двойственного симплекс-метода можно задачу «дорешать» с финальной симплекс-таблицы, а не решать полностью с нуля.
В общем, спасибо за статью, но в качестве пожелания к последующим — хотя бы ссылайтесь на важные вещи, чтобы читатели были в курсе их существования.
P.S. Целая статья про М-метод? Я заинтригован :)
Все по полочкам разложено в книге
https://www.ozon.ru/product/lineynoe-programmirovanie-s-obsuzhdeniem-nekotoryh-nelineynyh-zadach-nit-igor-vasilevich-848531898/
и вещи там называются своими именами, а не вот это вот всё...
Но что делать в ситуациях, когда в исходной системе присутствуют ограничения вида <= b_i, где b_i > 0? При преобразовании такой системы ограничений к каноническому виду добавляются столбцы, содержащие все нули и одну -1, а для включения в базис столбец должен иметь все нули и одну 1.
Сколько по интернету лазил, ни разу еще не встретил статьи, объясняющей, как этот момент можно обойти. И вообще, как симплекс методом решать каноническую задачу ЛП в общем случае.
Подробный разбор симплекс-метода