智能设计方法 第5章 遗传算法基础.ppt
#计算城市之间的距离矩阵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[