Когда проблема имеет целочисленные ограничения, 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(:));