これは古い質問ですが、私のアプローチを共有したいと思います。CVRP(Capacitated Vehicle Routing Problem)タスクがありました。私のヒューリスティックアルゴリズムは、解決策を見つけるためにいくつかの異なるグラフを作成しました。局所最適にとらわれないように、私はリラックスと修復の手順を使用しました。
この時点で、類似しすぎたソリューションを除外する必要がありました。ほとんどのヒューリスティックアプローチは、ローカル検索手順内の近隣の体系的な変更を使用してソリューションを提供するため、Edit
距離(Levenshtein distance
)は私にとって完璧でした。Levenshtein
アルゴリズムの複雑さはO(n*m)
、nとmが2つの文字列の長さであるという複雑さです。したがって、グラフノードとルートの文字列表現を使用して、類似性を把握することができました。は、(解空間距離ではなく)探索空間距離と見なすことができるようにedit operations
考えることができます。neighborhood operations
Needleman-Wunsch
速度をいくらか犠牲にするより良い/一般化されたアプローチはアルゴリズムでしょう。Needleman-Wunsch
は、レーベンシュタイン距離を一般化し、2つの文字列間のグローバルアラインメントを考慮するハイブリッド類似度です。具体的には、2つの入力文字列間の各配置にスコアを割り当て、最適な配置のスコア、つまり最大スコアを選択することによって計算されます。2つの文字列間の配置は、それらの文字間の一連の対応であり、ギャップを考慮に入れています。
例えば:
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'))
この例では、カスタムレーベンシュタインアルゴリズムを使用できます。
レーベンシュタインの高速実装はGitに存在します(Cython、Numpyなどを使用)。
優れたライブラリはpy_stringmatchingであり、類似性アルゴリズムの次のリストが含まれています。
- アフィンギャップ
- バッグの距離
- 余弦
- サイコロ
- Editex
- 一般化されたJaccard
- ハミング距離
- ジャッカード
- ヤロ
- ジャロ・ウィンクラー
- レーベンシュタイン
- モンゲエルカン
- ニードルマン-ブンシュ
- オーバーラップ係数
- 部分比率
- 部分的なトークンの並べ替え
- 比率
- スミス-ウォーターマン
- ソフトTF/IDF
- Soundex
- TF / IDF
- トークンソート
- トベルスキーインデックス