Running genetic algorithm and Simulink in parallel
조회 수: 11 (최근 30일)
이전 댓글 표시
I am trying to control my system using the mpc controller, and I want to optimize its weights with a genetic algorithm. Part of my code is in Matlab, and the other part is in Simulink, and I want to run ga in parallel. So far, My code looks like the one below. It works without using the ga 'UseParallel' option, which is really slow. When I try to use the 'UseParallel' option, it gives me errors I don't know how to resolve. I would appreciate it if you could help me to resolve the issue.
code:
clear all
clc
x_eq = [0;0;0;0;0;0;0;0;0;deg2rad(3);deg2rad(17);deg2rad(15)];
u_eq = [0;0;0];
[A,B] = FlexibleSatStateJacobianFcn(x_eq,u_eq);
C = eye(12,12);
D = zeros(12,3);
plant = ss(A,B,C,D);
plant = setmpcsignals(plant,'MV',3);
Ts = 0.1; % Sampling time
p = 20; % Prediction horizon
m = 20; % Control horizon
mpcobj = mpc(plant,Ts,p,m);
mpcobj.Weights = struct('MVRate',1*[1 1 1], ...
'Output',[1*[1,1,1],1*[1,1,1],1*[1,1,1],1*[1,1,1]]); % Weights
x0 = [0;0;0;1;1;1;0;0;0;0;0;0];
no_var = 15;
lb = zeros(1,15);
ub = [10000*ones(1,12),10*ones(1,3)];
ga_opt = optimoptions('ga','Display','off','PlotFcn','gaplotdistance','PopulationSize',50,'MaxGenerations',50, ...
'UseParallel',true);
obj_fcn = @(gains) optimization_mpc_gains(gains);
[gains,best] = ga (obj_fcn,no_var,[],[],[],[],lb,ub,[],ga_opt)
function cost = optimization_mpc_gains(gains)
mdl = 'MPCSatellite';
PopulationSize = size(gains,1);
% create the SimluationInput object
for i1 = 1:PopulationSize
SimIn(i1) = Simulink.SimulationInput(mdl);
SimIn(i1) = SimIn(i1).setVariable('mpcobj.Weights.OutputVariables', gains(i1,1:12));
SimIn(i1) = SimIn(i1).setVariable('mpcobj.Weights.ManipulatedVariablesRate', gains(i1,13:end));
% 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
cost= zeros(PopulationSize, 1);
% fill cost with objective function values
for i2 = 1:PopulationSize
cost(i2,1) = SimOut(i2).ITAE(end);
end
end
error:
Starting parallel pool (parpool) using the 'Processes' profile ...
Preserving jobs with IDs: 1 2 because they contain crash dump files.
You can use 'delete(myCluster.Jobs)' to remove all jobs created with profile Processes. To create 'myCluster' use 'myCluster = parcluster('Processes')'.
Connected to the parallel pool (number of workers: 8).
[05-May-2023 12:08:49] Checking for availability of parallel pool...
[05-May-2023 12:08:49] Starting Simulink on parallel workers...
[05-May-2023 12:09:10] Configuring simulation cache folder on parallel workers...
[05-May-2023 12:09:11] Loading model on parallel workers...
[05-May-2023 12:09:39] Running simulations...
[05-May-2023 12:10:03] Completed 1 of 1 simulation runs
[05-May-2023 12:10:03] Cleaning up parallel workers...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Checking for availability of parallel pool...
[05-May-2023 12:10:11] Running simulations...
-->Converting model to discrete time.
-->Assuming output disturbance added to measured output channel #4 is integrated white noise.
-->Assuming output disturbance added to measured output channel #7 is integrated white noise.
Assuming no disturbance added to measured output channel #10.
-->Assuming output disturbance added to measured output channel #8 is integrated white noise.
-->Assuming output disturbance added to measured output channel #1 is integrated white noise.
Assuming no disturbance added to measured output channel #11.
-->Assuming output disturbance added to measured output channel #9 is integrated white noise.
-->Assuming output disturbance added to measured output channel #6 is integrated white noise.
-->Assuming output disturbance added to measured output channel #2 is integrated white noise.
-->Assuming output disturbance added to measured output channel #5 is integrated white noise.
Assuming no disturbance added to measured output channel #12.
-->Assuming output disturbance added to measured output channel #3 is integrated white noise.
-->The "Model.Noise" property is empty. Assuming white noise on each measured output.
[05-May-2023 12:10:19] Completed 1 of 1 simulation runs
[05-May-2023 12:10:11] Running simulations...
[05-May-2023 12:10:24] Completed 1 of 1 simulation runs. Run 1 has errors.
[05-May-2023 12:10:11] Running simulations...
[05-May-2023 12:10:24] Completed 1 of 1 simulation runs. Run 1 has errors.
[05-May-2023 12:10:11] Running simulations...
[05-May-2023 12:10:24] Completed 1 of 1 simulation runs. Run 1 has errors.
Warning: One or more simulations completed with errors. For more information, inspect the SimulationOutput objects at these indices:
[1]
Warning: Unrecognized field name "ITAE".
> In Simulink/SimulationOutput/get
In indexing
In Simulink.internal.subsrefRecurser
In indexing
In optimization_mpc_gains (line 24)
In MPCSatGenetic>@(gains)optimization_mpc_gains(gains) (line 29)
In createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
In parallel_function>make_general_channel/channel_general (line 837)
In remoteParallelFunction (line 67)
Warning: Unrecognized field name "ITAE".
> In Simulink/SimulationOutput/get
In indexing
In Simulink.internal.subsrefRecurser
In indexing
In optimization_mpc_gains (line 24)
In MPCSatGenetic>@(gains)optimization_mpc_gains(gains) (line 29)
In createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
In parallel_function>make_general_channel/channel_general (line 837)
In remoteParallelFunction (line 67)
[05-May-2023 12:10:12] Running simulations...
[05-May-2023 12:10:24] Completed 1 of 1 simulation runs. Run 1 has errors.
[05-May-2023 12:10:11] Running simulations...
[05-May-2023 12:10:24] Completed 1 of 1 simulation runs. Run 1 has errors.
Warning: One or more simulations completed with errors. For more information, inspect the SimulationOutput objects at these indices:
[1]
Warning: Unrecognized field name "ITAE".
> In Simulink/SimulationOutput/get
In indexing
In Simulink.internal.subsrefRecurser
In indexing
In optimization_mpc_gains (line 24)
In MPCSatGenetic>@(gains)optimization_mpc_gains(gains) (line 29)
In createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
In parallel_function>make_general_channel/channel_general (line 837)
In remoteParallelFunction (line 67)
Warning: Unrecognized field name "ITAE".
> In Simulink/SimulationOutput/get
In indexing
In Simulink.internal.subsrefRecurser
In indexing
In optimization_mpc_gains (line 24)
In MPCSatGenetic>@(gains)optimization_mpc_gains(gains) (line 29)
In createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
In parallel_function>make_general_channel/channel_general (line 837)
In remoteParallelFunction (line 67)
[05-May-2023 12:10:11] Running simulations...
[05-May-2023 12:10:24] Completed 1 of 1 simulation runs. Run 1 has errors.
[05-May-2023 12:10:12] Running simulations...
[05-May-2023 12:10:24] Completed 1 of 1 simulation runs. Run 1 has errors.
Warning: One or more simulations completed with errors. For more information, inspect the SimulationOutput objects at these indices:
[1]
Warning: Unrecognized field name "ITAE".
> In Simulink/SimulationOutput/get
In indexing
In Simulink.internal.subsrefRecurser
In indexing
In optimization_mpc_gains (line 24)
In MPCSatGenetic>@(gains)optimization_mpc_gains(gains) (line 29)
In createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
In parallel_function>make_general_channel/channel_general (line 837)
In remoteParallelFunction (line 67)
Warning: Unrecognized field name "ITAE".
> In Simulink/SimulationOutput/get
In indexing
In Simulink.internal.subsrefRecurser
In indexing
In optimization_mpc_gains (line 24)
In MPCSatGenetic>@(gains)optimization_mpc_gains(gains) (line 29)
In createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
In parallel_function>make_general_channel/channel_general (line 837)
In remoteParallelFunction (line 67)
Error using optimization_mpc_gains
Array indices must be positive integers or logical values.
Error in MPCSatGenetic>@(gains)optimization_mpc_gains(gains) (line 29)
obj_fcn = @(gains) optimization_mpc_gains(gains)
Error in createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
fcn_handle = @(x) fcn(x,FcnArgs{:});
Error in fcnvectorizer (line 22)
parfor (i = 1:popSize)
Error in makeState (line 69)
Score = fcnvectorizer(state.Population(initScoreProvided+2:end,:),FitnessFcn,1,...
Error in galincon (line 24)
state = makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);
Error in ga (line 416)
[x,fval,exitFlag,output,population,scores] = galincon(FitnessFcn,nvars, ...
Error in MPCSatGenetic (line 31)
[gains,best] = ga (obj_fcn,no_var,[],[],[],[],lb,ub,[],ga_opt)
Caused by:
Failure in user-supplied fitness function evaluation. GA cannot continue.
By the way the ITAE variable is the ga is a 2d array that I use To workspace block to save it in the work space.
댓글 수: 0
답변 (1개)
Alan Weiss
2023년 5월 8일
I am not at all sure that it is possible to run ga in parallel when the objective function is given by a Simulink model.
For a similar problem in parallel using surrogateopt, see Vectorized Surrogate Optimization for Custom Parallel Simulation. Good luck,
Alan Weiss
MATLAB mathematical toolbox documentation
참고 항목
카테고리
Help Center 및 File Exchange에서 Controller Creation에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!