% gaOpfield.m % this script uses the genetic algorithm with binary chromosomes % to optimize the Hopfield (covariation) rule nUnits=20; % set number of units in network nPats=3; % set number of patterns YSS=zeros(nPats,nUnits); % define stable-state output array probA=0.5; % set actual probability that any pattern element is 1 nTs=200; % set number of asymmetric updates for networks popSize=5; % set the population size pow=fliplr(0:popSize-1); % set powers for decoding pw2=2.^pow'; % find powers of two for decoding genes POP=rand(popSize)>0.5; % randomize initial population chromL=5; % set length of each chromosome numGen=30; % set the number of generations muRate=0.01; % set mutation rate probEvec=zeros(1,popSize); % estimated probability hold vector DiffVec=zeros(1,popSize); % difference hold vector meanprobE=zeros(1,numGen); % mean estimated probability hold vector meanDiff=zeros(1,numGen); % mean difference hold vector for gen=1:numGen % for each generation probEpre=probEvec; % store previous estimated probability vector probEvec=0.01+(0.49/31)*POP*pw2; % decode chroms into probabilities P=rand(nPats,nUnits)0; % apply threshold of 0 end; % end asychronous updates YSS(pat,:)=y'; % save stable state in output array end % end loop over patterns DiffVec(chrom)=sum(sum(abs(P-YSS))); % difference on recall end % end change conditional end % end population loop meanprobE(gen)=mean(probEvec); % save mean estimated probability meanDiff(gen)=mean(DiffVec); % save mean difference if numGen==gen, break; end % do not change last generation if norm(DiffVec)==0, normDiff=DiffVec; % if norm is zero leave it else normDiff=DiffVec./norm(DiffVec); end % else normalize diff ranVec=rand(1,popSize); % generate a vector of random numbers normRan=ranVec./norm(ranVec); % normalize the random vector pertDiff=normDiff+normRan/3; % randomly perturb values for chroms [diffs,index]=sort(pertDiff); % sort chromosomes by perturbed value dad=POP(index(1),:); % dad has smallest perturbed value mom=POP(index(2),:); % mom has next smallest value coSite=ceil(rand*chromL); % choose a random crossover site son=[dad(1:coSite) mom(coSite+1:chromL)]; % generate son dtr=[mom(1:coSite) dad(coSite+1:chromL)]; % generate daughter POP(index(popSize-1),:)=son; % replace least fit by son POP(index(popSize),:)=dtr; % replace next least fit by dtr MUMX=rand(popSize)