博主在去年做利用Google的word2vec做深度学习的时候,需要将大量的POI数据点连接成汉密尔顿路径,并形成语料库进行进一步分析。何谓汉密尔顿路径,通俗一点地讲,就是将一些点不重复地全部串起来,使得连接这些点的折线段的长度最短。数学形式表达如下:
这种问题属于NP问题,蚁群算法、遗传算法、模拟退火算法都能对这种问题提出一种近似最优解,然而对上述算法不熟悉的童鞋必定一头雾水,因此,本文将讲解一种最简单易懂的算法---我称之为“暴力解法”。顾名思义,就是一次次枚举,通过比较路径长度来选取适当的节点顺序。算法介绍如下:
对于以上三种情况,其构建的路径和长度示意图分别如下:
因此在处理这样的问题时,需要计算任意两点之间的距离,为了便于计算,在计算之前将其距离矩阵计算出来是一种明智的选择,因为后期均为加减法和逻辑判断,将极大地缩短时间。
然而。
是的,当数据量非常大时,构建距离矩阵一次申请内存将爆,例如,我在计算88w个点时,需要申请88w*88w/2*sizeof(float),这是个非常巨大的数字