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

Измените опции, чтобы улучшить процесс решения

Примечание

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