TSP_旅行商问题 - 遗传算法(四)

本文修改日志:

2017.01.22:整理并发布第一版博文;

2018.05.01:修改源代码170行(添加float),double RateVariation = float(rand()%100)/100; 

一、前言

    【旅行商问题】旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。由于该问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸,它是一个NP完全问题。由于其在交通运输、电路板线路设计以及物流配送等领域内有着广泛的应用,国内外学者对其进行了大量的研究。早期的研究者使用精确算法求解该问题,常用的方法包括:分枝定界法、线性规划法、动态规划法等。但是,随着问题规模的增大,精确算法将变得无能为力,因此,在后来的研究中,国内外学者重点使用近似算法或启发式算法,主要有遗传算法模拟退火法蚁群算法禁忌搜索算法、贪婪算法神经网络等。【百度百科】


旅行商求解系列:

-------------------------------------------------------------------------------------------------

(1)TSP_旅行商问题- 蛮力法( 深度遍历优先算法DFS )
(2)TSP_旅行商问题- 动态规划
(3)TSP_旅行商问题- 模拟退火算法
(4)TSP_旅行商问题- 遗传算法
(5)TSP_旅行商问题- 粒子群算法
(6)TSP_旅行商问题- 神经网络

-------------------------------------------------------------------------------------------------

二、本文概要

       本文基于遗传算法的思想解决旅行商问题,满足了时间复杂度可接受,而且又不会陷入局部最优。本文首先简要介绍了遗传算法(GA)以及核心思想,此外,还给出具体实现程序的具体数据结构(最后提供本文的完整的代码以及整个工程的资源)。然后重点介绍了遗传算法的总体设计以及算法的详略流程,还结合代码重点介绍了遗传算法的几大核心部分,包括“选择(父代)”,“交叉”,“个体变异”,“更新种群(自然选择或者精英保留法)”等。最后根据实验代码给出实验结果,并对本文做出总结。

三、遗传算法

1. 遗传算法简介(GA)

       模拟进化计算(Simulated Evolutionary Computation) 是近二十年来信息科学、人工智能与计算机科学的一大研究领域,由此所派生的求解优化问题的仿生类算法(遗传算法、演化策略、进化程序),由于其鲜明的生物背景、新颖的设计原理、独特的分析方法和成功的应用实践,正日益形成全局搜索与多目标优化理论的一个崭新分支
       遗传算法(GeneticAlgorithm ,GA )是通过模拟生物进化过程来完成优化搜索的,由美国J. Holland 教授提出的一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。它起源于达尔文的进化论,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型。其主要特点是群体搜索策略和群体中个体之间的信息交换,搜索不以梯度信息为基础。它尤其适用于处理传统搜索方法难于解决的复杂和非线性问题,可广泛应用于组合优化、机器学习、自适应控制、规划设计和人工生命等领域。作为一种全局优化搜索算法,遗传算法以其简单通用、鲁棒性强、适于并行处理以及应用范围广等特点,使其成为21 世纪智能计算核心技术之一。进入80 年代,遗传算法迎来了兴盛发展时期,无论是理论研究还是应用研究都成了十分热门的话题。

2. 用遗传算法解决旅行商问题(GA solve  the TSP problem)

       目前针对TSP问题有许多种解法,较为常用的算法有神经网络法、列表寻优法、二叉树描述法、模拟退火法和遗传算法等等。遗传算法是近几年发展起来的一种崭新的全局优化算法,它借用了生物遗传学的观点,通过选择、遗传、变异和免疫等作用机制,使每个个体的适应性提高。由于其全局搜索的特性,遗传算法在解决TSP问题中有着其他算法所没有的优势。提出的TSP问题包括31个城市的编号和各自的位置。本文基于遗传算法解决TSP问题并进行编程和问题求解。

