这是一个旧问题,但我想分享我的方法。我有一个CVRP(容量车辆路径问题)任务。我的启发式算法生成了几个不同的图表来寻找解决方案。
为了避免陷入局部最优解,我使用了一个放松和修复的过程。
在这一点上,我必须过滤掉太相似的解决方案。由于大多数启发式方法使用局部搜索过程中邻域的系统变化来提供解决方案,因此对我而言,Levenshtein距离非常适合。Levenshtein算法的复杂度为O(n*m),其中n和m是两个字符串的长度。因此,通过对图形节点和路线进行字符串表示,我能够找出相似之处。编辑操作可以被认为是邻域操作,因此它可以被认为是搜索空间距离(而不是解决方案空间距离)。
一个更好/更通用的方法是使用牺牲一些速度的
Needleman-Wunsch
算法。
Needleman-Wunsch
是一种混合相似度测量,它概括了Levenshtein距离,并考虑了两个字符串之间的全局对齐。具体而言,它通过为每个输入字符串之间的对齐分配分数来计算,并选择最佳对齐的分数,即最大分数。两个字符串之间的对齐是它们字符之间的一组对应关系,允许存在空位。
例如:
import py_stringmatching as sm
nw = sm.NeedlemanWunsch(gap_cost=0.5, sim_func=lambda s1, s2: (0.0 if s1 == s2 else 1.0))
print('\nNeedleman-Wunsch: ', nw.get_raw_score('045601230', '062401530'))
在这个例子中,你可以使用自定义的Levenshtein算法。
快速实现Levenshtein算法存在于Git中(使用Cython、Numpy等)。
一个好用的库是
py_stringmatching,其中包含以下相似性算法列表:
- Affine Gap
- Bag Distance
- Cosine
- Dice
- Editex
- Generalized Jaccard
- Hamming Distance
- Jaccard
- Jaro
- Jaro Winkler
- Levenshtein
- Monge Elkan
- Needleman Wunsch
- Overlap Coefficient
- Partial Ratio
- Partial Token Sort
- Ratio
- Smith-Waterman
- Soft TF/IDF
- Soundex
- TF/IDF
- Token Sort
- Tversky Index