parfeval을 사용하여 백그라운드에서 함수 실행
이 예제에서는 백그라운드에서 함수를 실행하기 위해 parfeval을 사용하여 간단한 최적화 문제를 푸는 방법을 보여줍니다. parfeval을 사용하여 백그라운드에서 함수를 실행하는 경우 Future 객체를 만듭니다. 결과가 나오는 대로 수집하고 결과가 적합하면 최적화 루프를 일찍 중단할 수 있습니다.
나중에 동일한 계산을 재현하기 위해 난수 생성기의 시드값을 디폴트 값으로 설정합니다.
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 후보 세트에 대해 목적 함수를 실행합니다.
parfeval을 사용하여 백그라운드에서 계산을 실행하는 경우, 이 함수는 각 계산에 대한 Future 객체를 만들고 이를 풀 대기열에 추가합니다. 워커가 유휴 상태가 될 때까지 Future는 대기열에 남아 있습니다. 워커가 유휴 상태가 되었을 때 대기열이 비어 있지 않으면 워커가 Future를 계산하기 시작합니다. 워커가 Future를 완료하면 Future가 대기열에서 제거되고 워커는 유휴 상태가 됩니다.
효율성을 위해서 Future 객체로 구성된 배열을 사전할당합니다.
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.
Future가 완료되면 State 속성이 'finished'로 바뀌고 Read 속성이 false로 뀝니다. fetchNext 함수를 사용하여 Future가 완료될 때 Future에서 결과를 가져올 수 있습니다. fetchNext가 배열 f에서 읽지 않은 다음 Future의 출력값을 가져온 후 MATLAB은 해당 Future의 Read 속성을 true로 설정합니다.
이전과 같은 횟수의 반복으로 for 루프를 실행합니다. 각 반복에서 fetchNext를 사용하여 다음으로 완료된 Future의 인덱스와 값을 가져옵니다. 그런 다음 새 값을 기존 최솟값과 비교하고 더 작은 값이 발견되면 최솟값과 해당 인덱스를 업데이트합니다.
0.01보다 작거나 같은 값이 발견되면 해를 표시하고 루프를 조기에 종료합니다.
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
나머지 Future를 취소합니다.
cancel(f);
clear f;