Create Efficient Optimization Problems

When a problem has integer constraints, solve calls intlinprog to obtain the solution. For suggestions on obtaining a faster solution or more integer-feasible points, see Tuning Integer Linear Programming.

Before you start solving the problem, sometimes you can improve the formulation of your problem constraints or objective. Usually, it is faster for the software to create expressions for objective function or constraints in a vectorized fashion rather than in a loop. Suppose that your objective function is

$\sum _{i=1}^{30}\sum _{j=1}^{30}\sum _{k=1}^{10}{x}_{i,j,k}{b}_{k}{c}_{i,j},$

where x is an optimization variable, and b and c are constants. Two general ways to formulate this objective function are as follows:

• Use a for loop. In this case,

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

Here, expr contains the objective function expression. While this method is straightforward, it can take excessive time to loop through many levels of for loops.

• Use a vectorized statement. Vectorized statements generally run faster than a for loop. You can create a vectorized statement in several ways:

• Expand b and c. To enable term-wise multiplication, create constants that are the same size as 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 once over b.

expr = optimexpr;
for k = 1:10
expr = expr + sum(sum(x(:,:,k).*c))*b(k);
end
• Create an expression differently by looping over b and then summing terms after the loop.

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