实验六:遗传算法求解TSP问题实验讲解
实验六:遗传算法求解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问题的实验报告,分为三个部分,总计超过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问题⼀、摘要TSP问题是指给定平⾯上N个点及每点的坐标,求⼀条路径,遍历所有的点并回到起点,使这条路径长度最⼩。
TSP问题是⼀个组合优化问题。
该问题可以被证明具有NPC计算复杂性。
因此,任何能使该问题的求解得以简化的⽅法,都将受到⾼度的评价和关注。
遗传算法是⼈⼯智能⽅法的⼀种,⽤于求解各种传统⽅法不⽅便求解或耗时很长的问题。
下⾯给出遗传算法求解TSP问题的步骤。
在传统遗传算法求解TSP的基础上,提出了⼀种新的编码⽅式,并且讨论了⼀种优化⽅法的可⾏性。
本次实验的程序⾸先在matlab上验证了基本的算法,然⽽由于matlab运⾏较慢,故⼜移植到C++平台上,经过测试,实验结果良好。
⼆、算法实现遗传算法的实现主要包括编码、选择、交叉、编译、将个体放⼊新种群这么⼏个步骤,经过很多代的编译求解,以逼近最优解。
下⾯讨论每⼀个步骤的实现,其中编码⽅式是我在考虑了传统编码⽅式不利于计算的缺点下,重新设计的⼀种全新的编码⽅式。
编码在传统TSP问题中,编码可以直接采⽤⼆进制编码或⾃然编码的形式,⽐如直接把城市转化成(2,5,4,1,3,6)的形式,表⽰从2到5到4到1到3到6最后回到起点。
但是在求解TSP问题时,如果直接采⽤此种编码⽅式,会导致在交叉或变异时出现冲突的情况。
如(2,5,4,1,3,6)和(3,5,6,1,2,4)交换后变成了(2,5,6,1,2,6)和(3,5,4,1,3,4),显然路径出现了冲突的现象,传统的解决⽅式是通过逐步调整的⽅法来消除冲突,但是这种⽅法增加了编码的复杂度,不利于问题的求解,根据问题的特点,提出了采⽤⼀种插⼊序号的编码⽅式。
假设6个城市(1,2,3,4,5,6)现在有编码(1,1,2,2,1,3),让第n个编码表⽰n放在第⼏个空格处。
那么⽣成路径的规则是⾸先取1放在第⼀个(1),然后取2放在第⼀个空格处(2,1),然后取3放在第⼆个空格处(2,3,1),然后取4放在第⼆个空格处(2,4,3,1)然后取5放在第⼀个空格处(5,2,4,3,1)最后取6放在第3个空格处(5,2,6,4,3,1)。
遗传算法解决TSP问题

遗传算法解决TSP问题姓名:学号:专业:问题描叙TSP问题即路径最短路径问题,从任意起点出发(或者固定起点),依次经过所有城市,一个城市只能进入和出去一次,所有城市必须经过一次,经过终点再到起点,从中寻找距离最短的通路。
通过距离矩阵可以得到城市之间的相互距离,从距离矩阵中的到距离最短路径,解决TSP问题的算法很多,如模拟退火算法,禁忌搜索算法,遗传算法等等,每个算法都有自己的优缺点,遗传算法收敛性好,计算时间少,但是得到的是次优解,得不到最有解。
算法设计遗传算法属于进化算法的一种,它通过模仿自然界的选择与遗传的机理来寻找最优解. 遗传算法有三个基本算子:选择、交叉和变异。
数值方法求解这一问题的主要手段是迭代运算。
一般的迭代方法容易陷入局部极小的陷阱而出现"死循环"现象,使迭代无法进行。
遗传算法很好地克服了这个缺点,是一种全局优化算法。
生物在漫长的进化过程中,从低等生物一直发展到高等生物,可以说是一个绝妙的优化过程。
这是自然环境选择的结果。
人们研究生物进化现象,总结出进化过程包括复制、杂交、变异、竞争和选择。
一些学者从生物遗传、进化的过程得到启发,提出了遗传算法。
算法中称遗传的生物体为个体,个体对环境的适应程度用适应值(fitness)表示。
适应值取决于个体的染色体,在算法中染色体常用一串数字表示,数字串中的一位对应一个基因。
一定数量的个体组成一个群体。
对所有个体进行选择、交叉和变异等操作,生成新的群体,称为新一代遗传算法计算程序的流程可以表示如下:第一步准备工作(1)选择合适的编码方案,将变量(特征)转换为染色体(数字串,串长为m)。
通常用二进制编码。
(2)选择合适的参数,包括群体大小(个体数M)、交叉概率PC和变异概率Pm。
(3)确定适应值函数f(x)。
f(x)应为正值。
第二步形成一个初始群体(含M个个体)。
在边坡滑裂面搜索问题中,取已分析的可能滑裂面组作为初始群体。
第三步对每一染色体(串)计算其适应值fi,同时计算群体的总适应值。
利用遗传算法解决TSP问题

