用 SOM 算法求解 TSP 问题

旅行商问题 (TSP 问题) 是一个 NP-hard 问题,给定若干个城市,求旅行商从某个城市开始,遍历所有城市最终回到出发点的最短路径 (每个城市只经过一次) 。求 TSP 的最优解时间较长,本文介绍一种用 SOM 算法求 TSP 近似解的方法,SOM 是竞争神经网络,也称为自组织映射 。
1.前言最近突然翻到读大学时一个小作业的代码,主要用 SOM 网络算法求 TSP 问题近似解 。代码参考了论文《A simple learning algorithm for growing ring SOM and its application to TSP》,论文作者用了一种 RSOM 算法,与 SOM 不同,其初始神经元比较少,但是会在训练的过程中不断的增加新的神经元 。
代码是用 matlab 编写的,地址:https://github.com/cc54294/SOM_TSP
代码的效果如下面的 gif 所示,分别是在 48、101、225、561 个城市上计算 TSP 的结果 。在 48、101、225 个城市上的效果都比较好,但是在 561 个城市上的效果比较差 。
用 SOM 算法求解 TSP 问题

文章插图
48 个城市 TSP 问题

用 SOM 算法求解 TSP 问题

文章插图
101 个城市 TSP 问题

用 SOM 算法求解 TSP 问题

文章插图
225 个城市 TSP 问题

用 SOM 算法求解 TSP 问题

文章插图
561 个城市 TSP 问题
2.TSP 问题TSP 问题称为旅行商问题,问题的定义:有一个旅行商需要访问 N 个城市,旅行商从一个城市出发,需要经过所有的 N 个城市且每个城市只经过一次,最后回到出发点,求最短的路径 。如下图所示,从城市 A 出发,左侧为 TSP 问题的最短路径:
用 SOM 算法求解 TSP 问题

文章插图
TSP 问题
之前介绍过 Pointer Network,可用于求解 TSP 问题,不熟悉的童鞋可以参考一下之前的文章《指针网络 Pointer Network》 。本文介绍另一种神经网络 SOM 用于求解 TSP 。
3.SOM 算法SOM 神经网络 (自组织映射 Self-Organizing Map),是一种竞争型神经网络,通常用于无监督学习 。一般的神经网络通过损失函数计算梯度进行优化,而 SOM 采用了竞争的策略 。
对于每一个输入样本 x,SOM 会计算所有神经元与 x 的距离 (例如欧式距离),选出获胜神经元 (也称为激活神经元,距离最近的),然后优化获胜神经元附近的网络拓扑结构 。常见 SOM 结构如下,包括输入层和输出层 (竞争层):
用 SOM 算法求解 TSP 问题

文章插图
SOM 示意图
上面的图中,输入层的维度是 d (即每一个样本 x 维度是 d),上面的二维网格中每一个圆点均是一个神经元,每个神经元都具有一个特征向量 w (维度也是 d) 。
神经元之间是具有拓扑结构的,常见的拓扑结构有矩形 (Rectangular) 和六边形 (Hexagonal) 的,如下:
用 SOM 算法求解 TSP 问题

文章插图
SOM 神经元常见的拓扑结构
SOM 训练的过程如下:
  • 随机初始化输出层神经元的特征向量 w,维度是 d 。
  • 对于每一个输入样本 x,找出与其最匹配的神经元,可以根据欧氏距离匹配,计算所有神经元和样本 x 的欧式距离,选距离最近的神经元作为获胜神经元 I 。

用 SOM 算法求解 TSP 问题

文章插图
选择与 x 距离最近的神经元 I
  • 找到获胜神经元 I 后,需要更新神经元 I 和其邻居节点 (即拓扑结构上的邻居) 的特征向量 w 值,更新的时候有更新权重,越靠近 I 的神经元更新权重越大 。对于神经元 j,其更新权重可以用下面的公式计算:

用 SOM 算法求解 TSP 问题

文章插图
神经元 j 的更新权重
  • 得到更新权重后,可以更新神经元的特征向量 w 。更新的公式如下,主要是把特征向量往 x 的方向移动 。

用 SOM 算法求解 TSP 问题

文章插图
更新神经元的特征向量
训练完成后,输出层的神经元可以按照联系的紧密程度划分为几个部分,每部分代表一个簇或者一个类,如下图所示:
用 SOM 算法求解 TSP 问题

文章插图
训练完成后,神经元可以划分为不同的簇
4.用 RSOM 求解 TSPRSOM (Ring SOM) 是一种特殊的 SOM 网络,和上面说的 SOM 主要有两个区别:


推荐阅读