基于遗传算法的TSP问题求解算法及其系统

合集下载

实验六:遗传算法求解TSP问题实验2篇

实验六:遗传算法求解TSP问题实验2篇

实验六:遗传算法求解TSP问题实验2篇第一篇:遗传算法的原理与实现1. 引言旅行商问题(TSP问题)是一个典型的组合优化问题,它要求在给定一组城市和每对城市之间的距离后,找到一条路径,使得旅行商能够在所有城市中恰好访问一次并回到起点,并且总旅行距离最短。

遗传算法作为一种生物启发式算法,在解决TSP问题中具有一定的优势。

本实验将运用遗传算法求解TSP问题,以此来探讨和研究遗传算法在优化问题上的应用。

2. 遗传算法的基本原理遗传算法是模拟自然界生物进化过程的一种优化算法。

其基本原理可以概括为:选择、交叉和变异。

(1)选择:根据问题的目标函数,以适应度函数来评估个体的优劣程度,并按照适应度值进行选择,优秀的个体被保留下来用于下一代。

(2)交叉:从选出的个体中随机选择两个个体,进行基因的交换,以产生新的个体。

交叉算子的选择及实现方式会对算法效果产生很大的影响。

(3)变异:对新生成的个体进行基因的变异操作,以保证算法的搜索能够足够广泛、全面。

通过选择、交叉和变异操作,不断迭代生成新一代的个体,遗传算法能够逐步优化解,并最终找到问题的全局最优解。

3. 实验设计与实施(1)问题定义:给定一组城市和每对城市之间的距离数据,要求找到一条路径,访问所有城市一次并回到起点,使得旅行距离最短。

(2)数据集准备:选择适当规模的城市数据集,包括城市坐标和每对城市之间的距离,用于验证遗传算法的性能。

(3)遗传算法的实现:根据遗传算法的基本原理,设计相应的选择、交叉和变异操作,确定适应度函数的定义,以及选择和优化参数的设置。

(4)实验流程:a. 初始化种群:随机生成初始种群,每个个体表示一种解(路径)。

b. 计算适应度:根据适应度函数,计算每个个体的适应度值。

c. 选择操作:根据适应度值选择一定数量的个体,作为下一代的父代。

d. 交叉操作:对父代进行交叉操作,生成新的个体。

e. 变异操作:对新生成的个体进行变异操作,以增加搜索的多样性。

实验六:遗传算法求解TSP问题实验3篇

实验六:遗传算法求解TSP问题实验3篇

实验六:遗传算法求解TSP问题实验3篇以下是关于遗传算法求解TSP问题的实验报告,分为三个部分,总计超过3000字。

一、实验背景与原理1.1 实验背景旅行商问题(Traveling Salesman Problem,TSP)是组合优化中的经典问题。

给定一组城市和每两个城市之间的距离,求解访问每个城市一次并返回出发城市的最短路径。

TSP 问题具有很高的研究价值,广泛应用于物流、交通运输、路径规划等领域。

1.2 遗传算法原理遗传算法(Genetic Algorithm,GA)是一种模拟自然选择和遗传机制的搜索算法。

它通过选择、交叉和变异操作生成新一代解,逐步优化问题的解。

遗传算法具有全局搜索能力强、适用于多种优化问题等优点。

二、实验设计与实现2.1 实验设计本实验使用遗传算法求解TSP问题,主要包括以下步骤:(1)初始化种群:随机生成一定数量的个体(路径),每个个体代表一条访问城市的路径。

(2)计算适应度:根据路径长度计算每个个体的适应度,适应度越高,路径越短。

(3)选择操作:根据适应度选择优秀的个体进入下一代。

(4)交叉操作:随机选择两个个体进行交叉,生成新的个体。

(5)变异操作:对交叉后的个体进行变异,增加解的多样性。

(6)更新种群:将新生成的个体替换掉上一代适应度较低的个体。

(7)迭代:重复步骤(2)至(6),直至满足终止条件。

2.2 实验实现本实验使用Python语言实现遗传算法求解TSP问题。

以下为实现过程中的关键代码:(1)初始化种群```pythondef initialize_population(city_num, population_size): population = []for _ in range(population_size):individual = list(range(city_num))random.shuffle(individual)population.append(individual)return population```(2)计算适应度```pythondef calculate_fitness(population, distance_matrix): fitness = []for individual in population:path_length =sum([distance_matrix[individual[i]][individual[i+1]] for i in range(len(individual) 1)])fitness.append(1 / path_length)return fitness```(3)选择操作```pythondef selection(population, fitness, population_size): selected_population = []fitness_sum = sum(fitness)fitness_probability = [f / fitness_sum for f in fitness]for _ in range(population_size):individual = random.choices(population, fitness_probability)[0]selected_population.append(individual)return selected_population```(4)交叉操作```pythondef crossover(parent1, parent2):index1 = random.randint(0, len(parent1) 2)index2 = random.randint(index1 + 1, len(parent1) 1)child1 = parent1[:index1] +parent2[index1:index2] + parent1[index2:]child2 = parent2[:index1] +parent1[index1:index2] + parent2[index2:]return child1, child2```(5)变异操作```pythondef mutation(individual, mutation_rate):for i in range(len(individual)):if random.random() < mutation_rate:j = random.randint(0, len(individual) 1) individual[i], individual[j] = individual[j], individual[i]return individual```(6)更新种群```pythondef update_population(parent_population, child_population, fitness):fitness_sum = sum(fitness)fitness_probability = [f / fitness_sum for f in fitness]new_population =random.choices(parent_population + child_population, fitness_probability, k=len(parent_population)) return new_population```(7)迭代```pythondef genetic_algorithm(city_num, population_size, crossover_rate, mutation_rate, max_iterations): distance_matrix =create_distance_matrix(city_num)population = initialize_population(city_num, population_size)for _ in range(max_iterations):fitness = calculate_fitness(population, distance_matrix)selected_population = selection(population, fitness, population_size)parent_population = []child_population = []for i in range(0, population_size, 2):parent1, parent2 = selected_population[i], selected_population[i+1]child1, child2 = crossover(parent1, parent2)child1 = mutation(child1, mutation_rate)child2 = mutation(child2, mutation_rate)parent_population.extend([parent1, parent2]) child_population.extend([child1, child2])population =update_population(parent_population, child_population, fitness)best_individual =population[fitness.index(max(fitness))]best_path_length =sum([distance_matrix[best_individual[i]][best_individual[i +1]] for i in range(len(best_individual) 1)])return best_individual, best_path_length```三、实验结果与分析3.1 实验结果本实验选取了10个城市进行测试,遗传算法参数设置如下:种群大小:50交叉率:0.8变异率:0.1最大迭代次数:100实验得到的最佳路径长度为:1953.53.2 实验分析(1)参数设置对算法性能的影响种群大小:种群大小会影响算法的搜索能力和收敛速度。

利用遗传算法解决TSP问题课件

