1.种群初始化
self.population = np.round(np.random.rand(pop_size, chromosome_size)).astype(int)
2.适应度计算
def binary2decimal(self, population):
pop1 = np.zeros_like(population)
y = self.chromosome_size
for i in range(y):
pop1[:, i] = 2 ** (y - i - 1) * population[:, i]
pop = np.sum(pop1, 1)
pop2 = pop * 10/(1 << y)
return pop2
self.fit_value = 10 * np.sin(5 * x) + 7 * np.abs(x - 5) + 10
3.选择
def select_chromosome(self):
total_fitness_value = self.fit_value.sum()
p_fit_value = self.fit_value/total_fitness_value
p_fit_value = np.cumsum(p_fit_value)
point = np.sort(np.random.rand(self.pop_size, 1), 0)
fit_in = 0
new_in = 0
new_population = np.zeros_like(self.population)
while new_in < self.pop_size:
if point[new_in] < p_fit_value[fit_in]:
new_population[new_in, :] = self.population[fit_in, :]
new_in += 1
else:
fit_in += 1
self.population = new_population
4.交叉
def cross_chromosome(self, cross_rate):
x = self.pop_size
y = self.chromosome_size
new_population = np.zeros_like(self.population)
for i in range(0, x-1, 2):
if np.random.rand(1) < cross_rate:
insert_point = int(np.round(np.random.rand(1) * y).item())
new_population[i, :] = np.concatenate([self.population[i, 0:insert_point], self.population[i+1, insert_point:y]], 0)
new_population[i+1, :] = np.concatenate([self.population[i+1, 0:insert_point], self.population[i, insert_point:y]], 0)
else:
new_population[i, :] = self.population[i, :]
new_population[i + 1, :] = self.population[i + 1, :]
self.population = new_population
5.变异
def mutation_chromosome(self, mutation_rate):
x = self.pop_size
for i in range(x):
if np.random.rand(1) < mutation_rate:
m_point = int(np.round(np.random.rand(1) * self.chromosome_size).item())
if self.population[i, m_point] == 1:
self.population[i, m_point] = 0
else:
self.population[i, m_point] = 1