fitnesses =calculate_fitnessindividual for individual in populationprintfitnesses110#迭代寻优for _ in rangen_generations #选择 offspring = tournament_selectionpopulationintpopulation_size2 populati
迭代次数为1000
种群大小为100
交叉概率为0.8,变异概率为0.2
对每个个体进行10%的反转变异
from deap import base, creator, tools import random import numpy as np
评价函数
def calculate_fitness(individual): fitness = 0 for i in range(len(individual)-1): fitness += distance_matrix[individual[i]][individual[i+1]] fitness += distance_matrix[individual[-1]][individual[0]] return fitness
选择函数
def tournament_selection(population, k): offspring = [] for i in range(int(len(population)/2)): p1 = tools.selTournament(population, k) p2 = tools.selTournament(population, k) offspring1 = p1[0][:] offspring2 = p2[0][:] offspring.append(offspring1) offspring.append(offspring2) return offspring
交叉函数
def cx_partialy_matched(ind1, ind2): size = min(len(ind1), len(ind2)) p1, p2 = [0] * size, [0] * size
# Initialize the position of each indices in the individuals
for i in range(size):
p1[ind1[i]] = i
p2[ind2[i]] = i
# Choose crossover points
cxpoint1 = random.randint(0, size)
cxpoint2 = random.randint(0, size - 1)
if cxpoint2 >= cxpoint1:
cxpoint2 += 1
else: # Swap the two cx points
cxpoint1, cxpoint2 = cxpoint2, cxpoint1
# Apply crossover between cx points
for i in range(cxpoint1, cxpoint2):
# Keep track of the selected values
temp1 = ind1[i]
temp2 = ind2[i]
# Swap the matched value
ind1[i], ind1[p1[temp2]] = temp2, temp1
ind2[i], ind2[p2[temp1]] = temp1, temp2
# Position bookkeeping
p1[temp1], p1[temp2] = p1[temp2], p1[temp1]
p2[temp1], p2[temp2] = p2[temp2], p2[temp1]
return ind1, ind2
变异函数
def reverse_mutation(individual, indpb): for i in range(len(individual)): if random.random() < indpb: j = random.randint(0, len(individual) - 1) if i != j: individual[i], individual[j] = individual[j], individual[i] return individual
生成初始种群
def generate_population(size, num_cities): population = [] for i in range(size): individual = list(range(num_cities)) random.shuffle(individual) population.append(individual) return population
加载数据
distance_matrix = np.loadtxt('distance_matrix.txt', delimiter=',')
初始化遗传算法框架
creator.create('FitnessMin', base.Fitness, weights=(-1.0,)) creator.create('Individual', list, fitness=creator.FitnessMin) toolbox = base.Toolbox()
注册遗传算法函数
toolbox.register('generate_population', generate_population, size=100, num_cities=distance_matrix.shape[0]) toolbox.register('evaluate', calculate_fitness) toolbox.register('select', tournament_selection, k=3) toolbox.register('mate', cx_partialy_matched) toolbox.register('mutate', reverse_mutation, indpb=0.1)
定义遗传算法参数
population_size = 100 n_generations = 1000 crossover_probability = 0.8 mutation_probability = 0.2
生成初始种群
population = toolbox.generate_population()
迭代寻优
for _ in range(n_generations): # 选择 offspring = toolbox.select(population) population = offspring.copy() # 交叉 for i in range(0, len(offspring), 2): chromosome1 = offspring[i] chromosome2 = offspring[i+1] if random.random() < crossover_probability: new_chromosome1, new_chromosome2 = toolbox.mate(chromosome1, chromosome2) offspring[i] = new_chromosome1 offspring[i+1] = new_chromosome2 # 变异 for mutant in offspring: if random.random() < mutation_probability: mutant = toolbox.mutate(mutant) # 将变异后的个体和原来的个体合并,形成下一代种群 population[:] = population + offspring
打印最终结果
fitnesses = [toolbox.evaluate(individual) for individual in population] best_index = np.argmin(fitnesses) best_individual = population[best_index] best_fitness = fitnesses[best_index] print('Best individual:', best_individual) print('Best fitness:', best_fitness)
原文地址: https://www.cveoy.top/t/topic/b0oY 著作权归作者所有。请勿转载和采集!