利用遗传算法解决TSP问题课件
编码方式
给每个城市一个固定的基因编号,例如10个城市为 0 1 2 3 4 5 6 7 8 9 ,随机地组成一个染色体(以下所有情况都以10个城市为例说明)。 约定这10个城市之间的行走路线为: 0123456789 (其余基因序列的路线同样道理)
两个城市间的距离(用r[i][j]表示)
轮盘选择
for(mem=0;mem<PopSize;mem++) sum+=population[mem].fitness; for(mem=0;mem<PopSize;mem++) //使小的选中的可能性大 x[mem]=sum-population[mem].fitness; sum=0.0; for(mem=0;mem<PopSize;mem++) sum+=x[mem]; /* Calculate relative fitness */ for(mem=0;mem<PopSize;mem++) population[mem].rfitness=x[mem]/sum;
仿真结果
仿真结果
一个完整路线的长度
例如基因序列为:0 8 2 9 7 5 6 4 1 3,存放在gene[0]~gene[9]中。 表示行旅行路线为: 0829756413 总路程为: r[gene[0]][gene[1]]+r[gene[1]][gene[2]]~ +r[gene[9]gene[0]]
交叉
例如一个基因序列为: 0 2 5 6 9 8 1 3 4 7 产生两个0~9的int型随机数,如得到2和6,将gene[2]和gene[6]之间的基因反序,得到: 0 2 1 8 9 6 5 3 4 7

遗传算法(GA)解决TSP问题

遗传算法(GA)解决TSP问题

遗传算法(GA)解决TSP问题 遗传算法解决TSP问题遗传算法遗传算法的基本原理是通过作⽤于染⾊体上的基因寻找好的染⾊体来求解问题,它需要对算法所产⽣的每个染⾊体进⾏评价,并基于适应度值来选择染⾊体,使适应性好的染⾊体有更多的繁殖机会,在遗传算法中,通过随机⽅式产⽣若⼲个所求解问题的数字编码,即染⾊体,形成初始种群;通过适应度函数给每个个体⼀个数值评价,淘汰低适应度的个体,选择⾼适应度的个体参加遗传操作,经过遗产操作后的个体集合形成下⼀代新的种群,对这个新的种群进⾏下⼀轮的进化。

TSP问题TSP问题即旅⾏商问题,经典的TSP可以描述为:⼀个商品推销员要去若⼲个城市推销商品,该推销员从⼀个城市出发,需要经过所有城市后,回到出发地。

应如何选择⾏进路线,以使总的⾏程最短。

从图论的⾓度来看,该问题实质是在⼀个带权完全⽆向图中,找⼀个权值最⼩的哈密尔顿回路。

遗传算法解决TSP问题概念介绍:种群 ==> 可⾏解集个体 ==> 可⾏解染⾊体 ==> 可⾏解的编码基因 ==> 可⾏解编码的分量基因形式 ==> 遗传编码适应度 ==> 评价的函数值(适应度函数)选择 ==> 选择操作交叉 ==> 编码的交叉操作变异 ==> 可⾏解编码的变异遗传操作:就包括优选适应性强的个体的“选择”;个体间交换基因产⽣新个体的“交叉”;个体间的基因突变⽽产⽣新个体的“变异”。

其中遗传算法是运⽤遗传算⼦来进⾏遗传操作的。

即:选择算⼦、变异算⼦、交叉算⼦。

遗传算法的基本运算过程(1)种群初始化:个体编码⽅法有⼆进制编码和实数编码,在解决TSP问题过程中个体编码⽅法为实数编码。

对于TSP问题,实数编码为1-n的实数的随机排列,初始化的参数有种群个数M、染⾊体基因个数N(即城市的个数)、迭代次数C、交叉概率Pc、变异概率Pmutation。

(2)适应度函数:在TSP问题中,对于任意两个城市之间的距离D(i,j)已知,每个染⾊体(即n个城市的随机排列)可计算出总距离,因此可将⼀个随机全排列的总距离的倒数作为适应度函数,即距离越短,适应度函数越好,满⾜TSP要求。

遗传算法解决TSP问题【精品毕业设计】(完整版)

遗传算法解决TSP问题【精品毕业设计】(完整版)
2.2遗传算法原型:
GA(Fitness,Fitness_threshold,p,r,m)
Fitness:适应度评分函数,为给定假设赋予一个评估分数
Fitness_threshold:指定终止判据的阈值
p:群体中包含的假设数量
r:每一步中通过交叉取代群体成员的比例
m:变异率
初始化群体:P←随机产生的p个假设
在本程序的TSP问题中一共有20个城市,也就是在图模型中有20个顶点,因此一个染色体的长度为20。
3.3适应函数f(i)
对具有n个顶点的图,已知各顶点之间( , )的边长度d( , ),把 到 间的一条通路的路径长度定义为适应函数:
对该最优化问题,就是要寻找解 ,使f( )值最小。
3.4选择操作
选择作为交叉的双亲,是根据前代染色体的适应函数值所确定的,质量好的个体,即从起点到终点路径长度短的个体被选中的概率较大。
(2)交叉(Crossover):对于选中进行繁殖的两个染色体X,Y,以X,Y为双亲作交叉操作,从而产生两个后代X1,Y1.
(3)变异(Mutation):对于选中的群体中的个体(染色体),随机选取某一位进行取反运算,即将该染色体码翻转。
用遗传算法求解的过程是根据待解决问题的参数集进行编码,随机产生一个种群,计算适应函数和选择率,进行选择、交叉、变异操作。如果满足收敛条件,此种群为最好个体,否则,对产生的新一代群体重新进行选择、交叉、变异操作,循环往复直到满足条件。
3.变异:使用均匀的概率从Ps中选择m%的成员.对于选出的每个成员,在它表示中随机选择一个为取反
4.更新:P←Ps
5.评估:对于P中的每个h计算Fitness(h)
从P中返回适应度最高的假设
3.
3.1 TSP问题的图论描述

基于Matlab的遗传算法解决TSP问题的报告

基于Matlab的遗传算法解决TSP问题的报告

报告题目:基于Matlab的遗传算法解决TSP问题说明:该文包括了基于Matlab的遗传算法解决TSP问题的基本说明,并在文后附录了实现该算法的所有源代码。

此代码经过本人的运行,没有发现错误,结果比较接近理论最优值,虽然最优路径图有点交叉。

因为本人才疏学浅,本报告及源代码的编译耗费了本人较多的时间与精力,特收取下载积分,还请见谅。

若有什么问题,可以私信,我们共同探讨这一问题。

希望能对需要这方面的知识的人有所帮助!1.问题介绍旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题。

它可以描述为:一个商品推销员要去若干个城市推销商品,从一个城市出发,需要经过所有城市后,回到出发地,应如何选择行进路线,以使总行程最短。

从图论的角度看,该问题实质是在一个带权完全无向图中。

找一个权值最小的Hemilton回路。

其数学描述为:设有一个城市集合其中每对城市之间的距离(),i j d c c R +∈,求一对经过C中每个城市一次的路线()12,,n c c c ΠΠΠ⋯使()()()1111min ,,n i n i i d c c d c c −ΠΠΠΠ+=+∑其中()12,,12n n ΠΠΠ⋯⋯是,的一个置换。

2.遗传算法2.1遗传算法基本原理遗传算法是由美国J.Holland 教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。

遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。

遗传算法,在本质上是一种不依赖具体问题的直接搜索方法,是一种求解问题的高效并行全局搜索方法。

