Main Content

parfeval을 사용하여 백그라운드에서 함수 실행

이 예제에서는 백그라운드에서 함수를 실행하기 위해 parfeval을 사용하여 간단한 최적화 문제를 푸는 방법을 보여줍니다. 결과가 나오는 대로 수집하고 결과가 적합하면 최적화 루프를 일찍 중단할 수 있습니다.

나중에 동일한 계산을 재현하기 위해 난수 생성기의 시드값을 디폴트 값으로 설정합니다.

rng('default')

목적 함수 objFun은 행 벡터 x를 입력값으로 받고 목적 함수를 나타내는 스칼라 값을 반환합니다. 목적 함수와 최적화 루프 반복 횟수를 정의합니다. 목적 함수를 실행하기 위해 사용할 x 값에 대한 후보를 무작위로 생성합니다. 최솟값과 인덱스 변수의 값을 설정합니다.

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

parfeval을 사용하여 백그라운드에서 각 x 후보 세트에 대해 목적 함수를 실행합니다. 효율성을 위해서 Future 객체로 구성된 배열을 사전할당합니다.

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.

결과가 나오는 대로 가져오고 새 최솟값이 발견되면 최소 함수 값과 인덱스를 업데이트합니다. 해당 최솟값이 특정 임계값 미만인 경우 루프를 일찍 중단합니다.

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]

나머지 Future를 취소합니다.

cancel(futures);
clear futures;

구한 최선해를 표시합니다.

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

참고 항목

|

관련 항목