Когда проблема имеет целочисленные ограничения, solve
вызовы intlinprog
получить решение. Для предложений при получении более быстрого решения или большего количества целочисленных допустимых точек, смотрите Настраивающееся Целочисленное Линейное Программирование.
Прежде чем вы начнете решать задачу, иногда можно улучшить формулировку ограничений задач или цели. Обычно, это быстрее для программного обеспечения, чтобы создать выражения для целевой функции или ограничения векторизованным способом, а не циклом. Предположим, что ваша целевая функция
где x
переменная оптимизации и b
и c
константы. Два общих способа сформулировать эту целевую функцию следующие:
Используйте for
цикл. В этом случае,
expr = optimexpr; for i = 1:30 for j = 1:30 for k = 1:10 expr = expr + x(i,j,k)*b(k)*c(i,j); end end end
Здесь, expr
содержит выражение целевой функции. В то время как этот метод является прямым, он может занять время, чтобы циклично выполниться через многие уровни for
циклы.
Используйте векторизованный оператор. Векторизованные операторы, обычно запускаемые быстрее, чем for
цикл. Можно создать векторизованный оператор несколькими способами:
Расширьте b
и c
. Чтобы включить мудрое термином умножение, создайте константы, которые одного размера с x
.
bigb = reshape(b,1,1,10); bigb = repmat(bigb,30,30,1); bigc = repmat(c,1,1,10); expr = sum(sum(sum(x.*bigb.*bigc)));
Цикл однажды по b
.
expr = optimexpr; for k = 1:10 expr = expr + sum(sum(x(:,:,k).*c))*b(k); end
Создайте выражение по-другому цикличным выполнением по b
и затем суммируя условия после цикла.
expr = optimexpr(30,30,10); for k = 1:10 expr(:,:,k) = x(:,:,k).*c*b(k); end expr = sum(expr(:));