遗传算法在模式识别、神经网络、图像处理、机器学习、工业优化控制、自适应控制、负载平衡、电磁系统设计、生物科学、社会科学等方面都得到了应用。

TSP问题的遗传算法求解

TSP问题的遗传算法求解

TSP问题的遗传算法求解一、问题描述假设有一个旅行商人要拜访N个城市,要求他从一个城市出发,每个城市最多拜访一次,最后要回到出发的城市,保证所选择的路径长度最短。

二、算法描述(一)算法简介遗传算法(GeneticAlgorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,通过模拟自然进化过程搜索最优解。

遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,并借助于自然遗传学的遗传算子(geneticoperators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。

这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。

(摘自百度百科)。

(二)遗传算子遗传算法中有选择算子、交叉算子和变异算子。

选择算子用于在父代种群中选择进入下一代的个体。

交叉算子用于对种群中的个体两两进行交叉,有Partial-MappedCrossover、OrderCrossover、Position-basedCrossover等交叉算子。

变异算子用于对种群中的个体进行突变。

(三)算法步骤描述遗传算法的基本运算过程如下:1.初始化:设置进化代数计数器t=0、设置最大进化代数T、交叉概率、变异概率、随机生成M个个体作为初始种群P2.个体评价:计算种群P中各个个体的适应度3.选择运算:将选择算子作用于群体。

以个体适应度为基础,选择最优个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代4.交叉运算:在交叉概率的控制下,对群体中的个体两两进行交叉5.变异运算:在变异概率的控制下,对群体中的个体两两进行变异,即对某一个体的基因进行随机调整6.经过选择、交叉、变异运算之后得到下一代群体P1。

(完整)用遗传算法求解TSP问题

(完整)用遗传算法求解TSP问题

用遗传算法求解TSP问题遗传算法(Genetic Algorithm——GA),是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,它是由美国Michigan大学的J。

Holland教授于1975年首先提出的。

J.Holland 教授和它的研究小组围绕遗传算法进行研究的宗旨有两个:抽取和解释自然系统的自适应过程以及设计具有自然系统机理的人工系统。

遗传算法的大致过程是这样的:将每个可能的解看作是群体中的一个个体或染色体,并将每个个体编码成字符串的形式,根据预定的目标函数对每个个体进行评价,即给出一个适应度值。

开始时,总是随机的产生一些个体,根据这些个体的适应度,利用遗传算子-—选择(Selection)、交叉(Crossover)、变异(Mutation)对它们重新组合,得到一群新的个体.这一群新的个体由于继承了上一代的一些优良特性,明显优于上一代,以逐步向着更优解的方向进化.遗传算法主要的特点在于:简单、通用、鲁棒性强。

经过二十多年的发展,遗传算法已经在旅行商问题、生产调度、函数优化、机器学习等领域得到成功的应用。

遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,主要有以下特点:1、遗传算法以决策变量的编码作为运算对象.传统的优化算法往往直接决策变量的实际植本身,而遗传算法处理决策变量的某种编码形式,使得我们可以借鉴生物学中的染色体和基因的概念,可以模仿自然界生物的遗传和进化机理,也使得我们能够方便的应用遗传操作算子.2、遗传算法直接以适应度作为搜索信息,无需导数等其它辅助信息。

3、遗传算法使用多个点的搜索信息,具有隐含并行性。

4、遗传算法使用概率搜索技术,而非确定性规则。

遗传算法是基于生物学的,理解或编程都不太难。

下面是遗传算法的一般算法步骤:1、创建一个随机的初始状态初始种群是从解中随机选择出来的,将这些解比喻为染色体或基因,该种群被称为第一代,这和符号人工智能系统的情况不一样;在那里,问题的初始状态已经给定了。

人工智能结课作业-遗传算法粒子群寻优蚁群算法解决TSP问题

人工智能结课作业-遗传算法粒子群寻优蚁群算法解决TSP问题

⼈⼯智能结课作业-遗传算法粒⼦群寻优蚁群算法解决TSP问题代码已经发布到了github:如果帮到你了,希望给个star⿎励⼀下1 遗传算法1.1算法介绍遗传算法是模仿⾃然界⽣物进化机制发展起来的随机全局搜索和优化⽅法,它借鉴了达尔⽂的进化论和孟德尔的遗传学说。

其本质是⼀种⾼效、并⾏、全局搜索的⽅法,它能在搜索过程中⾃动获取和积累有关搜索空间的知识,并⾃适应的控制搜索过程以求得最优解。

遗传算法操作使⽤适者⽣存的原则,在潜在的解决⽅案种群中逐次产⽣⼀个近似最优解的⽅案,在遗传算法的每⼀代中,根据个体在问题域中的适应度值和从⾃然遗传学中借鉴来的再造⽅法进⾏个体选择,产⽣⼀个新的近似解。

这个过程导致种群中个体的进化,得到的新个体⽐原来个体更能适应环境,就像⾃然界中的改造⼀样。

遗传算法具体步骤:(1)初始化:设置进化代数计数器t=0、设置最⼤进化代数T、交叉概率、变异概率、随机⽣成M个个体作为初始种群P(2)个体评价:计算种群P中各个个体的适应度(3)选择运算:将选择算⼦作⽤于群体。

以个体适应度为基础,选择最优个体直接遗传到下⼀代或通过配对交叉产⽣新的个体再遗传到下⼀代(4)交叉运算:在交叉概率的控制下,对群体中的个体两两进⾏交叉(5)变异运算:在变异概率的控制下,对群体中的个体进⾏变异,即对某⼀个体的基因进⾏随机调整(6)经过选择、交叉、变异运算之后得到下⼀代群体P1。

重复以上(1)-(6),直到遗传代数为 T,以进化过程中所得到的具有最优适应度个体作为最优解输出,终⽌计算。

旅⾏推销员问题(Travelling Salesman Problem, TSP):有n个城市,⼀个推销员要从其中某⼀个城市出发,唯⼀⾛遍所有的城市,再回到他出发的城市,求最短的路线。

应⽤遗传算法求解TSP问题时需要进⾏⼀些约定,基因是⼀组城市序列,适应度是按照这个基因的城市顺序的距离和分之⼀。

1.2实验代码import randomimport mathimport matplotlib.pyplot as plt#读取数据f=open("test.txt")data=f.readlines()#将cities初始化为字典,防⽌下⾯被当成列表cities={}for line in data:#原始数据以\n换⾏,将其替换掉line=line.replace("\n","")#最后⼀⾏以EOF为标志,如果读到就证明读完了,退出循环if(line=="EOF"):break#空格分割城市编号和城市的坐标city=line.split("")map(int,city)#将城市数据添加到cities中cities[eval(city[0])]=[eval(city[1]),eval(city[2])]#计算适应度,也就是距离分之⼀,这⾥⽤伪欧⽒距离def calcfit(gene):sum=0#最后要回到初始城市所以从-1,也就是最后⼀个城市绕⼀圈到最后⼀个城市for i in range(-1,len(gene)-1):nowcity=gene[i]nextcity=gene[i+1]nowloc=cities[nowcity]nextloc=cities[nextcity]sum+=math.sqrt(((nowloc[0]-nextloc[0])**2+(nowloc[1]-nextloc[1])**2)/10)return 1/sum#每个个体的类,⽅便根据基因计算适应度class Person:def__init__(self,gene):self.gene=geneself.fit=calcfit(gene)class Group:def__init__(self):self.GroupSize=100 #种群规模self.GeneSize=48 #基因数量,也就是城市数量self.initGroup()self.upDate()#初始化种群,随机⽣成若⼲个体def initGroup(self):self.group=[]i=0while(i<self.GroupSize):i+=1#gene如果在for以外⽣成只会shuffle⼀次gene=[i+1 for i in range(self.GeneSize)]random.shuffle(gene)tmpPerson=Person(gene)self.group.append(tmpPerson)#获取种群中适应度最⾼的个体def getBest(self):bestFit=self.group[0].fitbest=self.group[0]for person in self.group:if(person.fit>bestFit):bestFit=person.fitbest=personreturn best#计算种群中所有个体的平均距离def getAvg(self):sum=0for p in self.group:sum+=1/p.fitreturn sum/len(self.group)#根据适应度,使⽤轮盘赌返回⼀个个体,⽤于遗传交叉def getOne(self):#section的简称,区间sec=[0]sumsec=0for person in self.group:sumsec+=person.fitsec.append(sumsec)p=random.random()*sumsecfor i in range(len(sec)):if(p>sec[i] and p<sec[i+1]):#这⾥注意区间是⽐个体多⼀个0的return self.group[i]#更新种群相关信息def upDate(self):self.best=self.getBest()#遗传算法的类,定义了遗传、交叉、变异等操作class GA:def__init__(self):self.group=Group()self.pCross=0.35 #交叉率self.pChange=0.1 #变异率self.Gen=1 #代数#变异操作def change(self,gene):#把列表随机的⼀段取出然后再随机插⼊某个位置#length是取出基因的长度,postake是取出的位置,posins是插⼊的位置geneLenght=len(gene)index1 = random.randint(0, geneLenght - 1)index2 = random.randint(0, geneLenght - 1)newGene = gene[:] # 产⽣⼀个新的基因序列,以免变异的时候影响⽗种群 newGene[index1], newGene[index2] = newGene[index2], newGene[index1] return newGene#交叉操作def cross(self,p1,p2):geneLenght=len(p1.gene)index1 = random.randint(0, geneLenght - 1)index2 = random.randint(index1, geneLenght - 1)tempGene = p2.gene[index1:index2] # 交叉的基因⽚段newGene = []p1len = 0for g in p1.gene:if p1len == index1:newGene.extend(tempGene) # 插⼊基因⽚段p1len += 1if g not in tempGene:newGene.append(g)p1len += 1return newGene#获取下⼀代def nextGen(self):self.Gen+=1#nextGen代表下⼀代的所有基因nextGen=[]#将最优秀的基因直接传递给下⼀代nextGen.append(self.group.getBest().gene[:])while(len(nextGen)<self.group.GroupSize):pChange=random.random()pCross=random.random()p1=self.group.getOne()if(pCross<self.pCross):p2=self.group.getOne()newGene=self.cross(p1,p2)else:newGene=p1.gene[:]if(pChange<self.pChange):newGene=self.change(newGene)nextGen.append(newGene)self.group.group=[]for gene in nextGen:self.group.group.append(Person(gene))self.group.upDate()#打印当前种群的最优个体信息def showBest(self):print("第{}代\t当前最优{}\t当前平均{}\t".format(self.Gen,1/self.group.getBest().fit,self.group.getAvg())) #n代表代数,遗传算法的⼊⼝def run(self,n):Gen=[] #代数dist=[] #每⼀代的最优距离avgDist=[] #每⼀代的平均距离#上⾯三个列表是为了画图i=1while(i<n):self.nextGen()self.showBest()i+=1Gen.append(i)dist.append(1/self.group.getBest().fit)avgDist.append(self.group.getAvg())#绘制进化曲线plt.plot(Gen,dist,'-r')plt.plot(Gen,avgDist,'-b')plt.show()ga=GA()ga.run(3000)print("进⾏3000代后最优解:",1/ga.group.getBest().fit)1.3实验结果下图是进⾏⼀次实验的结果截图,求出的最优解是11271为避免实验的偶然性,进⾏10次重复实验,并求平均值,结果如下。

遗传算法解决tsp问题算法流程

遗传算法解决tsp问题算法流程

遗传算法解决tsp问题算法流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!遗传算法解决 TSP 问题的算法流程。

1. 初始化群体。

遗传算法求解TSP问题报告

遗传算法求解TSP问题报告

遗传算法求解TSP问题实验报告一、实验要求:以旅行商问题(TSP)为例做模拟进化搜索技术实验,并提交实验研究报告。

二、实验思路:bool fnCreateRandomGene(); //产生随机基因bool fnGeneAberrance(); //基因变异bool fnGeneMix(); //基因交叉产生新的个体测试并淘汰适应度低的个体bool fnEvalAll(); //测试所有基因的适应度int fnEvalOne(T &Gene); //测试某一个基因的适应度void Crossover( int nFatherA, int nFatherB);void fnDispProbability(); //显示每个个体的权值Crossover()——两染色体的交叉实现输入参数:1、nFatherA 父染色体A2、nFatherB 父染色体B3、nMode 交叉方式返回值:空注:现有交叉方式1、常规交叉方式,该方式比《现代计算方法》(邢文训等编著)p178给出的“非常规码的常规交配法”稍复杂些。

书中只随机选择一个交配位,两个后代交配位之前的基因分别继承双亲的交配位之前的基因。

本程序中,是随机选择两个不相同的交配位,后代在这两个交配位之间继承双亲在这两个交配位之间的基因如父A 1 2 3 | 4 5 6 7 | 8 9 10父B 4 7 8 | 3 2 5 9 | 1 6 10子A 8 3 2 | 4 5 6 7 | 9 1 10子B 1 4 6 | 3 2 5 9 | 7 8 102、贪心交叉方式(Greedy Crossover),具体算法可参见谢胜利,等.求解TSP问题的一种改进的遗传算法[J].计算机工程与应用,2002(8):58~245.三、实验代码:#include <fstream>#include<iostream>#include <vector>#include <algorithm>#include<math.h>#include <time.h>#include <stdlib.h>#include "def.h"#include "TSP.h"void main(){ifstream input_file;ofstream output_file;time_t time1,time2;int _GENERATION_AMOUNT;int times;int _CITY_AMOUNT=-1;int ii,j,k;std::vector<double> x;std::vector<double> y;char readfile[50];const char* writefile="tsp.txt";double tempx[10000],tempy[10000];cout<<"打开城市坐标文件:";cin>>readfile;input_file.open(readfile);if(!input_file){cout<<"打开错误!";return;}cout<<"读入城市坐标........"<<endl;while(1){if(!input_file.eof()){_CITY_AMOUNT++;input_file>>tempx[_CITY_AMOUNT]>>tempy[_CITY_AMOUNT];if(tempx[_CITY_AMOUNT]<0||tempy[_CITY_AMOUNT]<0){cout<<"文件格式有误!";return;}}elsebreak;}if( _CITY_AMOUNT==-1){cout<<"文件格式有误!";return;}input_file.close();_CITY_AMOUNT=_CITY_AMOUNT+1;x.reserve(_CITY_AMOUNT);y.reserve(_CITY_AMOUNT);lpCityDistance.reserve(_CITY_AMOUNT*_CITY_AMOUNT);for(k=0;k<_CITY_AMOUNT;k++){x[k]=tempx[k];y[k]=tempy[k];}cout<<"已存入的城市信息为:"<<endl;for(ii=0;ii<_CITY_AMOUNT;ii++)cout<<"第"<<ii+1<<"个城市"<<"("<<x[ii]<<","<<y[ii]<<")"<<endl;lpCityDistance.clear();for(k=0;k<_CITY_AMOUNT;k++){lpCityDistance[k*_CITY_AMOUNT+k]=0;for(j=k+1;j<_CITY_AMOUNT;j++){lpCityDistance[k*_CITY_AMOUNT+j]=lpCityDistance[j*_CITY_AMOUNT+k] =sqrt((x[k]-x[j])*(x[k]-x[j])+(y[k]-y[j])*(y[k]-y[j]));}}cout<<"输入进化代数:"<<endl;cin>>times;cout<<"输入种群大小:(大于城市个数小于10000)"<<endl;cin>> _GENERATION_AMOUNT;while(_GENERATION_AMOUNT>=10000||_GENERATION_AMOUNT<_CITY_AMOUNT){cout<<"种群数输入错误!请重新输入(大于城市个数小于10000)"<<endl;cin>> _GENERATION_AMOUNT;}Csga<_CONTAINER, _CONTAINER_P> CUnit(times,_GENERATION_AMOUNT,_CITY_AMOUNT); //初始化time1=time(NULL);//开始遗传算法if(!CUnit.fnCreateRandomGene()) //产生随机基因//产生随机的基因{exit(0);}//循环基因编译,杂交,淘汰过程CUnit.fnEvalAll(); //测试所有基因的适应度for ( int i = 0; i<times; ++i ){//CUnit.fnDispProbability();//显示每个个体的权值CUnit.fnGeneAberrance(); //基因变异//基因变异//CUnit.fnDispProbability();//显示每个个体的权值CUnit.fnGeneMix();//交叉产生新的个体测试并淘汰适应度低的个体//基因杂交CUnit.fnEvalAll(); //测试所有基因的适应度// 每隔_DISP_INTERV AL显示一次结果if ( (i+1)%_DISP_INTERV AL == 0 || i == 0){cout << "第" << i+1 << "代" <<endl;CUnit.fnDispProbability();CUnit.fnDispHistoryMin();}}CUnit.fnDispHistoryMin();time2=time(NULL);cout<<"\n\n计算用时为:"<<difftime(time2,time1)<<"s"<<endl;}四、实验结果:。

遗传算法解决TSP问题

遗传算法解决TSP问题

遗传算法解决TSP问题姓名:学号:专业:问题描叙TSP问题即路径最短路径问题,从任意起点出发(或者固定起点),依次经过所有城市,一个城市只能进入和出去一次,所有城市必须经过一次,经过终点再到起点,从中寻找距离最短的通路。

通过距离矩阵可以得到城市之间的相互距离,从距离矩阵中的到距离最短路径,解决TSP问题的算法很多,如模拟退火算法,禁忌搜索算法,遗传算法等等,每个算法都有自己的优缺点,遗传算法收敛性好,计算时间少,但是得到的是次优解,得不到最有解。

算法设计遗传算法属于进化算法的一种,它通过模仿自然界的选择与遗传的机理来寻找最优解.遗传算法有三个基本算子:选择、交叉和变异。

数值方法求解这一问题的主要手段是迭代运算。

一般的迭代方法容易陷入局部极小的陷阱而出现"死循环"现象,使迭代无法进行。

遗传算法很好地克服了这个缺点,是一种全局优化算法。

生物在漫长的进化过程中,从低等生物一直发展到高等生物,可以说是一个绝妙的优化过程。

这是自然环境选择的结果。

人们研究生物进化现象,总结出进化过程包括复制、杂交、变异、竞争和选择。

一些学者从生物遗传、进化的过程得到启发,提出了遗传算法。

算法中称遗传的生物体为个体,个体对环境的适应程度用适应值(fitness)表示。

适应值取决于个体的染色体,在算法中染色体常用一串数字表示,数字串中的一位对应一个基因。

一定数量的个体组成一个群体。

对所有个体进行选择、交叉和变异等操作,生成新的群体,称为新一代遗传算法计算程序的流程可以表示如下:第一步准备工作(1)选择合适的编码方案,将变量(特征)转换为染色体(数字串,串长为m)。

通常用二进制编码。

(2)选择合适的参数,包括群体大小(个体数M )、交叉概率PC和变异概率Pm。

(3)确定适应值函数f (x)。

f(x)应为正值。

第二步形成一个初始群体(含M个个体)。

在边坡滑裂面搜索问题中,取已分析的可能滑裂面组作为初始群体。

第三步对每一染色体(串)计算其适应值fi,同时计算群体的总适应值。

用遗传算法解决TSP问题

用遗传算法解决TSP问题

用遗传算法解决TSP问题设计思路:1.初始化城市距离采用以城市编号(i,j=1代表北京,=2代表上海,=3代表天津,=4代表重庆,=5代表乌鲁木齐)为矩阵行列标的方法,输入任意两个城市之间的距离,用矩阵city表示,矩阵中的元素city(i,j)代表第i个城市与第j个城市间的距离。

2.初始化种群通过randperm函数,生成一个一维随机向量(是整数1,2,3,4,5的任意排列),然后将其赋给二维数组group的第一列,作为一个个体。

如此循环N次(本例生成了50个个体),生成了第一代种群,种群的每个个体代表一条路径。

3.计算适应度采用的适应度函数为个体巡回路径的总长度的函数。

具体为adapt(1,i)=(5*maxdis-dis) (1) 在式(1)中,adapt(1,i)表示第i个个体的适应度函数,maxdis为城市间的最大距离,为4077km,dis为个体巡回路径的总长度,这样定义的适应度,当路经越短时适应度值越大。

在适应度值的基础上,给出的计算个体期望复制数的表达式为adaptnum(1,i)=(N* adapt(1,i)/ sumadapt) (2) 其中,sumadapt为种群适应度之和。

4.复制采用优秀个体的大比例保护基础上的随机数复制法。

具体做法为在生成下一代个体时,先将最大适应度对应的路径个体以较大的比例复制到下一代,然后再用随机数复制法生成下一代的其他个体。

其中,有一个问题必须考虑,即若某一次生成的随机数过大,结果能复制一个或极少个样本。

为了避免这一情况,采用了限制措施,即压低了随机数的上限。

5.交叉采用的方法为按步长的单点交叉,为随机选择一对样本,再随机选择一个交叉点位置,按一定的步长进行交叉点的选择。

选择一个步长而不是将其设为1,是因为若某一位置处的城市代码因为进行了交叉而发生了改变,则其经过该处的两个距离都会改变。

这种交叉兼有遗传和变异两方面的作用,因为若交叉点处的城市编号都相同,则对两个个体而言交叉后样本无变化,否则样本有变化。

遗传算法求解TSP问题实验报告

遗传算法求解TSP问题实验报告

人工智能实验报告实验六遗传算法实验II一、实验目的:熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。

二、实验原理:旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。

假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。

路径的选择目标是要求得的路径路程为所有路径之中的最小值。

TSP问题是一个组合优化问题。

该问题可以被证明具有NPC计算复杂性。

因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。

遗传算法的基本思想正是基于模仿生物界遗传学的遗传过程。

它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群体。

这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代。

后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程。

群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解。

要求利用遗传算法求解TSP问题的最短路径。

三、实验内容:1、参考实验系统给出的遗传算法核心代码,用遗传算法求解TSP的优化问题,分析遗传算法求解不同规模TSP问题的算法性能。

2、对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。

3、增加1种变异策略和1种个体选择概率分配策略,比较求解同一TSP问题时不同变异策略及不同个体选择分配策略对算法结果的影响。

4、上交源代码。

四、实验报告要求:1、画出遗传算法求解TSP问题的流程图。

2、分析遗传算法求解不同规模的TSP问题的算法性能。

规模越大,算法的性能越差,所用时间越长。

3、对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。

最新[PPT]利用遗传算法解决TSP问题ppt课件

最新[PPT]利用遗传算法解决TSP问题ppt课件
[PPT]利用遗传算法解决TSP 问题
TSP问题,又称旅行商问题, 旅行推销员问题,是指对于给定 的n 个城市,旅行商从某一城市出发不重复的访问其余城市 后回到出发的城市,要求找出一条旅行路线,是总的旅行路程最短.
遗传算法(Genetic Algorithms,GA)是一种基 于自然群体遗传演化机制的算法, 它模拟自然界 生物进化过程, 采用人工进化的方式对目标空间 进行随机化搜索。它将问题域中的可能解看作是 群体的个体, 并将个体编码成符号串形式( 即染色 体) , 模拟生物进化过程, 对群体反复进行杂交等 操作, 根据预定的适应度函数对每个个体进行评 价, 依据优胜劣汰的进化规则, 不断得到更优的群 体, 同时搜索优化群体中的最优个体, 求得满足要 求的最优解。
产生两个0~9的int型随机数,如得到2和6, 将gene[2]和gene[6]之间的基因反序,得到:
0218965347
变异
例如一个基因序列为: 0256981347
产生两个0~9的int型随机数,如得到2和6, 将gene[2]和gene[6] 的基因交换,得到: 0216985347
仿真结果

for(mem=0;mem<PopSize;mem++)

Байду номын сангаас
sum+=x[mem];

/* Calculate relative fitness */

for(mem=0;mem<PopSize;mem++)

population[mem].rfitness=x[mem]/sum;
交叉
例如一个基因序列为: 0256981347
Q恤%捎z衍cP耸M触tZM咆7眨Vt嚼(kn苑JR空

2023年基于遗传算法求解TSP问题实验报告

2023年基于遗传算法求解TSP问题实验报告

基于遗传算法求解TSP问题班级, 学号, 姓名摘要: 巡回旅行商问题(TSP)是一种组合优化方面旳问题, 从理论上讲, 使用穷举法不仅可以求解TSP问题, 并且还可以得到最优解。

不过, 运用穷举法所花费旳时间巨大旳, 当问题旳规模很大时, 穷举法旳执行效率较低, 不能满足及时旳需要。

遗传算法是计算机科学人工智能领域中用于处理最优化旳一种搜索启发式算法, 是进化算法旳一种。

该算法通过模拟生物学交叉、变异等方式, 是目前向最优解旳方向进化, 因此使用于TSP问题旳求解。

关键词: 人工智能;TSP问题;遗传算法本组组员: 林志青, 韩会雯, 赵昊罡本人分工:掌握遗传算法旳基本原理, 编写遗传算法中部分匹配交叉、循环交叉和循序交叉旳详细实现过程。

1 引言旅行商问题, 即TSP问题, 是一种最优解旳求解问题。

假设有n个都市, 并且每个都市之间旳距离已知, 则怎样只走一遍并获得最短途径为该问题旳详细解释。

对于TSP问题旳处理, 有穷举法、分支限界法等求解方式, 该文章重要简介遗传算法求解过程。

遗传算法简称GA, 在本质上是一种求解问题旳高效并行全局搜索措施。

遗传算法从任意一种初始化旳群体出发, 通过随机选择、交叉和变异等遗传操作, 使群体一代一代旳进化到搜索空间中越来越好旳区域, 直至抵达最优解。

在遗传算法中, 交叉操作为重要操作之一, 包括部分匹配交叉、循环交叉和次序交叉等。

2 算法原理与系统设计执行遗传算法, 根据需要设定对应旳交叉因子、变异因子和迭代次数, 并选择对应旳交叉算法,当程序图形显示并运算时会得到目前旳最优解, 判断与否获得最终旳最优解, 若已得到所需成果, 则停止运行, 否则继续执行。

详细流程图如下所示:部分匹配交叉(PMX): 先随机生成两个交叉点, 定义这两点间旳区域为匹配区域, 并互换两个父代旳匹配区域。

如下图所示:父代A: 872 | 130 | 9546父代B: 983 | 567 | 1420互换后变为:temp A: 872 | 567 | 9546temp B: 983 | 130 | 1420对于 temp A.tempB中匹配区域以外出现旳数码反复, 要根据匹配区域内旳位置逐一进行替代。

遗传算法解决旅行商问题(TSP)

遗传算法解决旅行商问题(TSP)

遗传算法解决旅⾏商问题(TSP)这次的⽂章是以⼀份报告的形式贴上来,代码只是简单实现,难免有漏洞,⽐如循环输⼊的控制条件,说是要求输⼊1,只要输⼊⾮0就⾏。

希望会帮到以后的同学(*^-^*)⼀、问题描述旅⾏商问题(Traveling-Salesman Problem,TSP)。

设有n个互相可直达的城市,某推销商准备从其中的A城出发,周游各城市⼀遍,最后⼜回到A城。

要求为该旅⾏商规划⼀条最短的旅⾏路线。

⼆、⽬的为了解决旅⾏商问题,⽤了遗传算法,模拟染⾊体的遗传过程,进⾏求解。

为了直观的更有⽐较性的观察到程序的运⾏效果,我这⾥程序⾥给定了10个城市的坐标,并计算出其任意两个的欧⽒距离,10个点的位置排布见图1。

程序的理想最优距离为20.485281,即绕三⾓形⼀圈,⽽且路程起点不固定,因为只要满⾜点围着三⾓形⼀圈即为最短距离,最优解。

所以问题转换为,求图中10 个点的不重复点的闭环序列的距离最⼩值。

图 1三、原理1、内部变量介绍程序总体围绕了遗传算法的三个主要步骤:选择--复制,交叉,变异。

给定了10个种群,即10条染⾊体,每条染⾊体都是除⾸位外不重复的点组成,⾸尾相同保证路线是闭合的,所以⼀条染⾊体包含11个点。

种群由⼀个结构体group表⽰,内含城市的序列int city[11]、种群的适应度double fit、该种群适应度占总群体适应度的⽐例double p,和为了应⽤赌轮选择机制的积累概率 double jlleigailv。

程序还包括⼀个始终记录所有种群中的最优解的城市序列数组groupbest[11],记录最优解的适应度,即最⼤适应度的变量 double groupbestfit。

种群的最⼤繁衍代数设置为1000,⽤户能够输⼊繁衍代数,但必须在1000以内。

10个点的不同排列序列有10!种,即3628800中排列可能,其中各代之间可能产⽣重复,不同种群间也会出现重复,学⽣觉得1000左右应该能验证程序的性能了,就定为1000。

遗传算法求解TSP问题

遗传算法求解TSP问题

遗传算法求解TSP问题1、遗传算法前⼀篇遗传算法的基本内容在之前的博客已经应⽤过了之前遗传算法解决的是函数优化问题,即求解最⼤值或最⼩值问题;此次要解决的是组合优化问题中的TSP问题,即旅⾏商问题。

这边先介绍⼀下TSP问题TSP问题(Traveling Salesman Problem),即旅⾏商问题,⼜译为旅⾏推销员问题、货郎担问题,是数学领域中著名问题之⼀。

假设有⼀个旅⾏商⼈要拜访n个城市,他必须选择所要⾛的路径,路径的限制是每个城市只能拜访⼀次,⽽且最后要回到原来出发的城市。

路径的选择⽬标是要求得的路径路程为所有路径之中的最⼩值。

简单地说,TSP问题就是要找到图中的最短哈密尔顿回路,即全局最短路径。

然后遗传算法可以模仿⽣物进化,然后可以找到⼀个近似最优解,但其不⼀定是全局最优解。

2、实验原理1)产⽣初始种群;随机⽣成N个个体作为初始群体popm,随机选择⼀个种群;2)适应度函数;个体评价计算P(t)中各个个体的适应度,遗传算法在进化搜索中基本不利⽤外部信息,仅以适应度函数为依据,利⽤种群中每个个体的适应度值来进⾏搜索。

TSP的⽬标是路径总长度为最短3)选择运算;将使适应度较⼤(优良)个体有较⼤的存在机会,⽽适应度较⼩(低劣)的个体继续存在的机会也较⼩。

