Use Parfoor Loop for Parameter Sweep Optimization

조회 수: 4(최근 30일)
Hello, I have a general optimization problem that the solution looks something like this (sweeping across parameter p):
maxval = 0;
for a = 1:length(p);
val = somefunction(p(a));
if val > maxval
pmax = p(a);
maxval = val;
end
end
Where I would like to convert into a Parfor loop to find the optimal p that maximizes val. I am struggling to avoid converting into a parfor loop by using only reduction variables. The best I could do looks something like this:
parfor a = 1:length(p);
listval = [val;somefunction(p(a))];
listp = [listp,p(a)];
end
imax = find(val == max(val));
pmax = listp(imax);
So as you can see I am storing the value of every iteration when I am only interested in finding the max value. Also, I am not preallocating memory and my lists (listval & listp) are increasing in size in every iteration. I have the intuition there must be a better solution, as this seems very inefficient, but I have not been able to find anything on the documentation. I have also tried:
maxval = max(maxval,val) instead of the if statement
but of course this only yields the value for the best solution but not the parameter that achieves it. I would appreciate any pointers.

채택된 답변

Edric Ellis
Edric Ellis 2022년 11월 10일
You can do this using a custom reduction function in parfor. Like this:
p = 1:10;
someFcn = @sin;
% Use a 2-element vector to store maximum
% value of someFcn(x), as well as the input x.
maxVal = [-Inf, NaN];
parfor a = 1:length(p)
val = someFcn(p(a));
% Next, use our "custom reduction" to
% update maxVal if the value piece is larger
% than previous values.
maxVal = iMax(maxVal, [val, p(a)]);
end
Starting parallel pool (parpool) using the 'Processes' profile ... Connected to the parallel pool (number of workers: 2). Analyzing and transferring files to the workers ...done.
disp(maxVal)
0.9894 8.0000
function v = iMax(v, in)
if in(1) > v(1)
v = in;
end
end
(Only after writing out this solution did I notice that the doc example for for custom reduction is precisely this case!)
  댓글 수: 1
Andres Morales
Andres Morales 2022년 11월 10일
Thank you. This is exactly what I was looking for, since I have no interest in saving anything else besides the optimal solution.

댓글을 달려면 로그인하십시오.

추가 답변(1개)

Walter Roberson
Walter Roberson 2022년 11월 9일
List concatenation is one of the permitted reduction strategies, so you can assume that it will handle memory allocation appropriately.
But you could also use an array, something like
N = 1000000;
pvals = zeros(2,N);
parfor a = 1 : N
thisp = p(a);
val = somefunction(thisp);
pvals(:,a) = [val;thisp];
end
[maxval, idx] = max(pvals(1,:));
pmax = pvals(2,idx);
Question: your current code would find all the places that have the same (identical) max. Is that deliberate? (There can be good reason to want to know them all, but it does mean there can be instabilities that are due to floating point round off. Though I guess the instabilities exist if you just want one out of all the locations that are maximal.)
  댓글 수: 3
Andres Morales
Andres Morales 2022년 11월 10일
Yeah, that's very clear. Thank you for providing great answers.

댓글을 달려면 로그인하십시오.

제품


릴리스

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by