基于遗传算法的旅行商问题求解
实验六:遗传算法求解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问题求解研究一、问题描述1、TSP问题的概述旅行商问题 (Traveling Salesman Problem,简称 TSP) 是一个经典的组合化问题。
它可以描述为:一个商品推销员要去若干个城市推销商品,从一个城出发需要经过所有城市后回到出发地,应如何选择行进路线以使总行程短。
从图论的角度看,该问题实质是在一个带权完全无向图中找一个权值最的小回路。
在寻找最短路径问题上,有时不仅要知道两个指定顶点间的最短路径,还需要知道某个顶点到其他任意顶点间的最短路径。
旅行商问题也是经典的组合数学的问题,生活中随处可见这类组合数学问题。
例如,计算下列赛制下的总的比赛次数:n个球队比赛,每队只和其他队比赛一次。
在纸上画一个网络,用铅笔沿着网络的线路走,在笔不离开纸面且不重复线路的条件下,一笔画出网络图。
一个邮递员从邮局出发,要走完他所管辖的街道,他应该选择什么样的路径,这就是著名的“中国邮递员问题”。
一个通调网络怎样布局最节省?美国的贝尔实验室和IBM公司都有世界一流的组合数学家在研究这个问题,这个问题直接关系到巨大的经济利益。
库房和运输的管理也是典型的组合数学问题,怎样安排运输使得库房充分发挥作用,进一步来说,货物放在什么地方最便于存取。
上述的这些例子中,其中一部分就和旅行商问题有关系。
2、TSP问题研究意义解决旅行商问题有着极其重要的理论和现实意义。
从理论层面来讲,解TSP不仅为其他算法提供了思想方法平台,使这些算法广泛地应用于各种组合优化问题;而且经常被用来测试算法的优劣,如模拟退火算法、禁忌搜索、神经网络、进化算法等,都可用旅行商问题来测试。
从实际应用层面来讲,旅行商问题作为一个理想化的问题,尽管多数的研究成果不是为了直接的应用,但却被广泛地转化为许多组合优化问题,最直接的就是其在交通、物流和大规模生产中的应用。
3、TSP问题的解决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
遗传算法实例

遗传算法实例遗传算法实例是一种模拟生物进化的算法,通过模拟自然选择和遗传机制,寻找问题的最优解。
它被广泛应用于优化问题的求解,如组合优化、参数优化等。
下面将介绍一个关于旅行商问题的遗传算法实例。
旅行商问题是一个经典的组合优化问题,目标是找到一条最短的路径,使得旅行商可以依次访问一组城市,并返回起始城市。
该问题在现实生活中有很多应用,如物流配送、电路板布线等。
遗传算法可以用来解决旅行商问题。
它模拟了自然界中的遗传机制和进化过程。
首先,我们需要将问题抽象为一个编码,例如使用一个序列来表示城市的访问顺序。
然后,我们通过种群来表示可能的解空间,种群中的每个个体都是一条可能的路径。
接下来,我们需要定义适应度函数来评估每个解的质量。
在旅行商问题中,适应度函数可以定义为路径的总长度。
我们希望路径越短,适应度越高。
然后,我们进行遗传操作,包括选择、交叉和变异。
选择操作根据适应度函数选择优秀的个体,将其作为父代个体参与繁殖。
交叉操作模拟基因的交换,通过交换路径的片段来生成子代个体。
变异操作模拟基因的突变,通过随机改变路径中的城市顺序来引入新的解。
在每一代中,我们可以根据适应度函数对个体进行排序,并选取适应度较高的个体进行繁殖。
通过重复执行选择、交叉和变异操作,我们可以逐渐找到较优的解。
当达到终止条件时,即找到满足要求的解或达到最大迭代次数时,遗传算法停止运行,返回找到的最优解。
以上就是一个关于旅行商问题的遗传算法实例。
通过模拟自然界的进化过程,遗传算法能够快速有效地求解复杂的优化问题。
在实际应用中,遗传算法还可以结合其他优化方法,如模拟退火算法和粒子群算法,来更好地解决实际问题。
遗传算法在求解旅行商问题中的应用