简单遗传算法采⽤赌轮选择机制4)交叉运算将交叉算⼦作⽤于群体;5)变异运算将变异算⼦作⽤于群体,并通过以上运算得到下⼀代群体P(t + 1);6)终⽌条件输出解。

3、代码实现1.city.m:随机⽣成N个城市的坐标并保存2.plot_route.m:实现连点画图3.染⾊体的路程代价函数 mylength.m4.适应度函数fit.m5.交叉操作函数 cross.m6.变异函数 Mutation.m7.main函数3、结果分析调整参数并分析运⾏结果(1)对于city_25.mat⽂件中的城市序列,参数ITER=2000,m=2,Pc=0.8,Pm=0.05保持不变,调整种群个数M的值,观察其结果变化:M=50M=100M=500由运⾏结果可知当M=100时得到TSP的最短路径长度均⼩于M=50和M=500运⾏得出的最短路径长度。

遗传算法求解TSP问题的思路

遗传算法求解TSP问题的思路

变异
采用随机多次对换方式,这一方法也要保证 起始点、终点不变。为此,随机对换的位置 不能落在编码第一个和最后一个元素上(即 只能在第 1~n 位之间对换,首末位仍为 0) 。
遗传算法求解 TSP 问题的流程
(3)主函数代码如下:
int main() { TSP point; int i; srand(seed); CalculatDist(); InitColony(point); //生成初始种群 CalFitness(point); //计算适应度 clock_t Begin=clock(); for(i=0;i<Generation;i++) { select_operation(point); //选择 Cross(point,pcross); //交叉 Mutation(point,pmutation); //变异 CalFitness(point); } clock_t end=clock(); OutPut(point); printf("used time:%d\n\n",end-Begin); printf("Please press any key to exit …\n\n"); getchar(); return 0; }
(4)实验结果:
种群中路径适应度的评估
因为目标是求最短路,所以适应度用路径长 度的倒数表示,这样可以保证距离越小,适 应度越大。计算每条路径的适应度,并记录 目前种群中最短径的适应度、遍历顺序、 路径长度、路径编号信息。
选择
群 体 更 新 过 程
采用赌轮的方法选出优良的个体,形成新的 种群。
交叉
采用部分匹配交叉方式,两个父代个体在交 叉后, 形成的子代染色体编码首末位必为 0, 这样做的目的是保证起讫点不变。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

邮局订阅号:82-946360元/年技术创新博士论坛《PLC 技术应用200例》您的论文得到两院院士关注基于遗传算法的TSP 问题求解算法及其系统A TSP Solving Algorithm and System Based on Genetic Algorithm(北京工业大学)代桂平王勇侯亚荣DAI Gui-ping WANG Yong HOU Ya-rong摘要:TSP 问题为组合优化中的经典的NP 完全问题。

针对这一问题,首先设计了基于遗传算法的求解算法,包括编码设计、适应度函数选择、终止条件设定、选择算子设定、交叉算子设定以及变异算子设定等,给出了基于遗传算法求解TSP 问题的一般性流程,然后设计并实现了基于遗传算法的TSP 问题求解系统,给出了求解系统的体系结构,并给出了求解系统基于Ja -va 语言的实现机制,最后通过实验结果的分析,表明了算法具有较好的寻优性能,系统具有较好的实用性。

关键词:遗传算法;旅行商问题;体系结构中图分类号:TP319文献标识码:A Abstract:TSP is a representative combinational optimization problem and a NP-hard problem.Solving algorithm based on genetic al -gorithm is designed,including chromosome encoding,fitness function design,end condition design,selection operator design,crossoveroperator design and mutation operator design et al.Then a solving system is designed and implemented:the architecture of solving system is given and implementation mechanism based on Java language is presented.Finally,it is illustrated that the algorithm has good performance and the system has good practicability through analysis of experimental results.Key words:Genetic Algorithm;TSP Problem;Architecture文章编号:1008-0570(2010)02-1-0015-021引言TSP 问题为组合优化中的经典问题,已经证明为一NP 完全问题,即其最坏情况下的时间复杂性随着问题规模的扩大按指数方式增长,到目前为止不能找到一个多项式时间的有效算法。

TSP 问题可描述为:已知n 个城市相互之间的距离,某一旅行商从某个城市出发访问每个城市一次且仅一次,最后回到出发城市,如何安排才使其所走路线最短。

TSP 问题不仅仅是一个简单的组合优化问题,其他许多的NP 完全问题可以归结为TSP 问题,如邮路问题、装配线上的螺帽问题和产品的生产安排问题等,使得TSP 问题的有效求解具有重要的意义。

遗传算法是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。

遗传算法的做法是把问题参数编码为染色体,再利用迭代的方式进行选择、交叉以及变异等运算来交换种群中染色体的信息,最终生成符合优化目标的染色体。

实践证明,遗传算法对于解决TSP 问题等组合优化问题具有较好的寻优性能。

许多学者在基于遗传算法求解TSP 问题方面做了很多的工作,这些工作大致可以分为两类:一类是基于经典遗传算法或者遗传算法变种对于TSP 问题进行了求解;一类是采用遗传算法对TSP 问题或者TSP 问题的变种进行了求解。

在第一类中,文献使用一种改进的多搜索方法的遗传算法对TSP 问题进行了求解;文献使用最小约束的编码和交叉的遗传算法求解了TSP 问题;王宇平等人使用量子遗传算法来求解遗传算法;郑立平等人使用混合杂交的遗传算法求解了TSP 问题;戴晓明等人采用混合并行遗传算法对TSP 问题进行了求解。

在第二类中,分别利用遗传算法对动态TSP 问题、欧氏平面TSP 问题、多目标TSP 问题进行了求解。

此外,文献等利用其它优化算法对TSP 问题进行了求解。

上述算法求解TSP 问题都取得较好的效果,但是都没有涉及求解系统的设计与实现;不同的是,本文除了一种整数编码的遗传算法来求解TSP 问题外,还重点给出了求解系统设计与实现,实验结果表明算法具有较好的寻优性能,求解系统具有较好的实用性。

本文设计了一个基于遗传算法的TSP 问题求解算法,基于Java 语言设计并实现了求解系统。

本文如下组织:在第二节中介绍了相关的研究工作;在第三节中设计了基于遗传算法的求解算法;在第四节设计了求解系统的体系结构和基于Ja -va 语言的实现机制;在第五节给出了实验结果并对实验结果作了分析;最后对全文的内容进行了总结。

3算法设计1)染色体编码:在遗传算法运算之前,需要针对问题设计染色体,包括基因字串的长度以及基因代表的含义,也就是对要搜索空间的可行解以编码的形式呈现。

