필터 지우기
필터 지우기

Coding a GA using constraint functions but getting array size error. - SOLVED

조회 수: 4 (최근 30일)
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);

채택된 답변

Alan Weiss
Alan Weiss 2021년 8월 31일
I think that you can investigate this problem yourself by using the debugger to set a break point at or just before line 119, and then see why MATLAB complains that there are not nPop array elements.
Alan Weiss
MATLAB mathematical toolbox documentation
  댓글 수: 1
Lachlan Gibbons
Lachlan Gibbons 2021년 8월 31일
Thanks Alan, I actually discovered that by accident not long after posting the question, and as you predicted it helped me diagnose the issue. I've managed to get it to run and be constrained correctly now after a lot of trial and error. Amongst a few other minor changes, I changed the position change instruction for the pollutant constraints to set it to the max variable size instead of just nPop and then told it to re-evaluate the cost, which was the main error I made above (the position was changing but not the cost).
Thanks for your answer.

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by