Создайте эффективные задачи оптимизации

Когда проблема имеет целочисленные ограничения, solve вызывает intlinprog, чтобы получить решение. Для предложений при получении более быстрого решения или большего количества целочисленных допустимых точек, смотрите Настраивающееся Целочисленное Линейное Программирование.

Прежде чем вы начнете решать проблему, иногда можно улучшить формулировку ограничений задач или цели. Обычно, это быстрее для программного обеспечения, чтобы создать выражения для целевой функции или ограничения векторизованным способом, а не циклом. Предположим, что ваша целевая функция

i=130j=130k=110xi,j,kbkci,j,

где 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(:));

Похожие темы