文档详情

智能设计方法 第5章 遗传算法基础.ppt

发布:2025-02-16约2.07万字共88页下载文档
文本预览下载声明

#计算城市之间的距离矩阵defcompute_distance_matrix(cities):

num_cities=len(cities)

distance_matrix=np.zeros((num_cities,num_cities))

foriinrange(num_cities):

forjinrange(num_cities):

distance_matrix[i][j]=np.linalg.norm(cities[i]-cities[j])

returndistance_matrix

#适应度函数:计算路径长度#计算城市之间的距离矩阵deffitness(path,distance_matrix):

total_distance=0

foriinrange(len(path)-1):

total_distance+=distance_matrix[path[i]][path[i+1]]

total_distance+=distance_matrix[path[-1]][path[0]]#回到起点

returntotal_distance

#初始化种群

definitialize_population(population_size,num_cities):population=[]population=[]for_inrange(population_size):01individual=list(range(num_cities))02random.shuffle(individual)03population.append(individual)04returnpopulationreturnpopulation接下来,我们定义选择、交叉和变异操作:

#选择操作:轮盘赌选择

defselection(population,fitness_values):

total_fitness=sum(fitness_values)

probabilities=[fitness_value/total_fitnessforfitness_valueinfitness_values]

selected_indices=np.random.choice(len(population),size=len(population),p=probabilities)returnpopulationreturn[population[i]foriinselected_indices]

#交叉操作:部分映射交叉(PMX)

defcrossover(parent1,parent2):

size=len(parent1)

child1,child2=[None]*size,[None]*size

#选择交叉点

start,end=sorted(random.sample(range(size),2))#复制交叉段#复制交叉段child1[start:end]=parent1[start:end]1child2[start:end]=parent2[start:end]2#处理未映射的部分3foriinrange(size):4ifistartori=end:5index=(i+end)%size6whileparent1[index]inchild1[start:end]:7index=parent2.index(parent1[index])8child1[i]=parent1[index]9#复制交叉段index=(i+end)%size1whileparent2[index]inchild2[start:end]:2index=parent1.index(parent2[index])3child2[i]=parent2[index]4returnchild1,child25#变异操作:交换变异6defmutation(individual):7size=len(individual)8indices=random.sample(range(size),2)9#复制交叉段individual[indices[0]],individual[indices[1]]=individual[indices[1]],individual[

显示全部
相似文档