catalogue
4 quantum genetic algorithm -- Python implementation
5 quantum genetic algorithm -- Matlab implementation
1 important knowledge points
In the column, I have systematically summarized the genetic algorithm: *Intelligent optimization algorithm (continuously updating...) , let's first explain the important knowledge points, and then implement them with Python and Matlab respectively.
1.1 genetic algorithm
Genetic algorithm is an intelligent algorithm that simulates Darwin's theory of biological evolution and genetic variation. This algorithm has the advantages of strong robustness (used to represent the insensitivity of the control system to characteristic or parameter disturbance), standardized implementation steps, simplicity and universality. It is widely used in the fields of artificial intelligence, multi-objective decision-making, society and economy. However, the general genetic algorithm has some limitations: slow convergence speed, many iterations, easy to converge prematurely and easy to fall into the local optimal solution.
1.2 quantum computing
Quantum computing is a comprehensive interdisciplinary subject of quantum mechanics and information science. Quantum computing has the parallelism of quantum mechanics and faster computing speed; At the same time, there are many kinds of quantum states, and they rarely fall into local extremum when searching the optimal solution.
1.3 quantum genetic algorithm
Quantum genetic algorithm introduces the quantum state vector into genetic algorithm, and applies the probability amplitude of quantum bits to chromosome coding. A chromosome is the superposition of multiple quantum states. The quantum revolving gate is used to realize the mutation and renewal of chromosome. Therefore, quantum genetic algorithm has the advantages of less iterations, fast running speed, genetic variation with less population, wide search range and difficult to fall into local extremum.
To learn more about quantum genetic algorithms, you can read the following two articles:
The characteristics of quantum genetic algorithm are briefly introduced through a picture. The Yellow individual has the current optimal value, and the black is some other individual. After one iteration, the black individual will rotate and approach the Yellow individual. The quantum genetic algorithm replaces the original crossover process with a rotating gate. The individual has two function values. The convergence speed of optimization is faster. There is a rotation process to find the optimal. There is also an inertia formula in the rotation formula, that is, the rotation amplitude will decrease with the increase of the number of iterations. Compared with the genetic algorithm as a whole, it is more difficult to fall into the local optimal.
2. Operation steps
2.1 using qubits to initialize parent chromosomes
In traditional binary computing, values are represented by | 0 "and | 1", which are bits. Similarly, in the process of quantum computing, two basic states representing quantum are used, which are called qubits. Various states of qubits are expressed by the following formula:
Among them, α And β Is a complex number, which is called probability amplitude, and α And β satisfy
It is equivalent to
The quantum state can be expressed as:
Quantum genetic algorithm expresses the genes on the chromosome with quantum bits, so as to increase the population diversity. m chromosomes are randomly generated, and the genes on each chromosome are represented by quantum bits, and initialized to.
2.2 in quantum genetic algorithm, chromosomes are encoded by the probability amplitude of qubits. The coding scheme is as follows:
Pi is the ith gene, the phase of qubits, n is the number of chromosomes, k is the number of qubits, that is, the dimension of solution space, and rand is a random number in the range of [0,1]. Each qubit is divided into two lines, corresponding to the probability amplitudes of the two quantum basic states respectively, which meets the normalization condition. Therefore, each individual contains two cultural gene chains, and each gene chain is a candidate solution of the optimization problem. It can be seen that under the condition of constant population size, the number of candidate solutions of quantum genetic algorithm is twice that of genetic algorithm, which increases the diversity of understanding space and improves the probability of successful optimization.
2.3 measure each individual in the initialization population.
Randomly generate a number x ∈ [0,1], if
Then the measured value is taken as 1, otherwise it is taken as 0.
2.4 evaluate the fitness of each measured value to select the best individual and carry out genetic variation.
2.5 use quantum revolving gate to update the next generation of individuals. Quantum revolving gate is a commonly used method in logic gate, which is specifically expressed as:
Is the angle of quantum rotation, then the update of quantum bit is expressed as:
2.6 iteration, y=y+1
The optimal solution is obtained by setting the individual termination condition 2.7.
3 flow chart
4 quantum genetic algorithm -- Python implementation
4.1 data
4.2 code
# -*- coding: utf-8 -*- #==========Import package============ import numpy as np from sklearn import svm #SVM is a binary classifier from sklearn import cross_validation #Cross validation is a statistical analysis method used to verify the performance of classifiers import random import math import matplotlib.pyplot as plt #=======1. Import training data======== def load_data(data_file): ''' input: data_file(string):File of training data output: data(mat):Characteristics of training samples label(mat):Label of training sample ''' data = [] label = [] f = open(data_file) for line in f.readlines(): lines = line.strip().split(' ') #===Extracted label=== label.append(float(lines[0])) #==Extract features and put them into the matrix=== index = 0 tmp = [] for i in range(1, len(lines)): li = lines[i].strip().split(":") if int(li[0]) - 1 == index: tmp.append(float(li[1])) else: while(int(li[0]) - 1 > index): tmp.append(0) index += 1 tmp.append(float(li[1])) index += 1 while len(tmp) < 13: tmp.append(0) data.append(tmp) f.close() return np.array(data), np.array(label).T #===============================2. QGA algorithm================================================= class QGA(object): #====2.1 class initialization====== '''definition QGA class ''' def __init__(self,population_size,chromosome_num,chromosome_length,max_value,min_value,iter_num,deta): '''Initialization class parameters population_size(int):Population number chromosome_num(int):Chromosome number, corresponding to the number of parameters to be optimized chromosome_length(int):Chromosome length max_value(float):Maximum decimal value of chromosome min_value(float):Chromosome decimal value minimum iter_num(int):Number of iterations deta(float):Quantum rotation angle ''' self.population_size = population_size self.chromosome_num = chromosome_num self.chromosome_length = chromosome_length self.max_value = max_value self.min_value = min_value self.iter_num = iter_num self.deta = deta #======2.2 quantum form initialization of population================= def species_origin_angle(self): '''Population initialization input:self(object):QGA class output:population_Angle(list):Quantum angle list of population population_Angle2(list):The quantum angle list of empty population is used to store the crossed quantum angle list ''' population_Angle = [] for i in range(self.chromosome_num): tmp1 = [] #Store the quantum angles of all values of each chromosome for j in range(self.population_size): tmp2 = [] #Storage quantum angle for m in range(self.chromosome_length): a = np.pi * 2 * np.random.random() tmp2.append(a) tmp1.append(tmp2) population_Angle.append(tmp1) return population_Angle #======Convert the initialized quantum angle sequence into a list of quantum coefficients of the population====== def population_Q(self,population_Angle): ''' input:self(object):QGA class population_Angle(list):Quantum angle list of population output:population_Q(list):List of quantum coefficients of population ''' population_Q = [] for i in range(len(population_Angle)): tmp1 = [] #Store the quantum coefficient pairs of all values of each chromosome for j in range(len(population_Angle[i])): tmp2 = [] #Storing quantum pairs for each value of each chromosome tmp3 = [] #Store half of the quantum pair tmp4 = [] #Storing the other half of a quantum pair for m in range(len(population_Angle[i][j])): a = population_Angle[i][j][m] tmp3.append(np.sin(a)) tmp4.append(np.cos(a)) tmp2.append(tmp3) tmp2.append(tmp4) tmp1.append(tmp2) population_Q.append(tmp1) return population_Q #2.3 ==== calculate fitness function value============== def translation(self,population_Q): '''Convert the quantum list of population to binary list input:self(object):QGA class population_Q(list):Quantum list of populations output:population_Binary:Binary list of populations ''' population_Binary = [] for i in range(len(population_Q)): tmp1 = [] # Store all values of each chromosome in binary form for j in range(len(population_Q[i])): tmp2 = [] ##Store the binary form of each value of each chromosome for l in range(len(population_Q[i][j][0])): if np.square(population_Q[i][j][0][l]) > np.random.random(): tmp2.append(1) else: tmp2.append(0) tmp1.append(tmp2) population_Binary.append(tmp1) return population_Binary #===Find the numerical list of fitness function. The fitness function used in this experiment is RBF_ 3 of SVM_ Fold cross validation average=== def fitness(self,population_Binary): ''' input:self(object):QGA class population_Binary(list):Binary list of populations output:fitness_value(list):Fitness function value class table parameters(list):List of corresponding optimization parameters ''' #===(1) The binary representation of the chromosome is converted to decimal and set between [min_value,max_value]=== parameters = [] #Store the possible values of all parameters for i in range(len(population_Binary)): tmp1 = [] #Store the possible values of a parameter for j in range(len(population_Binary[i])): total = 0.0 for l in range(len(population_Binary[i][j])): total += population_Binary[i][j][l] * math.pow(2,l) #Calculate the decimal value corresponding to binary value = (total * (self.max_value - self.min_value)) / math.pow(2,len(population_Binary[i][j])) + self.min_value ##Place the decimal value between [min_value,max_value] tmp1.append(value) parameters.append(tmp1) #====(2) The fitness function is RBF_ 3 of SVM_ Fold cross check average========= fitness_value = [] for l in range(len(parameters[0])): rbf_svm = svm.SVC(kernel = 'rbf', C = parameters[0][l], gamma = parameters[1][l]) cv_scores = cross_validation.cross_val_score(rbf_svm,trainX,trainY,cv =3,scoring = 'accuracy') fitness_value.append(cv_scores.mean()) #=====(3) Find the optimal fitness function value and the corresponding binary representation of parameters====== best_fitness = 0.0 best_parameter = [] best_parameter_Binary = [] for j in range(len(population_Binary)): tmp2 = [] best_parameter_Binary.append(tmp2) best_parameter.append(tmp2) for i in range(len(population_Binary[0])): if best_fitness < fitness_value[i]: best_fitness = fitness_value[i] for j in range(len(population_Binary)): best_parameter_Binary[j] = population_Binary[j][i] best_parameter[j] = parameters[j][i] return parameters,fitness_value,best_parameter_Binary,best_fitness,best_parameter #============2.4 full interference crossover=============== def crossover(self,population_Angle): '''Full interference crossover of population quantum angle list input:self(object):QGA class population_Angle(list):Quantum angle list of population ''' #===Initialize an empty list, the list of quantum angles after full interference crossing== population_Angle_crossover = [] for i in range(self.chromosome_num): tmp11 = [] for j in range(self.population_size): tmp21 = [] for m in range(self.chromosome_length): tmp21.append(0.0) tmp11.append(tmp21) population_Angle_crossover.append(tmp11) for i in range(len(population_Angle)): for j in range(len(population_Angle[i])): for m in range(len(population_Angle[i][j])): ni = (j - m) % len(population_Angle[i]) population_Angle_crossover[i][j][m] = population_Angle[i][ni][m] return population_Angle_crossover #============2.4 variation================== def mutation(self,population_Angle_crossover,population_Angle,best_parameter_Binary,best_fitness): '''Quantum mutation using quantum gate transformation matrix input:self(object):QGA class population_Angle_crossover(list):List of quantum angles after full interference crossing output:population_Angle_mutation(list):List of quantum angles after mutation ''' #==(1) Get the fitness function value list after crossing======= population_Q_crossover = self.population_Q(population_Angle_crossover) ## List of population quantum coefficients after crossover population_Binary_crossover = self.translation(population_Q_crossover) ## Binary number list of populations after crossover parameters,fitness_crossover,best_parameter_Binary_crossover,best_fitness_crossover,best_parameter = self.fitness(population_Binary_crossover) ## List of fitness function values after crossing #==(2) Initializes the rotation angle of each qubit==== Rotation_Angle = [] for i in range(len(population_Angle_crossover)): tmp1 = [] for j in range(len(population_Angle_crossover[i])): tmp2 = [] for m in range(len(population_Angle_crossover[i][j])): tmp2.append(0.0) tmp1.append(tmp2) Rotation_Angle.append(tmp1) deta = self.deta #====(3) Find the rotation angle of each qubit======== for i in range(self.chromosome_num): for j in range(self.population_size): if fitness_crossover[j] <= best_fitness: for m in range(self.chromosome_length): s1 = 0 a1 = population_Q_crossover[i][j][0][m] b1 = population_Q_crossover[i][j][1][m] if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 0 and a1 * b1 > 0: s1 = -1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 0 and a1 * b1 < 0: s1 = 1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 0 and a1 * b1 == 0: s1 = 1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 1 and a1 * b1 < 0: s1 = -1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 1 and a1 * b1 == 0: s1 = 1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 0 and a1 * b1 > 0: s1 = -1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 0 and a1 * b1 < 0: s1 = 1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 0 and a1 * b1 == 0: s1 = -1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 1 and a1 * b1 > 0: s1 = 1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 1 and a1 * b1 < 0: s1 = -1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 1 and a1 * b1 == 0: s1 = 1 Rotation_Angle[i][j][m] = deta * s1 else: for m in range(self.chromosome_length): s2 = 0 a2 = population_Q_crossover[i][j][0][m] b2 = population_Q_crossover[i][j][1][m] if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 0 and a2 * b2 > 0: s2 = -1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 0 and a2 * b2 < 0: s2 = 1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 0 and a2 * b2 == 0: s2 = 1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 1 and a2 * b2 > 0: s2 = -1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 1 and a2 * b2 < 0: s2 = 1 if population_Binary_crossover[i][j][m] == 0 and best_parameter_Binary[i][m] == 1 and a2 * b2 == 0: s2 = 1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 0 and a2 * b2 > 0: s2 = 1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 0 and a2 * b2 < 0: s2 = -1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 0 and a2 * b2 == 0: s2 = 1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 1 and a2 * b2 > 0: s2 = 1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 1 and a2 * b2 < 0: s2 = -1 if population_Binary_crossover[i][j][m] == 1 and best_parameter_Binary[i][m] == 1 and a2 * b2 == 0: s2 = 1 Rotation_Angle[i][j][m] = deta * s2 #=======(4) According to the rotation angle of each qubit, a new list of quantum angles of the population is generated=============== for i in range(self.chromosome_num): for j in range(self.population_size): for m in range(self.chromosome_length): population_Angle[i][j][m] = population_Angle[i][j][m] + Rotation_Angle[i][j][m] return population_Angle #======2.5 draw the change diagram of fitness function value====== def plot(self,results): ''' Draw a picture ''' X = [] Y = [] for i in range(self.iter_num): X.append(i + 1) Y.append(results[i]) plt.plot(X,Y) plt.xlabel('Number of iteration',size = 15) plt.ylabel('Value of CV',size = 15) plt.title('QGA_RBF_SVM parameter optimization') plt.show() #===========2.6 main function================ def main(self): results = [] best_fitness = 0.0 best_parameter = [] #===Population initialization=== population_Angle= self.species_origin_angle() #===Iteration==== for i in range(self.iter_num): population_Q = self.population_Q(population_Angle) ## Calculate the fitness function value list of this iteration, the optimal fitness function value and the corresponding parameters parameters,fitness_value,current_parameter_Binary,current_fitness,current_parameter = self.fitness(population_Binary) ## Find out the best fitness function value and corresponding parameters so far if current_fitness > best_fitness: best_fitness = current_fitness best_parameter = current_parameter print('iteration is :',i+1,';Best parameters:',best_parameter,';Best fitness',best_fitness) results.append(best_fitness) ## Total interference crossover population_Angle_crossover = self.crossover(population_Angle) ## Quantum rotation variation population_Angle = self.mutation(population_Angle_crossover,population_Angle,current_parameter_Binary,current_fitness) if __name__ == '__main__': print('----------------1.Load Data-------------------') trainX,trainY = load_data('rbf_data') print('----------------2.Parameter Seting------------') population_size=200 chromosome_num=2 chromosome_length=20 max_value=15 min_value=0.01 iter_num=100 deta=0.1 * np.pi print('----------------3.QGA_RBF_SVM-----------------') qga = QGA(population_size,chromosome_num,chromosome_length,max_value,min_value,iter_num,deta) qga.main()
4.3 results
5 quantum genetic algorithm -- Matlab implementation
clear,clc %% 1 Basic concepts %(1)Quantum genetic algorithm is an intelligent optimization algorithm combining quantum computing and genetic algorithm K.H.Han They introduced quantum concepts such as quantum state, quantum gate, quantum state characteristics and probability amplitude into genetic algorithm. %Quantum genetic algorithm is also a probabilistic prime search algorithm, which uses qubits to represent genes. The gene of genetic algorithm expresses certain information, while in quantum genetic algorithm, the gene expressed by qubit contains all possible information due to the superposition of quantum information. %(2)In quantum computing, qubits|0〉and|1〉It represents two basic states of micro particles. According to the superposition principle, the superposition state of quantum information can be expressed as a linear combination of these two basic states, i.e|ψ〉=α|0〉+β|1〉,WhereαandβIs a complex number, which represents the probability amplitude of the qubit state, where and represent the quantum state respectively|ψ〉Collapse due to measurement to|0〉State sum|1〉The probability of the state and satisfies the normalization condition %(3)In quantum genetic algorithm, chromosomes are encoded by the probability amplitude of qubits. The coding scheme is as follows: %θIs the phase of the qubit, n Is the number of chromosomes, k Is the number of qubits, that is, the dimension of the solution space, rand yes[0,1]Random number in the range. Each qubit is divided into two lines, corresponding to the probability amplitudes of the two quantum basic states respectively, which meets the normalization condition. Therefore, each individual contains two cultural gene chains, and each gene chain is a candidate solution of the optimization problem. It can be seen that under the condition of constant population size, the number of candidate solutions of quantum genetic algorithm is twice that of genetic algorithm, which increases the diversity of understanding space and improves the probability of successful optimization. %(4)In quantum genetic algorithm, quantum revolving gate is used to change the phase of qubit to update the probability amplitude of qubit, so as to achieve the effect of gene mutation. %% 2,Basic steps of quantum genetic algorithm: %step1: Initialize parent chromosome %step2: The quantile of each chromosome is measured to get a state. Calculate the fitness for each state and record the best individual and fitness. %step3: The algebra set by genetic evolution, in which the quantum revolving gate is used to carry out genetic variation on the chromosomes of each generation. %step4: When the termination condition is reached, the best individual and fitness are output. %% 3,Quantum genetic algorithm MATLAB The implementation code is as follows %% Variable part popsize = 100; %Population size vartotal = 2; %The number of variables is the quantum number of a chromosome shiftstep = 0.01*pi; %Corner step Pm = ones(1,popsize)*0.05;%Set mutation probability maxgen = 200; %Set the number of iterations %% Array part--Value range of optimization variables in solution space var_range(1,1) = -100; var_range(1,2) = 100; var_range(2,1) = -100; var_range(2,2) = 100; %% Individual initialization %Initialized 2*popsize Individuals, each of which has two gene chains for i=1:1:vartotal fai(:,i)=2*pi*rand(popsize,1); chrom(:,1,i)=cos(fai(:,i)); chrom(:,2,i)=sin(fai(:,i)); oldfai(:,i)=2*pi*rand(popsize,1); oldchrom(:,1,i)=cos(oldfai(:,i)); oldchrom(:,2,i)=sin(oldfai(:,i)); end %% Solution space transformation for i=1:1:2 for j=1:1:vartotal chromx(:,i,j)=0.5*(var_range(j,2)*(1+chrom(:,i,j))+var_range(j,1)*(1-chrom(:,i,j))); oldchromx(:,i,j)=0.5*(var_range(j,2)*(1+oldchrom(:,i,j))+var_range(j,1)*(1-oldchrom(:,i,j))); end end %% Calculate fitness---Fitness function: Shaffer's F6 function for i=1:1:popsize for j=1:1:2 x1=chromx(i,j,1); x2=chromx(i,j,2); fitness(i,j)=0.5-((sin(sqrt(x1^2+x2^2)))^2-0.5)/(1+0.001*(x1^2+x2^2))^2; x1=oldchromx(i,j,1); x2=oldchromx(i,j,2); oldfitness(i,j)=0.5-((sin(sqrt(x1^2+x2^2)))^2-0.5)/(1+0.001*(x1^2+x2^2))^2; end end %% Obtain the optimal solution and corresponding independent variables [Bestf,Indexf]=sort(fitness,2); [BestF,IndexF]=sort(Bestf,1); gBestfit=BestF(popsize,2); gBestpop=IndexF(popsize,2); gBestg=Indexf(gBestpop,2); gBestfai=fai(gBestpop,:); gBestC=chrom(gBestpop,:,:); gBest_x=chromx(gBestpop,:,:); gBest_fit=fitness(gBestpop,:); %% Start of main cycle for gen = 1:1:maxgen for i = 1:1:vartotal tmp=abs(chromx(1,gBestg,i)-oldchromx(1,gBestg,i)); if tmp<1.0e-2 tmp=1.0e-2; end max(i)=abs(fitness(1,gBestg)-oldfitness(1,gBestg))/tmp; min(i)=abs(fitness(1,gBestg)-oldfitness(1,gBestg))/tmp; for j = 1:1:popsize tmp=abs(chromx(j,gBestg,i)-oldchromx(j,gBestg,i)); if tmp<1.0e-2 tmp=1.0e-2; end if max(i)<=abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp max(i)=abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp; end if min(i)>abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp min(i)=abs(fitness(j,gBestg)-oldfitness(j,gBestg))/tmp; end end end %% Perform qubit phase rotation to obtain a new phase for i=1:1:popsize for j = 1:1:vartotal tmp=abs(chromx(i,gBestg,j)-oldchromx(i,gBestg,j)); if tmp<1.0e-2 tmp=1.0e-2; end grad=abs(fitness(i,gBestg)-oldfitness(i,gBestg))/tmp; tmp=abs(grad-min(j)); if tmp<1.0e-2 tmp=1.0e-2; end rate(i,j)=tmp/abs(max(j)-min(j)); if max(j)-min(j)==0 rate(i,j)=1; end fai(i,j)=fai(i,j)+sign(chrom(i,1,j)*gBestC(1,2,j)-gBestC(1,1,j)*chrom(i,2,j))*(1-rate(i,j))*shiftstep*exp(-gen/maxgen); end end %% Execute qubit phase variation Pm_rand = rand(popsize,vartotal);%Generate a random number and compare it with the mutation probability to determine whether to mutate for i=1:1:popsize for j=1:1:vartotal if (Pm(i)>Pm_rand(i,j))&&(i==gBestpop) fai(i,j)=0.5*pi-fai(i,j); end end end %% Intergenerational replication---Two adjacent generations are preserved oldchrom=chrom; oldchromx=chromx; oldfitness=fitness; %% Generate new quantum individuals chrom(:,1,:)=cos(fai(:,:)); chrom(:,2,:)=sin(fai(:,:)); %% Solution space transformation for i=1:1:2 for j=1:1:vartotal chromx(:,i,j)=0.5*(var_range(j,2)*(1+chrom(:,i,j))+var_range(j,1)*(1-chrom(:,i,j))); end end %% Calculate fitness---Fitness function: Shaffer's F6 function for i=1:1:popsize for j=1:1:2 x1=chromx(i,j,1); x2=chromx(i,j,2); fitness(i,j)=0.5-((sin(sqrt(x1^2+x2^2)))^2-0.5)/(1+0.001*(x1^2+x2^2))^2; end end %% Obtain the optimal solution and corresponding independent variables [Bestf,Indexf]=sort(fitness,2); [BestF,IndexF]=sort(Bestf,1); Bestfit=BestF(popsize,2); Bestpop=IndexF(popsize,2); Bestg=Indexf(Bestpop,2); Bestfai=fai(Bestpop,:); BestC=chrom(Bestpop,:,:); Best_x=chromx(Bestpop,:,:); Best_fit=fitness(Bestpop,:); Badpop=IndexF(1,1); %% If the optimal solution degenerates, the previous generation optimal solution is retrieved if Bestfit<gBestfit Bestfit=gBestfit; fai(Badpop,:)=gBestfai(1,:); chrom(Badpop,:,:)=gBestC(1,:,:); chromx(Badpop,:,:)=gBest_x(1,:,:); fitness(Badpop,:)=gBest_fit(1,:); gBestpop=Badpop;%The worst chromosome number becomes the best end %% If the optimal solution evolves, the optimal solution is replaced if Bestfit>=gBestfit gBestfit=Bestfit; gBestpop=Bestpop; gBestg=Bestg; gBestfai=Bestfai; gBestC=BestC; gBest_x=Best_x; gBest_fit=Best_fit; end %---------------------Record optimization results--------------------- result(gen)=gBestfit; end %% End of main cycle bestresult=result(gen) figure(1) plot(1:maxgen,result) xlabel('Number of iterations') ylabel('function value')