artificial bee colony to GPU

Asked by khaled about 11 hours ago
Latest activity Commented on by Edric Ellis 5 minutes ago

i have the following ABC algorithm which i want to apply on GPU, which variable should i send to the GPU?

clear all
close all
clc
NP=20; %/* The number of colony size (employed bees+onlooker bees)*/
FoodNumber=NP/2; %/*The number of food sources equals the half of the colony size*/
limit=100; %/*A food source which could not be improved through "limit" trials is abandoned by its employed bee*/
maxCycle=2500; %/*The number of cycles for foraging {a stopping criteria}*/
%/* Problem specific variables*/
objfun='Sphere'; %cost function to be optimized
D=100; %/*The number of parameters of the problem to be optimized*/
ub=ones(1,D)*100; %/*lower bounds of the parameters. */
lb=ones(1,D)*(-100);%/*upper bound of the parameters.*/
runtime=6;%/*Algorithm can be run many times in order to see its robustness*/
GlobalMins=zeros(1,runtime);
isOpen = matlabpool('size') > 0;
if ~isOpen
matlabpool(4)
end
tic;
parfor r=1:runtime
% /*All food sources are initialized */
%/*Variables are initialized in the range [lb,ub]. If each parameter has different range, use arrays lb[j], ub[j] instead of lb and ub */
Range = repmat((ub-lb),[FoodNumber 1]);
Lower = repmat(lb, [FoodNumber 1]);
Foods = rand(FoodNumber,D) .* Range + Lower;
ObjVal=feval(objfun,Foods);
Fitness=calculateFitness(ObjVal);
%reset trial counters
trial=zeros(1,FoodNumber);
%/*The best food source is memorized*/
BestInd=find(ObjVal==min(ObjVal));
BestInd=BestInd(end);
GlobalMin=ObjVal(BestInd);
GlobalParams=Foods(BestInd,:);
iter=1;
while ((iter <= maxCycle)),
%%%%%%%%% EMPLOYED BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:(FoodNumber)
          %/*The parameter to be changed is determined randomly*/
          Param2Change=fix(rand*D)+1;
          %/*A randomly chosen solution is used in producing a mutant solution of the solution i*/
          neighbour=fix(rand*(FoodNumber))+1;
          %/*Randomly selected solution must be different from the solution i*/        
              while(neighbour==i)
                  neighbour=fix(rand*(FoodNumber))+1;
              end;
         sol=Foods(i,:);
         %  /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
         sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
         %  /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
          ind=find(sol<lb);
          sol(ind)=lb(ind);
          ind=find(sol>ub);
          sol(ind)=ub(ind);
          %evaluate new solution
          ObjValSol=feval(objfun,sol);
          FitnessSol=calculateFitness(ObjValSol);
         % /*a greedy selection is applied between the current solution i and its mutant*/
         if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
              Foods(i,:)=sol;
              Fitness(i)=FitnessSol;
              ObjVal(i)=ObjValSol;
              trial(i)=0;
          else
              trial(i)=trial(i)+1; %/*if the solution i can not be improved, increase its trial counter*/
         end;
      end;
%%%%%%%%%%%%%%%%%%%%%%%% CalculateProbabilities %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%/* A food source is chosen with the probability which is proportioal to its quality*/
%/*Different schemes can be used to calculate the probability values*/
%/*For example prob(i)=fitness(i)/sum(fitness)*/
%/*or in a way used in the metot below prob(i)=a*fitness(i)/max(fitness)+b*/
%/*probability values are calculated by using fitness values and normalized by dividing maximum fitness value*/
prob=(0.9.*Fitness./max(Fitness))+0.1;
%%%%%%%%%%%%%%%%%%%%%%%% ONLOOKER BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
i=1;
t=0;
while(t<FoodNumber)
    if(rand<prob(i))
        t=t+1;
        %/*The parameter to be changed is determined randomly*/
        Param2Change=fix(rand*D)+1;
          %/*A randomly chosen solution is used in producing a mutant solution of the solution i*/
          neighbour=fix(rand*(FoodNumber))+1;
          %/*Randomly selected solution must be different from the solution i*/        
              while(neighbour==i)
                  neighbour=fix(rand*(FoodNumber))+1;
              end;
         sol=Foods(i,:);
         %  /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
         sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;
         %  /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
          ind=find(sol<lb);
          sol(ind)=lb(ind);
          ind=find(sol>ub);
          sol(ind)=ub(ind);
          %evaluate new solution
          ObjValSol=feval(objfun,sol);
          FitnessSol=calculateFitness(ObjValSol);
         % /*a greedy selection is applied between the current solution i and its mutant*/
         if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
              Foods(i,:)=sol;
              Fitness(i)=FitnessSol;
              ObjVal(i)=ObjValSol;
              trial(i)=0;
          else
              trial(i)=trial(i)+1; %/*if the solution i can not be improved, increase its trial counter*/
         end;
      end;
      i=i+1;
      if (i==(FoodNumber)+1) 
          i=1;
      end;   
  end; 
%/*The best food source is memorized*/
         ind=find(ObjVal==min(ObjVal));
         ind=ind(end);
         if (ObjVal(ind)<GlobalMin)
         GlobalMin=ObjVal(ind);
         GlobalParams=Foods(ind,:);
         end;
%%%%%%%%%%%% SCOUT BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%/*determine the food sources whose trial counter exceeds the "limit" value. 
%In Basic ABC, only one scout is allowed to occur in each cycle*/
ind=find(trial==max(trial));
ind=ind(end);
if (trial(ind)>limit)
    trial(ind)=0;
    sol=(ub-lb).*rand(1,D)+lb;
    ObjValSol=feval(objfun,sol);
    FitnessSol=calculateFitness(ObjValSol);
    Foods(ind,:)=sol;
    Fitness(ind)=FitnessSol;
    ObjVal(ind)=ObjValSol;
end;
fprintf('Ýter=%d ObjVal=%g\n',iter,GlobalMin);
iter=iter+1;
end % End of ABC
GlobalMins(r)=GlobalMin;
end; %end of runs
toc;
save all

4 Comments

khaled about 10 hours ago

does it effect the GPU implementation?

Edric Ellis 5 minutes ago

GPUs are very efficient at running large vectorized array computations. You need to profile your code (without running in PARFOR) to work out which is the slowest piece, and whether you can vectorize that.

khaled

Products

No products are associated with this question.

0 Answers

Contact us