ポイントがプロットされ、一部またはすべてにラベルが付いているグラフィカルな xy プロットからセマンティクスを抽出しようとしています。ラベルは「ポイントの近く」にプロットされるため、人間は通常、どのラベルがどのポイントに対応しているかを理解できます。たとえば、このプロットでは、どのラベル (番号) がどのポイント (*) に属しているかが明確であり、ユークリッド距離に基づくアルゴリズムが機能します。(ラベルとポイントには意味的な順序付けはありません - 散布図など)
*1
*2
*3
*4
混雑したプロットでは、オーサリング ソフトウェア/人間は、重複を避けるためにラベルを異なる方向に配置する場合があります。たとえば、
1**2
**4
3
人間のリーダーは通常、どのラベルがどのラベルに関連付けられているかを判断できます。
私が受け入れる1つの解決策は、ユークリッド距離行列を作成し、行をシャッフルして関数の最小値を取得することです(たとえば、対角線または他のヒューリスティック上の距離の合計二乗)。2 番目の例 (北西の角から時計回りに a、b、c、d のラベルが付いた点) では、(1 dp までの) 距離行列があります。
a b c d
1ab2 1 1.0 2.0 2.2 1.4
dc4 2 2.0 1.0 1.4 2.2
3 3 2.0 2.2 1.4 1.0
4 2.2 1.4 1.0 2.0
ラベルを付ける必要がありa1 b2 c4 d3
ます。行 3 と 4 を入れ替えると、対角線の最小和が得られます。最も近いものを選択するだけでは失敗する可能性がある、より複雑な例を次に示します。
*1*2*5
**4
3 *6
これが解決された場合、ラベルの数がポイントの数よりも少ないか多い場合に行く必要があります。
アルゴリズムが標準である場合は、オープン ソース Java (JAMA や Apache maths など) へのポインタをいただければ幸いです。
注: この SO の回答ポイントを通るパスが指定されているため、近くのポイントをパスに関連付けることは回答としては機能しません。