3 T P 0 S 为例 , 城市的分布采用随 即生成( 2 , 图 )用标准遗传算法(G ) s A 寻求其最优解。 种群大
学 习和图像处 理等众多工程领域 中得到广泛应用C 6 ] 。
摘要 : 旅行商 问题 (s ) , P 是典型的非确定性 多项式( P 完全组合优化 问题 。分析 了基本遗传算 法用于求解 T P I N) S 存在 的优 点以及 不足 , 并针 对基本算法 的不足提 出了一种改进 的遗传 算法。仿真结果表 明, 改进算 法在 求解 T P时计算 S
速度 不仅 明显优于前者 , 而且稳定性有很 大提 高。
()变异算子 。 5 按变异概率 户 随机地改变染色体中某
一
位 的值 。 S A的操作 流程如图 1 G 所示 。
经 仿真试 验证 明该算法 在求 解 T P ¥ 上是 可行有 效 的。
2 适应度函数的选择
设需要遍历 的城市为 / , 9 于是适应度函数可以描述为 : , 个
T =/ eg ( ) ) nL nt r h 式 中 :——城市规 模 ; n
甘 肃 水 利 水 电 技 术
G肌 s h i h iin Js u u S ul S uda i i h
Vo.4。 . 1 No4 4
Sp 20 e ., 0 8
・
设计与研究 ・
遗传算法在求解旅行商问题中的应用
梅 红. 刘 翔
700 ) 300 ( 甘肃省广 播电视网络传 输有限公司 , 甘肃 兰州
使得算法 的收敛性 降低 。因此作者采用无性 繁殖 , 即去掉交 叉算子 , 用特殊 的变异算子 , 因重组算 子来产 生新 而采 即基 的个体 。
遗传算法解决旅行商问题求解复杂性思考
遗传算法解决旅行商问题求解复杂性思考旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,主要涉及在给定一组城市和其之间的距离的情况下,寻找最短路径,使得旅行商可以访问每个城市并返回起始城市。
由于需要考虑全排列的情况,TSP在计算上通常是一个复杂且困难的问题。
遗传算法(Genetic Algorithm,GA)是一种模拟自然进化的算法。
在解决复杂问题时,遗传算法模拟了生物进化的基本原理,通过自然选择和遗传操作,逐代优化个体的适应度,从而找到解决问题的最佳解。
在使用遗传算法解决TSP时,个体通常表示为城市的排列序列,适应度函数定义为这个序列所对应路线的总长度。
下面将从两个方面对遗传算法解决TSP的复杂性进行思考:问题的复杂性和算法的复杂性。
首先,旅行商问题本身是一个NP-hard问题。
NP-hard问题是指在多项式时间内无法求解的问题。
TSP的复杂性由于需要考虑所有城市间的距离,而随着城市数量的增加,问题的规模呈指数级增长。
这导致在实际情况下,对于较大规模的TSP 问题,找到最优解是非常困难的。
遗传算法作为一种启发式算法,能够找到较好的近似解,在解决复杂问题时取得了较好的效果。
遗传算法通过不断迭代演化种群,逐步优化解的质量。
但是,由于TSP问题本身的困难性,遗传算法无法保证找到全局最优解,因为它受限于初始种群和搜索空间的选择。
此外,遗传算法的收敛速度也受到问题规模的影响。
其次,遗传算法本身也具有一定的复杂性。
需要设置合适的参数,如种群大小、交叉率、变异率等,以及遗传操作的策略。
不同的参数和策略选择可能导致不同的解决效果。
因此,在应用遗传算法解决TSP问题时,需要进行合理的参数配置和算法优化。
在实际应用中,基于遗传算法的TSP求解器已经取得了一定的成果。
通过对问题进行合理的建模和参数调优,可以在可接受的时间内得到较优的解。
此外,还有许多改进的遗传算法策略可以用于提高求解效率,如多父代遗传算法、局部搜索等。
使用遗传算法求解旅行商问题
于演示遗传算法的基 本思想。对于遗传算 法的优化 ,国 内外许 多专 家结合旅行 商问题提 出了很 多算子 ,结合其 中的
一
关键词 : 遗传 算法 ; 旅行 商问题 ; 选择算子 ; 交算子 ; 变算子 杂 异
A ou in t 'P wi S lt o I I t GA o s h
遗传算法是基 于 自然选择 和 自然遗传 机制 的一种 随机搜 索算法 ,具 有 良好 的并行性 和全局 寻优能 力 ,能 够 自适 应地
221 码 与适 应 ・ 数 .. 编 陛分
由于旅行 商问题 的解是 一条从 起点经 过所有 城市后 又 回 到起 点的路 径 ,而这 条路径 上存在 的节点 往往少则 数十个 多 则 成百上 千个 ,因此 ,使用 传统 的二 进制 编码方 式来对解 进 行 编码是非 常 困难 的 。采用 数字来标 示每 座城市 ,以数 字序 列来 作为解 的编码不 仅在形式 上 比较 简单 而且有利 于编程 中 的引用 ,因 而是非常合适 的。例如 ,城市 A F依次用 数字 l ~ ~ 6来标示 .则一个可能的解可以表示为 f,4652 即旅行商 1 ,,,, 3 1, 从城市 A开始依次经过 C、D、F 、E、B最后 回到 A 。因而一 个染色体就对应 了一个数字序列。 适 应性分 数是 用来 衡 量一 个可 能解 的好 坏 的度量 标 准 ,
SFW R E E0M N N EIN 0r A EDVLP ET DD S A G
软件 开发 与设Βιβλιοθήκη 使 用遗传 算法求解旅行 商 问题
陆添 超
( 中国矿业大学计算机科学与技术学院 ,徐州 2 1 1) 2 6 1 摘 要 : 遗传 算法模拟 自然界动 物的繁衍 来解决全局寻优 问题 , 。旅行 商问题是 典型的组合优化 问题 ,而且非 常适 些经典算子 实现应 用遗传算 法解 决旅行 商问题 的演 示程序。
TSP问题遗传算法求解实验报告
一、旅行商问题所谓旅行商问题(Travelling Salesman Problem , TSP),即最短路径问题,就是在给定的起始点S到终止点T的通路集合中,寻求距离最小的通路,这样的通路成为S点到T点的最短路径。
在寻找最短路径问题上,有时不仅要知道两个指定顶点间的最短路径,还需要知道某个顶点到其他任意顶点间的最短路径。
遗传算法方法的本质是处理复杂问题的一种鲁棒性强的启发性随机搜索算法,用遗传算法解决这类问题,没有太多的约束条件和有关解的限制,因而可以很快地求出任意两点间的最短路径以及一批次短路径。
假设平面上有n个点代表n个城市的位置, 寻找一条最短的闭合路径, 使得可以遍历每一个城市恰好一次。
这就是旅行商问题。
旅行商的路线可以看作是对n 个城市所设计的一个环形, 或者是对一列n个城市的排列。
由于对n个城市所有可能的遍历数目可达(n- 1)!个, 因此解决这个问题需要0(n!)的计算时间。
假设每个城市和其他任一城市之间都以欧氏距离直接相连。
也就是说, 城市间距可以满足三角不等式, 也就意味着任何两座城市之间的直接距离都小于两城市之间的间接距离。
二、遗传算法1 遗传算法介绍遗传算法是由美国J.Holland教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。
通过模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。
遗传算法在本质上是一种不依赖具体问题的直接搜索方法,是一种求解问题的高效并行全局搜索方法。
其假设常描述为二进制位串,位串的含义依赖于具体应用。
搜索合适的假设从若干初始假设的群体集合开始。
当前种群成员通过模仿生物进化的方式来产生下一代群体,如随机变异和交叉。
用遗传算法求解中国34个省会TSP的问题
用遗传算法求解中国34个省会TSP问题一、TSP问题的描述旅行商问题(TSP)可以具体描述为:已知n个城市之间的相互距离,现有一个推销员从某一个城市出发,必须遍访这n个城市,并且每个城市只能访问一次,最后又必须返回到出发城市,如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短。
现给出中国34个省会数据,要求基于此数据使用遗传算法解决该TSP问题。
中国34省会位置city =1.西藏2.云南3.四川4.青海5.宁夏6.甘肃7.内蒙古8.黑龙江9.吉林10.辽宁 11.北京 12天津 13.河北 14.山东 15.河南 16.山西 17.陕西18.安徽 19.江苏20.上海 21.浙江 22.江西 23.湖北 24.湖南 25.贵州 26.广西27.广东28.福建 29.海南 30.澳门 31.香港 32.台湾 33.重庆 34.新疆像素坐标如下:Columns 1 through 11100 187 201 187 221 202 258 352 346 336 290 211 265 214 158 142 165 121 66 85 106 127 Columns 12 through 22297 278 296 274 265 239 302 316 334 325 293 135 147 158 177 148 182 203 199 206 215 233 Columns 23 through 33280 271 221 233 275 322 250 277 286 342 220 216 238 253 287 285 254 315 293 290 263 226 Column 34 104 77二、遗传算法的介绍2.1 遗传算法遗传算法的基本原理是通过作用于染色体上的基因寻找好的染色体来求解问题,它需要对算法所产生的每个染色体进行评价,并基于适应度值来选择染色体,使适应性好的染色体有更多的繁殖机会,在遗传算法中,通过随机方式产生若干个所求解问题的数字编码,即染色体,形成初始种群;通过适应度函数给每个个体一个数值评价,淘汰低适应度的个体,选择高适应度的个体参加遗传操作,经过遗产操作后的个体集合形成下一代新的种群,对这个新的种群进行下一轮的进化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for i=1:n
farm(i,:)=randperm(N);
end
R=farm(1,:);
%一个随机解(个体)
scatter(a(:,1),a(:,2),'x'); %画出所有点,a(:,1):X坐标,a(:,2):Y
坐标
hold on
pause(1)
%画出随机解得路径图
figure;
plotaiwa(a,R);
这 6 个要素构成了遗传算法的核心内容,其流程如图 1 所示。
编码和初始种群生成
种群中个体适应度的检测评估
选择
交叉
变异
图 1 遗传算法的基本流程 遗传算法解题的基本步骤如下:
Step1:参数设置及种群初始化; Step2:对不可行解进行贪婪修复; Step3:适应度评价; Step4:轮盘赌选择; Step5:交叉; Step6:变异; Step7:对不可行解进行贪婪修复; Step8:适应度评价; Step9:终止条件判断,若未达到终止条件,则转到 Step4; Step10:输出结果。
3
开始
参数设置 种群初始化
对不可行解 进行贪婪修
复 适应度评价
轮盘赌选择,用选择出的 个体构成的种群替代旧的
交叉 变异 对不可行解进行贪婪修 适应度评价
是否满足 终止条
输出结果
结束 图 2 遗传算法具体步骤
4
四.程序源代码
%遗传算法求解旅行商问题 %初始化 a=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
while counter<C for i=1:n len(i,1)=myLength(D,farm(i,:));%计算路径长度 end minlen=min(len); rr=find(len==minlen);%返回的是在len中路径最短的路径坐标(i,1) R=farm(rr(1,1),:);%更新最短路径 FARM=farm;%优胜劣汰,nn记录了复制的个数
function [R,Rlength]=GeneTSP(D,a,n,C,m,Pc,Pm)
[N,NN]=size(D); %(31*31)
farm=zeros(n,N); %存储种群
%随机生成初始种群,随机产生从1到N的N个初始值,例如, RANDPERM(6) , 可能结果为:[2 4 5 6 1 3].
(5) 交叉操作:交叉操作是遗传算法中最主要的遗传操作。简单的交叉(即一 点交叉)可分两步进行:首先对种群中个体进行随机配对;其次,在配对 个体中随机设定交叉处,配对个体彼此交换部分信息。
(6) 变异:变异操作是按位(bit)进行的,即把某一位的内容进行变异。变 异操作同样也是随机进行的。一般而言,变异概率 Pm 都取得较小。变异操作是十 分微妙的遗传操作,它需要和交叉操作配合使用,目的是挖掘群体中个体的多样 性,克服有可能限于局部解的弊病。
%选择 K=23; [aa,bb]=size(FARM); FARM2=FARM; len2=len; [len]=sort(len); for i=1:aa
tt= find(len2==len(i,1)); FARM(i,:)=FARM2(tt(1,1),:); end for i=1:K j=aa+1-i; FARM(j,:)=FARM(i,:);
3238 1229;4196 1044;4312 790;2864 570;1927 1970;2562 1756;... 2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;... 3780 2212;3676 2578;1537 2838;2745 2931;3429 1908;3507 2376;... ];%a:假定问题就是寻找一条最短的遍历 n 个城市的最短路径, 即搜索自然数 子集 W= { 1 ,2 , ⋯ , n} ( W 的元素表示对 n 个城市的编号) 的一个排列
π( W) = { V1 , V2 , ⋯ , Vn} , 使 len = ∑ d ( Vi , Vi+1) + d ( V1 , Vn)取 最小值, 式中的 d ( Vi , Vi+1) 表示城市 Vi 到城市 Vi + 1 的距离. 遗传算法是具有“生成+检测”的迭代过程的搜索算法。它的基本处理流程 如图 1 所示。由此流程图可见,遗传算法是一种群体型操作,该操作以群体中的 所有个体为对象。选择(Selection)、交叉(Crossover)和变异(Mutation)是遗 传算法的 3 个主要操作算子,它们构成了所谓的遗传操作(genetic operation), 使遗传算法具有了其它传统方法所没有的特性。遗传算子包含如下 6 个基本因 素:
(4) 选择(selection):选择或复制操作是为了从当前群体中选出优良的个体, 使它们有机会作为父代为下一代繁殖子孙。个体适应度越高,其被选择的
机会就越多。此处采用与适用度成比例的概率方法进行选择。具体地说,
就是首先计算群体中所有个体适应度的总和( f ),再计算每个个体的
2
适应度所占的比例( fi f ),并以此作为相应的选择概率 Ps 。
n=100;%n:种群个数
C=200;%C:停止代数
m=2;%m:适配值淘汰加速指数,不宜太大
Pc=0.9;%Pc:交叉概率
Pm=0.2;%Pm: 变异概率
D=distance(a);%生成距离矩阵
[R,Rlength]=GeneTSP(D,a,n,C,m,Pc,Pm);
%返回值:最优路径R
%
总距离Rlength
1
一.问题重述
假设有一个旅行商人要拜访 n 个城市,他必须选择所要走的路径,路径的限 制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标 是要求得的路径路程为所有路径之中的最小值。TSP 问题是一个组合优化问题。该
问题可以被证明具有 NPC 计算复杂性。因此,任何能使该问题的求解得以简化的方法,都 将受到高度的评价和关注。
(1) 参数编码:由于遗传算法不能直接处理解空间的解数据,因此必须通过编 码将它们表示成遗传空间的基因型串结构数据。
(2) 生成初始群体:由于遗传算法的群体型操作需要,所以必须为遗传操作准 备一个由若干初始解组成的初始群体。初始群体的每个个体都是通过随机
方法产生。
(3) 适应度评估检测:遗传算法在搜索进化过程中一般不需要其他外部信息, 仅用适应度(fitness)值来评估个体或解的优劣,并作为以后遗传操作的 依据。
6
end
%变异 FARM2=FARM; for i=1:aa
if Pm>=rand FARM(i,:)=mutate(FARM(i,:));
end end
FARM=[R;FARM];%将随机产生的n-aa个体加入从后面种群,将上次迭代的最 优解从前面加入种群
[aa,bb]=size(FARM);
%保持种群规模为n if aa>n
FARM=FARM(1:n,:); end %更新farm farm=FARM; clear FARM %更新迭代次数 counter=counter+1 ; end %结果输出
Rlength=myLength(D,R) figure plotaiwa(a,R)%画图 disp('迭代次数c'); disp(C); disp('迭代后结果'); Rlength=myLength(D,R)%结果输出 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %计算邻接矩阵 %输入参数a是中国31个城市的坐标 %输出参数D是无向图的赋权邻接矩阵
基于遗传算法的旅行商问题求解
摘要
采用 MATLAB,对 TSP 问题进行基于遗传算法的求解。TSP 问题是典型的 NP 完全问题,通过 MATLAB 进行遗传算法编程,从而有效提出一个较好的 TSP 解,实现对问题的解答。进而讨论遗传算法的特点,以及对本问题的可行性。
关键词: TSP 问题 遗传算法
end %交叉操作
[aa,bb]=size(FARM); FARM2=FARM; for i=1:2:aa if Pc>rand&&i<aa %交叉概率Pc A=FARM(i,:); B=FARM(i+1,:); [A,B]=cross(A,B);%交叉算法采用部分匹配交叉 FARM(i,:)=A; FARM(i+1,:)=B; end
function D=distance(a) [c,d]=size(a);%此例中c=24,d=2 D=zeros(c,c);%申请一个0阵 for i=1:c
for j=i:c bb=(a(i,1)-a(j,1)).^2+(a(i,2)-a(j,2)).^2;
7
D(i,j)=bb^(0.5);%计算第i个城市到j城市的距离 D(j,i)=D(i,j); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %总路径len function len=myLength(D,p) [N,NN]=size(D); len=D(p(1,N),p(1,1)); for i=1:(N-1) len=len+D(p(1,i),p(1,i+1)); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %绘制路径示意图 R记录路径 %a:假定的24个城市的坐标 %R:最短路径 function plotaiwa(a,R) scatter(a(:,1),a(:,2),'x') hold on plot([a(R(1),1),a(R(24),1)],[a(R(1),2),a(R(24),2)]) hold on for i=2:length(R) x0=a(R(i-1),1); y0=a(R(i-1),2); x1=a(R(i),1); y1=a(R(i),2); xx=[x0,x1]; yy=[y0,y1]; plot(xx,yy) hold on end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %交叉算法采用部分匹配交叉 function [a,b]=cross(a,b) L=length(a); if L<=10 %确定交叉宽度 W=9; elseif ((L/10)-floor(L/10))>=rand&&L>10 W=ceil(L/10)+8; else W=floor(L/10)+8; end p=unidrnd(L-W+1); %随机选择交叉范围,从p到p+W