课程实验报告1.实验目的利用遗传算法获得TSP问题的近似解。
2.实验要求要求学生了解遗传算法解决问题的根本流程。
对TSP问题有所了解,知道TSP 问题的难点在什么地方,如何使用遗传算法来获得一个较好的近似解。
3.实验内容n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市只能访问一次,最后又必须返回出发城市。
如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短?用图论的术语来说,假设有一个图g=(v,e),其中v是顶点集,e是边集,设d=(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶点且每个顶点只通过一次的具有最短距离的回路。
4.实验软硬件环境根本Windows系统根本运行环境,VS20215.实验方案〔1〕遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法遗传算法的根本运算过程如下:a)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
b)个体评价:计算群体P(t)中各个个体的适应度。
c)选择运算:将选择算子作用于群体。
选择的目的是把优化的个体直接遗传到下一代或通过配对穿插产生新的个体再遗传到下一代。
选择操作是建立在群体中个体的适应度评估根底上的。
d)穿插运算:将穿插算子作用于群体。
所谓穿插是指把两个父代个体的局部构造加以替换重组而生成新个体的操作。
遗传算法中起核心作用的就是穿插算子。
e)变异运算:将变异算子作用于群体。
即是对群体中的个体串的某些基因座上的基因值作变动。
群体P(t)经过选择、穿插、变异运算之后得到下一代群体P(t 1)。
f)终止条件判断:假设t=T,那么以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
〔2〕用遗传算法模拟TSP问题TSP问题及旅行商问题,假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
(完整)用遗传算法求解TSP问题

