Main Content

Evaluate Functions in the Background Using parfeval

This example shows how to solve a simple optimization problem by using parfeval to evaluate functions in the background. You can collect the results as they become available and break out of the optimization loop early when the result is good enough.

To reproduce the same computations later, seed the random generator with the default value.

rng('default')

The objective function objFun takes a row vector x as input and returns a scalar value representing the objective function. Define the objective function and the number of iterations for the optimization loop. Randomly generate candidates for the x values to evaluate the objective function. Initialize the minimum value and index variables.

objFun = @(x) x(1)^2 + x(2)^2;
numIterations = 500;
xCandidates = rand(numIterations,2);
minFval = inf;
minIndex = inf;

Use parfeval to evaluate the objective function for each set of x candidates in the background. For efficiency, preallocate an array of future objects.

futures(1:numIterations) = parallel.FevalFuture;
for i = 1:numIterations
    futures(i) = parfeval(objFun,1,xCandidates(i,:));
end
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.

Fetch the results as they become available and update the minimum function value and index if a new minimum is found. Break out of the loop early if the minimum value is below a certain threshold.

for idx = 1:numIterations
    [completedIndex, fval] = fetchNext(futures);
    if fval < minFval
        minFval = fval;
        minIndex = completedIndex;
    end
    if minFval <= 0.01
            fprintf("Minimum found at x = [%f,%f]\n", ...
                xCandidates(minIndex,1),xCandidates(minIndex,2));
            break; 
    end
end
Minimum found at x = [0.031833,0.093820]

Cancel any remaining futures.

cancel(futures);
clear futures;

Display the best solution found.

fprintf("Best solution found: x = [%f,%f], fval = %f\n", ...
    xCandidates(minIndex,1),xCandidates(minIndex,2),minFval);
Best solution found: x = [0.031833,0.093820], fval = 0.009816

See Also

|

Related Topics