本文修改日志:
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_旅行商问题- 神经网络
-------------------------------------------------------------------------------------------------
二、本文概要
三、遗传算法
1. 遗传算法简介(GA)
2. 用遗传算法解决旅行商问题(GA solve the TSP problem)
3. 遗传算法核心思想
- 参数的设置,确定个体的编码方式(二进制或者其他)
- 初始随机解的生成
- 选择算子:选择父代的策略(轮盘赌策略)
- 繁殖:交叉两个父代并产生新个体(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]步骤;
- 步骤四、执行选择操作ÿ