本文主要内容为利用遗传算法解决TSP(旅行商问题)。
TSP问题可以描述为:某一旅行商从某个城市出发访问n个城市,去到每个城市一次且仅一次,目标为安排路线并其为最短路线。
本案例以14个城市的二维坐标为数据,寻找一条最短的遍历这14个城市的路径。
遗传算法流程:
- 编码
对于14个城市,设置染色体分为14段,每一段为对应城市的编号。利用randperm(14)
随机编码一个染色体。例如得到:6 3 11 7 14 8 5 1 2 4 13 9 10 12
- 种群初始化
完成编码之后,需要产生一个初始种群作为起始解。初始化种群数目一般根据经验得到,一般取值为50到200之间。根据本案例城市个数,取种群大小为100。
- 适应度函数
设函数为遍历14个城市的距离的倒数。优化的目标就是选择适应度函数尽可能大的染色体,适应度函数越大的染色体越优质,反之越劣质。
- 选择操作
从旧群体中以一定概率选择个体到新群体中,个体被选中的概率跟适应度值有关,个体适应值越大,被选中的概率越大。
- 交叉操作
**该部分与传统交叉操作不同,交叉操作后的染色体应满足编码要求。**采用部分映射杂交,确定交叉操作的父代,将父代样本两两分组,重复以下操作:
在1至14间产生两个随机整数,将两个随机数中间的染色体段进行交叉。交叉后,不重复的段保留,有冲突的数字采用部分映射的方法消除冲突。
- 变异操作
**该部分与传统变异操作不同,变异操作后的染色体应满足编码要求。**变异策略采取随机选两个点将其对换位置。
- 进化逆转操作
**该部分为改善遗传算法的局部搜索能力而新增。**这里进化是指逆转算子的单方向性,即只有经逆转后,适应度值有所提高的才接受下来,否则逆转无效。
最终结果:
初始种群中的一个随机值:
11—>9—>2—>3—>13—>10—>4—>6—>1—>8—>7—>5—>12—>11
总距离:55.9173
最优解:
9—>10—>1—>2—>13—>3—>4—>5—>6—>11—>7—>12—>8—>9
总距离:29.2446