迭代次数为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)

fitnesses =calculate_fitnessindividual for individual in populationprintfitnesses110#迭代寻优for _ in rangen_generations #选择 offspring = tournament_selectionpopulationintpopulation_size2 populati

原文地址: https://www.cveoy.top/t/topic/b0oY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录