Добрый день, не так давно реализовал программу для решения своей задачи с помощью простого симплекс-метода. В принципе программа работает хорошо, однако из интереса, попробовал использовать для решения той же задачи улучшенный симплекс-метод (метод обратной матрицы, модифицированный симплекс-метод). Долгое время алгоритм отказывался работать, хотя много раз перепроверял и всё было правильно. Чтобы найти ошибку - стал просматривать последовательность матриц обращения, симплекс-множителей и симплекс-разностей (те что в строке целевой функции). Обнаружилось, что решение сначала идёт как и положено, функционал монотонно увеличивается и стремится к нулю (у меня задача ни минимум). В конце концов оптимальное решение достигается (судя по значениям столбца свободных членов), но среди оценок остаются очень маленькие отрицательные величины порядка -1Е-10, указывающие на то что план ещё не оптимален. Разумеется алгоритм продолжает работать. Пересчитывает столбец, вводимый в базис. В этом столбце один элемент получается равным единице, а остальные близки к нулю (то же порядка -1Е-10). После этого всё и "сыпется". После пересчёта матрицы обращения она меняется до неузнаваемости, а функционал "уходит" в плюс. Пока я нашел только один выход - делать останов ни когда все оценки будут >=0, а когда они будут >=k, где k - маленькая отрицательная константа. В этом случае, если правильно подобрать k, всё работает нормально. Правда точность получается меньше, и алгоритм работает примерно в 10 раз медленнее простого симплекс-метода, хотя заявляется о его вычислительных преимуществах. Число итераций в обоих случаях одинаковое, получается модифицированный метод на каждом цикле требует выполнения большего числа вычислений. Посмотрев на задачу - я понял, что это действительно так. Пока вижу одни только недостатки. Допускаю что, это не общая тенденция, а лишь частный случай, свойственный моей конкретной задаче.
Хотелось бы услышать комментарии по этому поводу и по возможности увидеть примеры, в которых улучшенный симплекс-метод имеет явные преимущества перед простым.
|