Skip to content

Instantly share code, notes, and snippets.

@jschwinger233
Created April 28, 2014 02:01
Show Gist options
  • Save jschwinger233/11360123 to your computer and use it in GitHub Desktop.
Save jschwinger233/11360123 to your computer and use it in GitHub Desktop.
function [fval x] = gaunc(fun, lb ,ub)
tic
popSize = 200;
patternTol = 1e-10;
generation = 1000;
stopStall = 100;
nGenome = length(lb);
xover = zeros(popSize, nGenome);
fval = zeros(1,generation);
fmean = zeros(1,generation);
lbRepmat = repmat(lb, 2 * nGenome, 1);
ubRepmat = repmat(ub, 2 * nGenome, 1);
patternVector = [diag(1:length(lb)); -diag(1:length(lb))];
pop = repmat(lb, popSize, 1) + bsxfun(@times, rand(popSize, nGenome), ub - lb);
fitness = fun(pop);
[~, isort] = sort(fitness);
elite = pop(isort(1:2), :);
for g = 1:generation
rd = unidrnd(2, popSize/2 - 1, nGenome) > 1;
pop = pop(randperm(popSize), :);
for i = 1 : popSize/2 - 1
ri = rd(i, :);
xover(2*i-1, ri) = pop(2*i-1, ri);
xover(2*i-1, ~ri) = pop(2*i, ~ri);
xover(2*i, ~ri) = pop(2*i-1, ~ri);
xover(2*i, ri) = pop(2*i, ri);
end
for j = 1:popSize - 2
crt = xover(j, :);
fcrt = fun(crt);
meshSize = 1;
while meshSize > patternTol
next = bsxfun(@plus, crt, meshSize * patternVector);
infeasibleUB = bsxfun(@gt, next, ub);
next(infeasibleUB) = ubRepmat(infeasibleUB);
infeasibleLB = bsxfun(@lt, next, lb);
next(infeasibleLB) = lbRepmat(infeasibleLB);
[fmin, imin] = min(fun(next));
if fmin < fcrt
meshSize = meshSize * 4;
crt = next(imin, :);
fcrt = fmin;
else
meshSize = meshSize / 4;
end
end
pop(j, :) = crt;
end
pop(end-1:end, :) = elite;
fitness = fun(pop);
[~, isort] = sort(fitness);
elite = pop(isort(1:2), :);
[CurrentMin, k] = min(fitness);
if g > 1
if fval(g-1) > CurrentMin
x = pop(k,:);
stall = 0;
else
stall = stall + 1;
end
fval(g) = CurrentMin;
else
fval(g) = CurrentMin;
x = pop(k,:);
stall = 0;
end
fmean(g) = mean(fitness);
if stall == stopStall
break
end
end
% shg
% clf reset
% set(gcf, 'color','white', 'menubar','none', 'name','Genetic Algorithm')
% plot(1:g, [fval(1:g); fmean(1:g)], '.')
% legend('Best Fitness','Mean Fitness')
% fval = fval(g);
% title(['Min=',vectorize(vpa(fval))])
% xlabel('Generation')
% ylabel('Fitness Value')
% shg
toc
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment