function [Globalminimizer,Globalminimum] = Backtracking_Search_Algorithm(Func_name,N,Lower,Upper,Maxiter)


fobj = TestFunctions (Func_name); 
D=length(Lower);
T=zeros(N,D);
map=zeros(N,D);
P=zeros(N,D);
oldP=zeros(N,D);
mutant=zeros(N,D);
fitnessP=zeros(1,N);
fitnessT=zeros(1,N);
Globalminimizer=zeros(1,D);
Globalminimum=1e+200
mixrate=1.0;

for i=1:N
  for j=1:D
    P(i,j)=Lower(j)+(Upper(j)-Lower(j))*rand;
    oldP(i,j)=Lower(j)+(Upper(j)-Lower(j))*rand;
  end
  fitnessP(i)=fobj(P(i,:));
end

iter=1;

while(iter <= Maxiter)

        if(rand<rand)
           oldP(1:N,1:D)=P(1:N,1:D);
        end
        
        oldP=oldP(randperm(N),:);
        mutant=P+3.0.*randn.*(oldP-P);
        map(1:N,1:D)=0.0;
        
        if (rand < rand)
          for i=1:N
              u=randperm(D);
              Drand=ceil(mixrate*rand*D);
              for j=1:Drand
                  map(i,u(1:Drand))=1.0;
              end
  
          end
        else
          for i=1:N
              rndintD=ceil(rand*D);
              map(i,rndintD)=1.0;
          end
        end
       
        T(1:N,1:D)=mutant(1:N,1:D);
        for i=1:N
          for j=1:D
            if ( map(i,j)==0 )
              T(i,j)=P(i,j);
            end
          end
        end  
        
        T = boundary (T, Lower,Upper,N,D); 
        
        for i=1:N
          fitnessT(i)=fobj(T(i,:));
          if(fitnessT(i)< fitnessP(i))
             fitnessP(i)=fitnessT(i);
             P(i,:)=T(i,:);
          end
          
        end
      
        [minval,mindex]=min(fitnessP);
        if(minval < Globalminimum)
           Globalminimum=minval;
           Globalminimizer=P(mindex,:);
        end    

        iter=iter+1;
    
end
 
endfunction
