- Pass the whole population to the objective function. This is done by setting the UseVectorized option to true.
- When the whole population is received by the objective function, it must create a SimulationInput object. You can learn about creating it here. Your SimulationInput object is an array, where each element represents a chromosome in the population.
- Then you pass the single SimulationInput object to parsim().
- Next, simulations are run and the SimulationOutput object is returned.
- Finally, you calculate the objective function values from the SimulationOutput object and return them to the solver.

# Get parallel simulations in objective function of optimization Tool (GA,PSO)

18 views (last 30 days)

Show older comments

Hey Guys

i have an optimization problem using the constrainted PSO:

The syntax and general working of the constrainted PSO is the same as GA.

In my objective function, i have to generate a simOut with data from a simulink simulation. One calculation needs about 7 hours of time, since the simulation needs about 3 seconds.To increase the algorithm speed, i want the simulations to run parallel. But it doesnt seem to work if i use "parpool('local')". So far ich changed the settings to "UseVectorized" so have the whole population in one objective function. My code looks like this:

parpool('local')

options = psooptimset('Display','iter','OutputFcns',@myoutputFunc,'UseParallel',true,...

'Generations',200,'PopulationSize',40,'Vectorized','on');

[xopt,fval,exitflag,output,population,scores] = pso(@objective,9,[],[],[],[],lb,ub,@constraint,options);

function obj = objective(x)

% WANT TO: check the number of workers , in my case 6

% WANT TO: set parallel simulations equal to work number

for p=1:length(x(:,1)) %WANT TO: set parallel working parfor loop to execute the parallel simulations

SimuGeometrics = calculateGeometrics(x(p,:)); %SimuGeometrics is a structure of lengths and angle of different body that are used for simulink

%start simulation

simOut = sim('Mechanism.slx','CaptureErrors','on','SrcWorkspace','current');

%Result

pos1 = [simOut.xx.data, simOut.yy.data, simOut.zz.data];

obj(p,1) = calculateDeviation(pos1);

disp(['x: ',num2str(x(p,:)) ,' obj: ',num2str(obj(p,1))]);

end

end

I know that there are some functions like parfor or parsim but i dont know how to include them into my Code.

Of cause, my WANTO TO's are only ideas how i think it can work, if for example setting a parfor loop is nonsense, you can suggest another solution

Edit:

i saw your Answer from :https://de.mathworks.com/matlabcentral/answers/595402-how-to-use-the-parallel-computing-toolbox-of-matlab-to-optimize-the-parameters-of-a-simulink-model-w#answer_496378

it seems like you described a possible solution for my problem. I will try out what you described today and will share my solution if i succeed, but it would help me alot if u could share your expertise on this.

I hope somebody can help me with this problem.

##### 0 Comments

### Accepted Answer

Abdolkarim Mohammadi
on 12 Feb 2021

Hi Marcus.

I haven't used that File Exchange submission for PSO, but the general workflow in such situations is to:

The objective funciton's code might look something like this:

function f = ObjFun(x)

% get population size

PopulationSize = size(x, 1);

% create the SimluationInput object

for i1 = 1:PopulationSize

SimIn(i1) = Simulink.SimulationInput('MyModel');

SimIn(i1) = SimIn(i1).setVariable('MyVar1', x(i1,1))

SimIn(i1) = SimIn(i1).setVariable('MyVar2', x(i1,2))

% do it for all of the variables

end

% run the simulations and get the SimulationOutput object

SimOut = parsim(SimIn);

% initialize the arrays containing the objective function values

f = zeros (PopulationSize, 1);

% fill f with objective function values

for i1 = 1:PopulationSize

f(i1) = SimOut(i1).MyOutput;

end

end

##### 7 Comments

Abdolkarim Mohammadi
on 27 Feb 2021

I reviewed your code and I found out that you didn't use the proper methodology for multiple simulation runs. You wrote:

for i0 = ...

simOut = sim('Opt_9Facets_Model_Parallel.slx','CaptureErrors','on','SrcWorkspace','current',...

'FastRestart','on');

end

Which is the worst way to run multiple simulations. I told you that you should use SimulationInput objects, not calling sim() using model name. Using sim() with model name as the first input and fast restart enabled, prevents Simulink engine from updating simulation parameters in future runs. That's why you are getting the same objective function value in each run. The first run with fast restart LOCKS the model, and future runs do not read parameters from workspace (either base workspace or model workspace).

### More Answers (0)

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!