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. When you use parfeval to evaluate functions in the background, you create Future objects. 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 output of the 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.

When you use parfeval to run computations in the background, the function creates and adds a Future object for each computation to the pool queue. Futures remain in the queue until a worker becomes idle. When a worker becomes idle, it starts to compute a future if the queue is not empty. When a worker completes a future, the future is removed from the queue and the worker becomes idle.

For efficiency, preallocate an array of Future objects.

f(1:numIterations) = parallel.FevalFuture;
for i = 1:numIterations
    f(i) = parfeval(objFun,1,xCandidates(i,:));
end
Starting parallel pool (parpool) using the 'Processes' profile ...
08-Jul-2024 15:36:55: Job Queued. Waiting for parallel pool job with ID 26 to start ...
Connected to parallel pool with 6 workers.

When a future completes, its State property becomes 'finished' and its Read property becomes false. You can use the fetchNext function to retrieve the results from the futures as they finish. After fetchNext retrieves the output from the next unread future in array f, MATLAB sets the Read property of that future to true.

Run a for-loop with numIterations iterations. In each iteration, use fetchNext to retrieve the next completed future's index and value. Next, compare the new value to the existing minimum value, and update the minimum value and its index if a smaller value is found.

If a value less than or equal to 0.01 is found, display the solution and exit the loop early.

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

Cancel any remaining futures.

cancel(f);
clear f;

See Also

|

Related Topics