Coding a GA using constraint functions but getting array size error. - SOLVED
Mostrar comentarios más antiguos
Solved - turns out I'm a bit silly and didn't re-evaluate cost after changing positions. With a few other changes the code works as intended.
Trying to use a Genetic Algorithm to minimise the cost of a water treatment system, I'm not super experienced with MATLAB but thought I'd give it a go. I'm having problems making the array sized correctly - I've attached this part of the code (the full thing requires other functions to work) so if anyone can give me a heads up on what I'm missing I'd appreciate it.
function out = RunGA(problem, params)
% Problem
CostFunction = problem.CostFunction;
nVar = problem.nVar;
VarSize = [1, nVar];
VarMin = problem.VarMin;
VarMax = problem.VarMax;
ConsGP = problem.VarGP;
ConsTSS = problem.VarTSS;
ConsTN = problem.VarTN;
ConsTP = problem.VarTP;
% Params
MaxIt = params.MaxIt;
nPop = params.nPop;
beta = params.beta;
pC = params.pC;
nC = round(pC*nPop/2)*2;
gamma = params.gamma;
mu = params.mu;
sigma = params.sigma;
% Template for Empty Individuals
empty_individual.Position = [];
empty_individual.Cost = [];
empty_individual.treatmentGP = [];
empty_individual.treatmentTSS = [];
empty_individual.treatmentTN = [];
empty_individual.treatmentTP = [];
% Best Solution Ever Found
bestsol.Cost = inf;
% Initialization
pop = repmat(empty_individual, nPop, 1);
for i = 1:nPop
% Generate Random Solution
pop(i).Position = unifrnd(VarMin, VarMax, VarSize);
% Evaluate Solution
pop(i).Cost = CostFunction(pop(i).Position);
% Compare Solution to Best Solution Ever Found
if pop(i).Cost < bestsol.Cost
bestsol = pop(i);
end
end
% Best Cost of Iterations
bestcost = nan(MaxIt, 1);
%======================================================================
% Main Loop
for it = 1:MaxIt
% Selection Probabilities
c = [pop.Cost];
avgc = mean(c);
if avgc ~= 0
c = c/avgc;
end
probs = exp(-beta*c);
% Initialize Offsprings Population
popc = repmat(empty_individual, nC/2, 2);
% Crossover
for k = 1:nC/2
% Select Parents
p1 = pop(RouletteWheelSelection(probs(1,1:nPop)));
p2 = pop(RouletteWheelSelection(probs(1,1:nPop)));
% Perform Crossover
[popc(k, 1).Position, popc(k, 2).Position] = ...
UniformCrossover(p1.Position, p2.Position, gamma);
end
% Convert popc to Single-Column Matrix
popc = popc(:);
% disp(popc);% Position,% Cost,treatmentGP,treatmentTSS,treatmentTN,treatmentTP
% Mutation
for l = 1:nC
% Perform Mutation
popc(l).Position = Mutate(popc(l).Position, mu, sigma);
% Check for Variable Bounds
popc(l).Position = max(popc(l).Position, VarMin);
popc(l).Position = min(popc(l).Position, VarMax);
% Evaluation
popc(2).Cost = CostFunction(popc(l).Position);
% Compare Solution to Best Solution Ever Found
if popc(2).Cost < bestsol.Cost
bestsol = popc(2);
end
end
% Merge and Sort Populations
pop = SortPopulation(popc);
% Remove Extra Individuals
pop = pop(1:nPop);
%=======================================================================
% Constrain Solution
%Evaluate treatment of GP with current Solution
popc(3).treatmentGP = ConsGP(popc(3));
if popc(3).treatmentGP < 0.9
%pop(i)= nPop;
popc(1).Position= nPop;
end
%Evaluate treatment of TSS with current Solution
popc(4).treatmentTSS = ConsTSS(popc(4));
if popc(4).treatmentTSS < 0.8
%pop(i)= nPop;
popc(1).Position= nPop;
end
%Evaluate treatment of TN with current Solution
popc(5).treatmentTN = ConsTN(popc(5));
if popc(5).treatmentTN < 0.45
%pop(i)= nPop;
popc(1).Position= nPop;
end
%Evaluate treatment of TP with current Solution
popc(6).treatmentTP = ConsTP(popc(6));
if popc(6).treatmentTP < 0.65
%pop(i)= nPop;
popc(1).Position= nPop;
end
%==============================================================
% Update Best Cost of Iteration
%bestcost(it) = bestsol.Cost;
bestcost(it) = min(bestsol.Cost);
% Display Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(bestcost(it))]);
end
% Results
out.pop = pop;
out.bestsol = bestsol;
out.bestcost = bestcost;
end
The error code is as follows:
Index exceeds the number of array elements (1).
Error in RunGA (line 119)
pop = pop(1:nPop);
Error in app1 (line 29)
out = RunGA(problem, params);
Respuesta aceptada
Más respuestas (0)
Categorías
Más información sobre Random Number Generation en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!