Genetic Algorithm + Parallel Computing + Global variables
조회 수: 16 (최근 30일)
이전 댓글 표시
Hello to all,
I have been able to run a GA in parallel (10 workers in total). Now I want to store in a kind of "result matrix" what happens on each worker. For example the simulated individual, the CPU time, the cost and the number of iterations. I tried defining global variables in the main script, where I just call the ga(). Then in the objective function I call the global variables and assign new values. Unfortunately, I only get one row in my "result matrix".
I also tried parfevalOnAll and in the called function I load and assign the values. But this does not work at all.
Does anyone have any idea how to handle this?
Thanks a lot already!
댓글 수: 0
답변 (2개)
Matt J
2022년 8월 27일
편집: Matt J
2022년 8월 29일
If you're using UseVectorized, it should be relatively easy. Within your parfor loop, store the results of processing each population member to a struct array and store that to an externally scoped cell array ResultMatrix as below. Later you can aggregate the different ResultMatrix{i}(j) according to the worker label stored in ResultMatrix{i}(j).labindex.
function main
ResultMatrix={};
opts=optimoptions('ga','UseVectorized',true);
x=ga(@fitnessFunc,nvars,A,b,Aeq,beq,lb,ub,nonlcon,intcon,opts));
function out=fitnessFunc(X)
parfor i=1:size(X,1)
tic;
%process population members here
T=toc;
S(i).cpuTime=T;
S(i).popmember=X(i,:);
...
S(i).labindex=getCurrentTask().ID;
S(i).cost=cost;
end
ResultMatrix{end+1}=S;
out=vertcat(S.cost);
end
end
댓글 수: 6
Walter Roberson
2022년 8월 28일
global variables never transfer between parallel workers or workers and client.
Matt J
2022년 8월 28일
편집: Matt J
2022년 8월 28일
Do you or anyone else have any other ideas for a workaround? It doesn't have to be the prettiest solution.
You might be able to accumulate the results to a .mat file, as opposed to a global variable. In your fitness function, you would have something like,
filename="outfile"+getCurrentTask().ID; %worker-dependent temp file
result_matrix=[load(filename).result_matrix, result_matrix];
save(filename,'result_matrix');
댓글 수: 1
Matt J
2022년 8월 28일
You could also do the same kind of thing in a custom Output Function to add things like the current iteration number to the temp files.
참고 항목
카테고리
Help Center 및 File Exchange에서 Surrogate Optimization에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!