exponenta event banner

Настройка целочисленного линейного программирования

Изменение параметров для улучшения процесса решения

Примечание

Часто можно изменить формулировку MILP, чтобы сделать его более легко разрешимым. Предложения по изменению формулировки см. в статье Williams [1].

После бега intlinprog после этого, возможно, потребуется изменить некоторые параметры и повторно запустить его. Изменения, которые вы можете увидеть, включают в себя:

  • Меньшее время выполнения

  • Более низкое конечное значение целевой функции (лучшее решение)

  • Меньший конечный разрыв

  • Несколько или несколько возможных точек

Ниже приведены общие рекомендации по изменениям опций, которые, скорее всего, помогут процессу решения. Попробуйте использовать предложения в следующем порядке:

  1. Для более быстрого и точного решения увеличьте CutMaxIterations от его значения по умолчанию 10 на большее число, такое как 25. Это может ускорить решение, но также может замедлить его.

  2. Для более быстрого и точного решения измените CutGeneration опция для 'intermediate' или 'advanced'. Это может ускорить решение, но может использовать гораздо больше памяти и замедлить решение.

  3. Для более быстрого и точного решения измените IntegerPreprocess опция для 'advanced'. Это может оказывать большое влияние на процесс решения, либо благоприятно, либо нет.

  4. Для более быстрого и точного решения измените RootLPAlgorithm опция для 'primal-simplex'. Обычно это изменение не выгодно, но иногда оно может быть.

  5. Чтобы попытаться найти больше или лучше возможных точек, увеличить HeuristicsMaxNodes от его значения по умолчанию 50 на большее число, такое как 100.

  6. Чтобы попытаться найти больше или лучше возможных точек, измените Heuristics параметр для 'intermediate' или 'advanced'.

  7. Чтобы попытаться найти больше или лучше возможных точек, измените BranchRule опция для 'strongpscost' или, если этот выбор не может улучшить решение, 'maxpscost'.

  8. Для более быстрого решения увеличьте ObjectiveImprovementThreshold от значения по умолчанию, равного нулю, до положительного значения, например 1e-4. Однако это изменение может вызвать intlinprog найти меньшее число возможных точек или менее точное решение.

  9. Чтобы попытаться остановить решатель быстрее, измените RelativeGapTolerance значение параметра больше значения по умолчанию 1e-4. Аналогично, чтобы попытаться получить более точный ответ, измените RelativeGapTolerance для более низкого значения. Эти изменения не всегда улучшают результаты.

Некоторые «целочисленные» решения не являются целыми числами

Часто некоторые предположительно целочисленные компоненты решения x(intcon) не являются точно целыми числами. intlinprog рассматривает как целые числа все значения решения в IntegerTolerance целого числа.

Чтобы округлить все предполагаемые целые числа быть точно целые числа, используйте round функция.

x(intcon) = round(x(intcon));

Внимание

Округление может привести к тому, что решения станут неосуществимыми. Проверка выполнимости после округления:

max(A*x - b) % see if entries are not too positive, so have small infeasibility
max(abs(Aeq*x - beq)) % see if entries are near enough to zero
max(x - ub) % positive entries are violated bounds
max(lb - x) % positive entries are violated bounds

Большие компоненты, не являющиеся целочисленными

intlinprog не требует, чтобы компоненты решения были целочисленными, когда их абсолютные значения превышают 2.1e9. Когда решение имеет такие компоненты, intlinprog предупреждает. Если вы получите это предупреждение, проверьте решение, чтобы убедиться, что предположительно целочисленные компоненты решения близки к целым числам.

Большие коэффициенты не разрешены

intlinprog не допускает компоненты проблемы, такие как коэффициенты в f, A, или ub, для превышения 1e15 в абсолютном значении. При попытке выполнить intlinprog с такой проблемой, intlinprog выдает ошибку.

Если вы получаете эту ошибку, иногда вы можете масштабировать проблему, чтобы иметь меньшие коэффициенты:

  • Для коэффициентов в f слишком большие, попробуйте умножить f на небольшой положительный коэффициент масштабирования.

  • Для слишком больших коэффициентов ограничений попробуйте умножить все границы и матрицы ограничений на один и тот же малый положительный коэффициент масштабирования.

Ссылки

[1] Уильямс, Х. Пол. Построение модели в математическом программировании. Уайли, 2013.