Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Cree problemas de optimización eficientes

Cuando un problema tiene restricciones de enteros, las llamadas para obtener la solución.solveintlinprog Para obtener sugerencias sobre la obtención de una solución más rápida o más puntos de enteros factibles, consulte.Ajuste de programación lineal de enteros

Antes de empezar a resolver el problema, a veces se puede mejorar la formulación de sus limitaciones de problemas u objetivo. Por lo general, es más rápido para el software para crear expresiones para la función objetiva o restricciones de una manera vectorizada en lugar de en un bucle. Supongamos que la función objetiva es

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

donde es una variable de optimización y y son constantes.xbc Dos formas generales de formular esta función objetiva son las siguientes:

  • Use un bucle.for En este caso,

    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

    Aquí, contiene la expresión de función objetiva.expr Aunque este método es sencillo, puede tomar un tiempo excesivo para recorrer muchos niveles de bucles.for

  • Utilice una instrucción vectorizada. Las sentencias vectorizadas generalmente se ejecutan más rápido que un bucle.for Puede crear una sentencia vectorizada de varias formas:

    • Expandir y.bc Para habilitar la multiplicación a término, cree constantes que tengan el mismo tamaño que.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)));
    • Loop una vez más.b

      expr = optimexpr; for k = 1:10     expr = expr + sum(sum(x(:,:,k).*c))*b(k); end
    • Crear una expresión de forma diferente mediante un bucle y, a continuación, sumar términos después del bucle.b

      expr = optimexpr(30,30,10); for k = 1:10     expr(:,:,k) = x(:,:,k).*c*b(k); end expr = sum(expr(:));

Temas relacionados