Примечание
Часто можно изменить формулировку MILP, чтобы сделать ее легче разрешимой. Для предложений о том, как изменить формулировку, смотрите Williams [1].
После того, как вы бежите intlinprog
один раз, можно хотеть изменить некоторые опции и перезапустить их. Изменения, которые вы можете увидеть, включают:
Меньшее время выполнения
Более низкое значение конечной целевой функции (лучшее решение)
Меньшая конечная погрешность
Больше или различные допустимые точки
Вот общие рекомендации по изменению опций, которые с наибольшей вероятностью помогут процессу решения. Попробуйте предложения в следующем порядке:
Для более быстрого и точного решения увеличьте CutMaxIterations
опция из 10
по умолчанию к большему числу, такому как
25
. Это может ускорить решение, но также может замедлить его.
Для более быстрого и точного решения измените CutGeneration
опция для 'intermediate'
или 'advanced'
. Это может ускорить решение, но может использовать гораздо больше памяти, и может замедлить решение.
Для более быстрого и точного решения измените IntegerPreprocess
опция для 'advanced'
. Это может оказывать большой эффект на процесс решения, либо полезно, либо нет.
Для более быстрого и точного решения измените RootLPAlgorithm
опция для 'primal-simplex'
. Обычно это изменение не выгодно, но изредка оно может быть.
Чтобы попытаться найти больше или лучше допустимых точек, увеличьте HeuristicsMaxNodes
опция из 50
по умолчанию к большему числу, такому как
100
.
Чтобы попытаться найти больше или лучше допустимых точек, измените Heuristics
опция для любого из 'intermediate'
или 'advanced'
.
Чтобы попытаться найти больше или лучше допустимых точек, измените BranchRule
опция для 'strongpscost'
или, если этот выбор не может улучшить решение, 'maxpscost'
.
Для более быстрого решения увеличьте ObjectiveImprovementThreshold
опция от значения по умолчанию нуль до положительного значения, такого как 1e-4
. Однако это изменение может вызвать intlinprog
найти меньше целочисленных допустимых точек или менее точное решение.
Чтобы попытаться остановить решатель быстрее, измените 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.