用遗传算法求解TSP问题遗传算法(Genetic Algorithm——GA),是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,它是由美国Michigan大学的J。
Holland教授于1975年首先提出的。
J.Holland 教授和它的研究小组围绕遗传算法进行研究的宗旨有两个:抽取和解释自然系统的自适应过程以及设计具有自然系统机理的人工系统。
遗传算法的大致过程是这样的:将每个可能的解看作是群体中的一个个体或染色体,并将每个个体编码成字符串的形式,根据预定的目标函数对每个个体进行评价,即给出一个适应度值。
开始时,总是随机的产生一些个体,根据这些个体的适应度,利用遗传算子-—选择(Selection)、交叉(Crossover)、变异(Mutation)对它们重新组合,得到一群新的个体.这一群新的个体由于继承了上一代的一些优良特性,明显优于上一代,以逐步向着更优解的方向进化.遗传算法主要的特点在于:简单、通用、鲁棒性强。
经过二十多年的发展,遗传算法已经在旅行商问题、生产调度、函数优化、机器学习等领域得到成功的应用。
遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,主要有以下特点:1、遗传算法以决策变量的编码作为运算对象.传统的优化算法往往直接决策变量的实际植本身,而遗传算法处理决策变量的某种编码形式,使得我们可以借鉴生物学中的染色体和基因的概念,可以模仿自然界生物的遗传和进化机理,也使得我们能够方便的应用遗传操作算子.2、遗传算法直接以适应度作为搜索信息,无需导数等其它辅助信息。
3、遗传算法使用多个点的搜索信息,具有隐含并行性。
4、遗传算法使用概率搜索技术,而非确定性规则。
遗传算法是基于生物学的,理解或编程都不太难。
下面是遗传算法的一般算法步骤:1、创建一个随机的初始状态初始种群是从解中随机选择出来的,将这些解比喻为染色体或基因,该种群被称为第一代,这和符号人工智能系统的情况不一样;在那里,问题的初始状态已经给定了。
遗传算法求解TSP问题
遗传算法求解TSP问题实验六遗传算法求解TSP问题⼀、实验⽬的熟悉和掌握遗传算法的原理、流程和编码策略,并利⽤遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。
⼆、实验内容1、参考实验系统给出的遗传算法核⼼代码,⽤遗传算法求解TSP的优化问题,分析遗传算法求解不同规模TSP问题的算法性能。
2、对于同⼀个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。
3、增加1种变异策略和1种个体选择概率分配策略,⽐较求解同⼀TSP问题时不同变异策略及不同个体选择分配策略对算法结果的影响。
4、上交源代码。
三、遗传算法求解TSP问题的流程图四、遗传算法求解不同规模的TSP问题的算法性能(1)遗传算法执⾏⽅式说明:适应度值计算⽅法:当前路线的路径长度●个体选择概率分配⽅法:适应度⽐例⽅法●选择个体⽅法:轮盘赌选择●交叉类型:PMX交叉●变异类型: 两点互换变异(2)实验模拟结果:图1-1(3)分析由图1-1可知,遗传算法执⾏时间随着TSP问题规模的增⼤⽽增⼤,并且⼤致为线性增长。
五、不同参数下的计算结果对⽐最⼤迭代步数:100交叉概率:0.85变异概率:0.15如表1-1或3-1-0-9-2-4-8-5-7-6,注意到这是⼀圈,顺时针或者逆时针都可以。
当种群规模为10,20时,并没有找到最优解。
(2)交叉概率对算法结果的影响实验次数:15种群规模:25最⼤迭代步数:100变异概率:0.15实验结果:在该情况下,交叉概率过低将使搜索陷⼊迟钝状态,得不到最优解。
种群规模:25最⼤迭代步数:100交叉概率:0.85实验结果:⼜表1-3可知,当变异概率过⼤或过低都将导致⽆法得到最优解。
注:(2)(3)的实验数据与(1)的实验数据不同,详见附录。
六、不同变异策略和个体选择概率分配策略对算法结果的影响(1)两点互换变异与插⼊变异的⽐较:●试验次数(CASNUM):10●城市数(POINTCNT):10●种群规模(POPSIZE):100●最⼤迭代步数(GENERATIONS):100●交叉概率(PC):0.85●变异概率(PM):0.15●选择个体⽅法:轮盘赌选择●交叉类型:PMX交叉●个体选择概率分配⽅法:适应度⽐例⽅法a.变异类型: 两点互换变异b.变异类型: 插⼊变异分析:两点互换变异20次模拟中,4次得到⾮最优解;⽽插⼊变异只有2次;插⼊变异的最好适应度平均值⽐两点互换变异⼩0.14755,最差适应度平均值和总的适应度平均值都⽐两点互换下,并且在Release下,运⾏时间前者⽐后者快218.3ms。
遗传算法解决TSP问题
(1 3 4 | 5 2 9 | 8 6 7) (1 7 6 | 9 5 2 | 4 3 8)
通过两点交叉可得到子代染色体为 (1 3 4 | 9 5 2| 8 6 7) (1 7 6 | 5 2 9 | 4 3 8)
遗传算法解决TSP问题(二)
遗传算法解决TSP问题(二)
用交概率Pc,变异概率Pm.
(1)生成原始染色体种群
采用实数编码,以N个城市的序号作为一条可能的
路径。
例如对8个城市,可生成如下的染色体
代表一条路径,8,6,4,2,7,5,3,1.重复操作生成数目等
于n的染色体种群。
遗传算法解决TSP问题(二)
实际编程(采用48城市数据集,最优解10628)
1 .遗传变量
遗传算法解决TSP问题(三)
2.遗传方法
遗传算法解决TSP问题(三)
3 运行截图
遗传算法解决TSP问题(三)
遗传算法解决TSP问题(三)
谢谢观看
遗传算法解决TSP问题Algorithm)是模拟达尔文生物进化论的自然选择 和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜 索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种群 (population)开始的,而一个种群则由经过基因(gene)编码的一定数 目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有 特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部 表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑 头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一 开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工 作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适 者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似 解,在每一代,根据问题域中个体的适应度(fitness)大小选择 (selection)个体,并借助于自然遗传学的遗传算子(genetic operators) 进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的 种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于 环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似 最优解。
遗传算法解决TSP问题
算法设计技巧与分析题目遗传算法解决TSP问题学院电子工程学院专业智能科学与技术学生姓名教师姓名摘要根据TSP 问题的特征信息并借鉴邻域搜索算法的有关思想,提出了一种基于近邻策略的TSP 问题求解算法,该算法首先依据TSP 问题的特殊性求出相应的近邻模式,再将近邻模式用于初始种群的生成,而后在进化过程中随机引入这类模式。
该算法可以大大缩短遗传进程,提高进化效率。
通过仿真实验,验证了该算法的有效性,并且随着城市数目的增加其优越性更为明显。
关键字:近邻策略;遗传算法;旅行商问题1.引言遗传算法(Genetic Algorithm ,GA )是一种借鉴生物界中自然选择和进化机制发展起来的随机、自适应全局搜索算法,由Holland 教授于1975 年提出。
Goldberg 总结了一种统一的最基本的遗传算法的形式SGA (Simple Genetic Algorithms )。
SGA 在选定了染色体编码方案后,随机生成初始群体,再通过选择、交叉、变异三种遗传算子的作用对种群不断实行优化,直至找到问题的最优解或近似最优解。
遗传算法具有很强的全局搜索能力,但是对于大型旅行商问题(TSP ),它存在收敛速度过慢的缺点。
TSP 是一个著名的NP 难的组合优化问题,对称TSP 问题可描述为:给定n 个城市和每两个城市之间的距离,求一条经过所有城市一次且仅一次的长度最短的回路。
TSP 问题的数学表述:寻找一条遍历n 个城市的最短路径,或者说搜索到自然数集X={1,2,3,…,n}(X 中元素表示对n 个城市的编号)的一个全排列π(X )={v1,v2,…,vn},使Td = (vi ,vi +1)+d (v1,vn )n −1i=1取最小值,式中的d(vi,vi+1)表示城市vi到城市vi+1的距离。
对于n 个城市的TSP,其所有的旅程路线组合数目是(n-1)! /2。
当城市数目n 增加时,可能的路径数将呈指数级增长。
遗传算法求解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;}四、实验结果:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六:遗传算法求解TSP问题实验一、实验目的熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。
用遗传算法对TSP问题进行了求解,熟悉遗传算法地算法流程,证明遗传算法在求解TSP问题时具有可行性。
二、实验内容参考实验系统给出的遗传算法核心代码,用遗传算法求解TSP的优化问题,分析遗传算法求解不同规模TSP问题的算法性能。
对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。
增加1种变异策略和1种个体选择概率分配策略,比较求解同一TSP问题时不同变异策略及不同个体选择分配策略对算法结果的影响。
1. 最短路径问题所谓旅行商问题(Travelling Salesman Problem , TSP),即最短路径问题,就是在给定的起始点S到终止点T的通路集合中,寻求距离最小的通路,这样的通路成为S点到T点的最短路径。
在寻找最短路径问题上,有时不仅要知道两个指定顶点间的最短路径,还需要知道某个顶点到其他任意顶点间的最短路径。
遗传算法方法的本质是处理复杂问题的一种鲁棒性强的启发性随机搜索算法,用遗传算法解决这类问题,没有太多的约束条件和有关解的限制,因而可以很快地求出任意两点间的最短路径以及一批次短路径。
假设平面上有n个点代表n个城市的位置, 寻找一条最短的闭合路径, 使得可以遍历每一个城市恰好一次。
这就是旅行商问题。
旅行商的路线可以看作是对n个城市所设计的一个环形, 或者是对一列n个城市的排列。
由于对n个城市所有可能的遍历数目可达(n- 1)!个, 因此解决这个问题需要0(n!)的计算时间。
假设每个城市和其他任一城市之间都以欧氏距离直接相连。
也就是说, 城市间距可以满足三角不等式, 也就意味着任何两座城市之间的直接距离都小于两城市之间的间接距离。
2. 遗传算法遗传算法是由美国J.Holland教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。
通过模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。
遗传算法在本质上是一种不依赖具体问题的直接搜索方法,是一种求解问题的高效并行全局搜索方法。
其假设常描述为二进制位串,位串的含义依赖于具体应用。
搜索合适的假设从若干初始假设的群体集合开始。
当前种群成员通过模仿生物进化的方式来产生下一代群体,如随机变异和交叉。
每一步,根据给定的适应度评估当前群体的假设,而后使用概率方法选出适应度最高的假设作为产生下一代的种子。
下面介绍几个遗传算法的几个基本概念:(1)染色体(Chromosome):在使用遗传算法时,需要把问题的解编成一个适合的码子。
这种具有固定结构的符号串既是染色体,符号串的每一位代表一个基因。
符号串的总位数成为染色体的长度,一个染色体就代表问题的一个解,每个染色体也被称为一个个体。
(2)群体(Population):每代所产生的染色体总数成为群体,一个群体包含了该问题在这一代的一些解的集合。
(3)适应度(Fitness):对群体中每个染色体进行编码后,每个个体对应一个具体问题的解,而每个解对应于一个函数值。
该函数值即适应函数,就是衡量染色体对环境适应度的指标,也是反映实际问题的目标函数在前一代群体的基础上产生新一代群体的工作成为遗传操作,基本的遗传操作有:(1)选择(Select):按一定的概率从上代群体中选择M对个体作为双亲,直接拷贝到下一代,染色体不发生变化。
(2)交叉(Crossover):对于选中进行繁殖的两个染色体X,Y,以X,Y为双亲作交叉操作,从而产生两个后代X1,Y1.(3)变异(Mutation):对于选中的群体中的个体(染色体),随机选取某一位进行取反运算,即将该染色体码翻转。
用遗传算法求解的过程是根据待解决问题的参数集进行编码,随机产生一个种群,计算适应函数和选择率,进行选择、交叉、变异操作。
如果满足收敛条件,此种群为最好个体,否则,对产生的新一代群体重新进行选择、交叉、变异操作,循环往复直到满足条件。
遗传算法原型:GA(Fitness,Fitness_threshold,p,r,m)Fitness:适应度评分函数,为给定假设赋予一个评估分数Fitness_threshold:指定终止判据的阈值p:群体中包含的假设数量r:每一步中通过交叉取代群体成员的比例m:变异率初始化群体:P←随机产生的p个假设评估:对于P中的每一个h,计算Fitness(h)当[maxFitness(h)]<Fitness_threshold,做产生新的一代Ps:(1)选择:用概率方法选择P的(1-r)p个成员加入Ps.从P中选择假设hi的概率用下面公式计算:(2)交叉:根据上面给出的,从P中按概率选择r(p/2)对假设.对于每对假设<h1,h2>,应用交叉算子产生两个后代.把所有的后代加入Ps(3)变异:使用均匀的概率从Ps中选择m%的成员.对于选出的每个成员,在它表示中随机选择一个为取反(4)更新:P←Ps(5)评估:对于P中的每个h计算Fitness(h)从P中返回适应度最高的假设3. TSP问题的遗传算法设计与实现对于n个城市的问题,每个个体即每个解的长度为n,用s行, t列的pop矩阵,表示初始群体,s表示初始群体的个数,t为n+1,矩阵的每一行的前n个元素表示城市编码,最后一个元素表示这一路径的长度。
城市的位置可以手动输入,使用一个N×N矩阵D存储,D(i,j)代表城市i和城市j之间的距离。
D(i,j)=sqrt((Xi-Xj).^2+(Yi-Yj).^2)。
在TSP的求解中,可以直接用距离总和作为适应度函数。
个体的路径长度越小,所得个体优越,距离的总和越大,适应度越小,进而探讨求解结果是否最优。
选择就是从群体中选择优胜个体、淘汰劣质个体的操作,它是建立在群体中个体适应度评估基础上。
这里采用方法是最优保存方法。
本实例中交叉采用部分匹配交叉策略,先随机选取两个交叉点,然后将两交叉点中间的基因段互换,将互换的基因段以外的部分中与互换后基因段中元素冲突的用另一父代的相应位置代替,直到没有冲突。
变异操作是以变异概率Pm对群体中个体串某些基因位上的基因值作变动,若变异后子代的适应度值更加优异,则保留子代染色体,否则,仍保留父代染色体。
这有助于增加种群的多样性,避免早熟收敛(非全局最优)。
判断结束准则是固定指定了迭代的次数当算法达到迭代次数时,算法结束,输出当前的最优解。
在根据适配值计算并选择的时候,记录下来的当前最优值,在变异后加入跟新的群体,保证新的迭代循环中TSP解越来越好(不会变差)。
在选择的一种操作是拿最优的K个替换最差的K个个体,本例是按适配值选择,并使群体数目变少,当每次变异操作后,产生随机路径补充群体是群体数目不变,再次循环,一定程度上防止因初始群体的选择问题而陷入局部最优。
4. TSP问题的遗传算法的具体步骤解最短路径的遗传算法如下:Generate[p(n)];表示程序开始时要首先产生一个群体,群体个数为nEvaluate[p(h)];表示计算每个个体适应度,h是种群中的一个个体Repeat roof Generations times;重复下面的操作,直到满足条件为止Select p(h) from p(n-1);表示从前一代群体中选择一对双亲,用于交叉、变异操作,P(n)代表第n代群体Crossover and mutation p(n);进行交叉和变异操作Learning[p(n)];自学习过程Evaluate[p(h)];计算新生成的种群中每个个体的适应度End;具体流程图如下所示:流程图5.遗传算法求解不同规模的TSP问题的算法性能(1)遗传算法执行方式说明:●适应度值计算方法:当前路线的路径长度●个体选择概率分配方法:适应度比例方法●选择个体方法:轮盘赌选择●交叉类型:PMX交叉●变异类型: 两点互换变异(2)实验模拟结果:图1-1(3)分析由图1-1可知,遗传算法执行时间随着TSP问题规模的增大而增大,并且大致为线性增长。
五、不同参数下的计算结果对比(1)种群规模对算法结果的影响实验次数:10最大迭代步数:100交叉概率:0.85变异概率:0.15表1-1种群规模适应度值最优路径10 25.264 4-5-8-7-6-3-1-0-9-220 26.3428 2-9-1-0-3-6-7-5-8-4如表1-1所示,显然最短路径为25.1652m,最优路径为1-0-9-1-3-6-7-5-8-4-2或3-1-0-9-2-4-8-5-7-6,注意到这是一圈,顺时针或者逆时针都可以。
当种群规模为10,20时,并没有找到最优解。
(2)交叉概率对算法结果的影响 实验次数:15 种群规模:25 最大迭代步数:100 变异概率:0.15 实验结果:表1-2(注:红色表示非最优解)在该情况下,交叉概率过低将使搜索陷入迟钝状态,得不到最优解。
(3)变异概率对算法结果的影响实验次数:10种群规模:25最大迭代步数:100交叉概率:0.85实验结果:表1-3又表1-3可知,当变异概率过大或过低都将导致无法得到最优解。
注:(2)(3)的实验数据与(1)的实验数据不同,详见附录。
六、不同变异策略和个体选择概率分配策略对算法结果的影响(1)两点互换变异与插入变异的比较:●试验次数(CASNUM):10●城市数(POINTCNT):10●种群规模(POPSIZE):100●最大迭代步数(GENERATIONS):100●交叉概率(PC):0.85●变异概率(PM):0.15●选择个体方法:轮盘赌选择●交叉类型:PMX交叉●个体选择概率分配方法:适应度比例方法a.变异类型: 两点互换变异表1-4两点互换变异程序结果b.变异类型: 插入变异表1-5插入变异程序结果分析:两点互换变异20次模拟中,4次得到非最优解;而插入变异只有2次;插入变异的最好适应度平均值比两点互换变异小0.14755,最差适应度平均值和总的适应度平均值都比两点互换下,并且在Release下,运行时间前者比后者快218.3ms。
可见在该条件下(交叉概率,变异概率,种群规模等),插入变异比两点互换变异的算法效果要好。
(2)个体选择分配策略●试验次数(CASNUM):10●城市数(POINTCNT):10●种群规模(POPSIZE):100●最大迭代步数(GENERATIONS):100●交叉概率(PC):0.85●变异概率(PM):0.15●选择个体方法:轮盘赌选择●交叉类型:PMX交叉●变异类型: 两点互换变异a.个体选择概率分配方法:适应度比例方法同表1-4b.个体选择概率分配方法:非线性排序方式表1-6非线性排序方式程序结果分析:个体选择概率分配方式采用非线性排序方式时,程序运行结果非常糟糕。