Часто, можно изменить формулировку MILP, чтобы сделать его более легко разрешимым. Для предложений о том, как изменить вашу формулировку, смотрите Уильямса [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.