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

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

Похожие темы