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

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

Примечание

Часто можно изменить формулировку 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.