一般的编码方式采用二进制编码,此外也有整数、实数、文字等编码方式。

采用整数编码的方式,对于n 个城市的TSP 问题,染色体分为n 段,其中每一段为对应城市的编号,如对20个城市的TSP 问题{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},则20|18|17|3|5|4|6|1|2|9|8||7|13|12|16|14|15|11|10|19就是一个合法的染色体。

在生成染色体时需要进行染色体合法性检查环节,即染色体恰好是n 个城市编码的一个排列,不能有重复的城市代码出现。

2)种群初始化:在完成染色体编码以后,必须产生一个初始种群作为起始解,所以需要首先决定初始化种群的数目。

初始化种群的数目一般根据经验得到,如果初始化种群的数目太大,可能会消耗过多的计算时间,但是如果太小可能难以达到预期的效果而导致过早收敛。

我们在种群初始化时采用随机方式产生,代桂平:讲师博士15--技术创新《微计算机信息》(测控自动化)2010年第26卷第2-1期360元/年邮局订阅号:82-946《现场总线技术应用200例》博士论坛一般情况下种群的数量视城市规模的大小而确定,其取值在10~160之间浮动。

3)适应度函数的确定:设k 1|k 2|…|k i |…|k n 为一个采用整数编码的染色体,为城市k i 到k j 的距离,则适应度函数(1)即适应度函数为恰好走遍n 个城市的距离的倒数,优化的目标就是选择适应度函数值尽量可能大的染色体,适应度函数值越大的染色体越优质,反之越劣质。

