Class with static variables in parallel global optimization algorithm

조회 수: 1 (최근 30일)
Omar Kamel
Omar Kamel 2019년 2월 8일
편집: Matt J 2019년 3월 21일
Hello,
I have a global optimization program dealing with large matrices (several gigabytes of data), so in order to save memory, a class with static variables was implemented similar to the implementation in Static Data, and then one object of this class is created, initialized and passed as an argument to a function handle acting as the objective function of global multistage optimization algorithm (Particle Swarm + Pattern Search). When parallelization in optimoptions is true:
optimoptions( ...
'UseParallel', true);
The optimization always yields false results, but when parallelization is turned off, it works correctly.
Thanks in advance!

답변 (2개)

Matt J
Matt J 2019년 2월 8일
편집: Matt J 2019년 2월 8일
All variables are cloned when parallelization is used. Each parallel worker operates with an independent copy of any variable sent to it.
  댓글 수: 5
Matt J
Matt J 2019년 2월 8일
Okay, but we also need to see how it is used in the optimization.
Omar Kamel
Omar Kamel 2019년 2월 14일
편집: Omar Kamel 2019년 2월 14일
Sorry for the late reply.
%create object and initialize
dampingModelDataObject = cDampingConstData; %create object of type cDampingConstData
dampingModelDataObject.setget_delta_A_to_delta_d(delta_A_to_delta_d); %initialize object with fields
dampingModelDataObject.setget_A_0_0(A_0_0); %initialize object with fields
dampingModelDataObject.setget_states_num(A_0_0); %initialize object with fields
%objective function handler, object is passed to it with another constant inputs and d as variable
fun = @(d) DampIT.SumModalDamping_sparse_oo(reshape(d,1,1,num_damping_coefficients), dampingModelDataObject,targetModalDamping);
%optimization options
options = optimoptions('particleswarm', 'Display', 'iter', ...
'HybridFcn', {@patternsearch, patternsearch_hybrid_options}, ... %hybrid optimization
'MaxTime', obj.settings.pp_swarm_maxTime, ...
'MaxIterations', obj.settings.pp_swarm_maxIter, ...
'FunctionTolerance', obj.settings.pp_swarm_tolFun, ...
'PlotFcn', { @pswplotbestf}, ...
'SwarmSize', obj.settings.pp_swarm_swarmSize, ...
'OutputFcn', memLog_swarm, ...
'UseParallel', useparallel_flag, ... %true
'UseVectorized', false, ...
'MaxStallIterations', obj.settings.pp_swarm_maxStallIter, ...
'InitialSwarmMatrix', InitialSwarmMatrix);
%problem settings
problem.solver = 'particleswarm';
problem.objective = fun;
problem.nvars = num_damping_coefficients;
problem.lb = x_start;
problem.ub = x_end;
problem.options = options;
%start optimization
[d_optimized, fval, exitflag, output] = particleswarm(problem);

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


Walter Roberson
Walter Roberson 2019년 2월 14일
Look again at the link you provided . Notice the point about static data not being saved with an object . The process of sending variables to parallel workers involves save and load.
  댓글 수: 3
Walter Roberson
Walter Roberson 2019년 3월 21일
However, that saves the matrix once per worker, not "only 1 time in the memory". If you strictly need "only 1 time in the memory" then you should look in the File Exchange for https://www.mathworks.com/matlabcentral/fileexchange/28572-sharedmatrix which uses operating system shared memory.
Matt J
Matt J 2019년 3월 21일
편집: Matt J 2019년 3월 21일
Interesting.

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

카테고리

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