基于遗传算法的TSP旅行商问题求解器
项目介绍
本项目是一个基于遗传算法(Genetic Algorithm, GA)的旅行商问题(Traveling Salesman Problem, TSP)自动化求解器。旅行商问题是一个经典的组合优化难题,旨在寻找通过给定城市集合中所有城市、且每个城市仅访问一次后返回起点的最短路径。该项目利用生物进化中的“优胜劣汰”机制,通过模拟自然选择、交叉和变异过程,在庞大的搜索空间中高效寻找全局接近最优的路径方案。
功能特性
- 随机坐标生成:支持在指定空间范围内随机分布城市坐标,模拟真实的地理布局。
- 启发式优化算子:包含锦标赛选择、部分匹配交叉(PMX)和逆转变异,保证了种群的多样性与局部搜索能力。
- 精英保留策略:每代进化中均会自动保存当前最优个体,确保计算过程不会退化,保证算法的收敛性。
- 双维度可视化:实时展示算法收敛曲线(路径长度随进化代数的变化)和最终的最优路径拓扑图。
- 高效矩阵运算:利用预计算的距离矩阵,加速适应度评估过程。
系统要求
- 软件环境:MATLAB R2016a 或更高版本。
- 核心组件:MATLAB 数值计算核心、图形化显示组件。
- 计算资源:无需特殊硬件,主流配置电脑即可快速完成求解。
实现逻辑与功能细节
程序的执行逻辑严格遵循标准遗传算法的工作流,具体步骤如下:
#### 1. 初始化阶段
- 环境搭建:设定城市数量为30个,种群规模为100,最大迭代次数为500次。交叉概率设定为0.85,变异概率为0.15。
- 坐标与距离:在0-100的二维平面内生成随机坐标,并计算所有城市间的欧几里得距离,存储在对称的距离矩阵中,以便后续快速查询。
- 初始种群:通过对城市序列执行随机排列,生成100个随机的初始解(路径)。
#### 2. 进化循环阶段
在每一代迭代中,程序执行以下核心逻辑:
- 适应度评估:计算每个个体的总路径长度(包含返回起始城市的距离),并取其倒数作为适应度值。适应度越高,说明路径越短。
- 记录最优:动态比较并保存自运行以来发现的最短路径和对应的行程长度。
- 选择算子(锦标赛选择):从种群中随机抽取3个个体进行竞争,适应度最高的个体胜出并进入下一代缓冲区,该过程重复直到填满种群。
- 交叉算子(PMX):以0.85的概率对相邻个体执行部分匹配交叉。该算子随机选取两个交叉点,交换中间片段,并通过冲突映射处理重复的城市编号,确保生成的子代依然是合法的城市排列。
- 变异算子(逆转变异):以0.15的概率对个体执行逆变异。在路径中随机选定两个位置,将该区段内的城市顺序完全翻转,这有助于跳出局部最优解。
- 策略性保留:强制将当前代种群的第一个个体替换为历史上发现的最优解,实现精英保留。
#### 3. 结果输出与可视化
- 统计报告:在命令行窗口输出计算完成的提示、最终最短距离以及完整的城市访问序列。
- 图表展示:生成图形化界面。左侧显示收敛曲线,直观呈现最短路径随进化代数的下降过程;右侧显示路径规划拓扑图,用散点表示城市位置,用连线表示旅行商的行进路线。
关键算法分析
- 距离计算逻辑:采用循环累加方式计算路径总长度,并特别增加了最后一个城市回到第一个城市的闭环距离计算。
- 部分匹配交叉(PMX)实现:这是处理排列编码问题的关键。当交换片段产生重复城市时,程序会通过映射关系在片段外寻找对应的替换值,直到消除所有冲突。
- 逆转变异(Inverse Mutation):相比于简单的两点对换变异,逆转变异对路径结构的扰动更具组织性,能更有效地改变城市间的相对顺序,提高搜索效率。
- 可视化函数:利用绘图指令展示路径,不仅标记了城市坐标,还通过文本标注显示了每个城市的原始编号,方便用户进行路径复核。
使用方法
- 启动 MATLAB 软件。
- 将项目相关的程序文件置于 MATLAB 当前工作目录下。
- 在命令行窗口直接调用主运行程序函数名。
- 程序运行结束后,会自动弹出可视化窗口并显示求解结果。