4)终止条件设定:严格地讲,遗传算法的迭代终止条件目前尚无定论。

在许多的组合优化问题中,适应度最大值并不清楚,其本身就是搜索的对象,因此终止条件很难确定。

若发现群体中个体的进化已经趋于稳定状态,换句话说,如果发现群体中一定的比例的个体已经是同一个体,则终止算法的迭代过程。

或者设置最大迭代次数,如200。

5)选择:选择操作从种群中选择优胜的个体,并淘汰劣质的个体。

选择的目的是把优化的个体直接遗传到下一代或者通过配对交叉产生新的个体再遗传到下一代。

选择是建立在群体中个体的适应度评估的基础上的。

常用的选择算子包括适应度比例方法、最佳个体保留方法、期望值方法、排序选择方法等。

选择适应度比例方法来对种群中的个体进行选择。

6)交叉:交叉算子是遗传算法中起核心作用的遗传操作,所谓交叉是指两个父代个体的部分结构加以替换重组而生成新的个体的操作。

对于二进制编码来说常用的交叉算子包括一点交叉、二点交叉、多点交叉、一致交叉等。

选用二点交叉算子,并选择交叉概率为0.5。

7)变异:变异算子的基本内容是对群体中个体串的某些基因座的基因值作变动。

就字符集为{0,1}的二进制码串来说,编译操作就是把基因座上的某些基因值取反,即1-->0或者0-->1。