3. 遗传算法核心思想

       模拟进化算法的核心思想源于这样的基本认识:体现在“优胜劣汰”这一自然规律的生物进化过程本身是一个自然的、并行发生的、鲁棒的优化过程,这一优化过程的目标是对环境的适应性(fitness),而生物种群通过生物体的遗传、变异来达到优化(亦即进化)之目的,对生物进化的这种优化观点早在六十年代就引起J.H.Holland、I.Recenberg及L.J.Fogel等计算智能学者的特别兴趣,并相继创立了现在被称之为遗传算法(genetic algorithms)、演化策略(evolution strategies)和进化程序(evolutionary programming)的模拟进化算法。
  • 参数的设置,确定个体的编码方式(二进制或者其他)
  • 初始随机解的生成
  • 选择算子:选择父代的策略(轮盘赌策略)
  • 繁殖:交叉两个父代并产生新个体(TSP问题的编码,需要解决路径冲突问题,即保证每个城市有且仅遍历一次)
  • 变异:对新个体进行变异操作
  • 竞争(更新种群):精英保留策略或者自然选择

4. 本文使用的数据结构以及GA相关参数

	#define CITY_NUM 150				// TSP_城市个数
	#define GROUP_NUM 30				// 群体规模
	#define SON_NUM 32				// 产生儿子的个数	SON_NUM = GROUP_NUM + 2

	const double P_INHERIATANCE = 0.01;	// 变异概率
	const double P_COPULATION = 0.8;	// 杂交概率
	const int ITERATION_NUM = 1500;		// 遗传次数(迭代次数)
	const double MAX_INT = 9999999.0;

	typedef struct{
		int vex_num, arc_num;			// 顶点数 边数
		int vexs[CITY_NUM];			// 顶点向量
		double arcs[CITY_NUM][CITY_NUM];	// 邻接矩阵
	}Graph;

	typedef struct{
		double length_path;
		int path[CITY_NUM];
		double P_Reproduction;
	}TSP_solution;

四、程序流程

1. 遗传算法总体设计

  • 步骤一、初始化参数;
  • 步骤二、随机产生一组初始个体构成的初始种群,并评价每一个个体的适配值(路径长度决定);
  • 步骤三、判断算法的收敛准则是否满足(此处为迭代次数)。若满足输出搜索结果;否则执行[4-8]步骤;
  • 步骤四、执行选择操作ÿ
### 使用遗传算法解决TSP问题的数据集 #### 数据集概述 数据集用于测试和验证不同算法在解决特定问题上的性能。针对旅行商问题(TSP),存在多个公开可用的标准数据集,这些数据集中包含了不同的城市坐标集合以及已知的最佳路径长度。TSPLIB 是最常用的一个库,它提供了多种类型的TSP实例及其变种问题的基准数据。 #### TSPLIB 数据集介绍 TSPLIB (Traveling Salesman Problem Library) 是由德国海德堡大学维护的一组标准测试案例集合[^1]。该数据库中的每一个条目都代表了一个具体的TSP实例或其衍生版本(如ATSP、CVRP等),附带了详细的描述文件(.tsp格式) 和最佳解决方案 (.opt.tour 或 .sol 文件)[^2]。 - **URL**: http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/ #### 获取与使用 为了获取适用于遗传算法实验的数据集,可以从上述链接下载所需的城市位置信息。通常情况下,每个`.tsp`文件内含有一系列二维平面上点的位置坐标(x,y),通过读取这些坐标来构建距离矩阵作为输入给定到GA程序中去。 ```python import tsplib95 from pathlib import Path def load_tsp_data(file_path): problem = tsplib95.load(str(Path(file_path))) coordinates = {node: problem.node_coords[node] for node in problem.get_nodes()} return coordinates # Example usage: coordinates = load_tsp_data('example_file.tsp') print(coordinates) ``` 此代码片段展示了如何利用 `tsplib95` 库加载 `.tsp` 格式的文件,提取其中的城市坐标信息以便后续处理。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值