Genetic Algorithm + Parallel Computing + Global variables

조회 수: 16 (최근 30일)
Jonas
Jonas 2022년 8월 27일
편집: Matt J 2022년 8월 29일
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!

답변 (2개)

Matt J
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
Jonas
Jonas 2022년 8월 28일
Thank you for the explanation.
Yes, but the whole point of this forum is that we can suggest you stop doing what you're doing and do something else that might better.
You are absolutely right. Since yesterday I tried to change the structure and use vectorized. I was not able to do it. Since I am running out of time, I will stick with my structure.
Do you or anyone else have any other ideas for a workaround? It doesn't have to be the prettiest solution.
Walter Roberson
Walter Roberson 2022년 8월 28일
global variables never transfer between parallel workers or workers and client.

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


Matt J
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
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 CenterFile Exchange에서 Surrogate Optimization에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by