一般来说变异算子操作的基本步骤如下:1)在群体的所有的个体的码串范围内随机确定基因座;2)以事先确定的变异概率对这些基因座的基因值进行变异。

我们选用基本变异算子,并选定变异概率为0.001。

8)算法流程:采用经典的遗传算法流程,包括了染色体编码、种群初始化、计算适应度函数值、终止条件评判、选择、交叉以及变异等环节,获得满意解以后即终止程序的运行或者种群趋于稳定后即终止程序的运行。

4系统体系结构与实现机制求解系统的软件体系结构如图1所示。

整个系统从上到下可以分为3个部分:界面模块、改进遗传算法实现模块和基本遗传算法实现模块。

界面模块充当用户与系统的接口,主要由城市布局选择和优化结果显示两部分组成。

用户可以选择TSP 问题城市的规模,用鼠标设置城市的布局。

在遗传算法执行的过程中动态显示优化的进程,并最终显示优化的结果。

改进的遗传算法实现模块主要用来实现本文提出的求解TSP 问题的遗传算法,主要由整数编码实现、特殊的二元交叉实现和适应度函数的实现三部分组成。

整数编码部分实现了本文提出的整数编码机制,特殊的二元交叉实现了采用整数编码的染色体之间的二元交叉算法,而适应度函数实现了本文提出的适应度函数。

图1求解系统的体系结构基本遗传算法实现模块实现了基本的遗传算法,主要有遗传算法基本流程的实现、默认编码、默认交叉、默认变异、默认适应度函数以及遗传算法各个部件的统一的接口实现。

遗传算法基本流程的实现部分实现了一个基本的遗传算法流程,如图1所示。

默认编码实现了最经常使用的二进制编码。

默认交叉实现了基本的二元交叉算法。

默认变异实现了基本的位编译算法。

而默认适应度函数给出了适应度函数的抽象实现。

遗传算法的各个部件的统一的接口给出了遗传算法中的各个部件,如染色体、染色体工厂、种群、选择算法、变异算法等的抽象接口。

求解系统采用Java 语言实现,其中基本遗传算法的实现部分采用了Jaga 工具包。

遗传算法各部件的接口部分采用Java 中的接口概念为每一个遗传算法中的部件定义了抽象接口。

二进制编码、整数编码等编码方式都是实现了抽象的编码接口;默认的交叉接口和特殊的二元交叉接口实现了抽象的交叉接口;适应度函数继承了默认适应度函数抽象类。

5实验结果及分析采用第三节所述的求解系统进行了模拟实验:城市的规模为50,城市之间的距离随机生成,种群的最大后代数为1000.实验结果如图2所示。

相关文档
最新文档