残念ながら、Javascript や PHP ですぐに利用できるこのソリューションを見つけるのは難しいと思います。ただし、ソリューションの設計に役立つように、問題を(ルールに基づいて)小さなサブ問題に分割できると思います。
どのルールが最も重要かを特定します。あなたが提供したグラフの外観から、ルール 1 と 2 が読みやすさを最大に改善すると思います。
これらのルールに従って配置を決定するには、テキストと吹き出しの境界コンテナーを計算し、交差をテストします。交差点では、交差点のない場所に移動します。見つからない場合は、オーバーラップが最小限のスペースを使用してください。
これにより、左上、右下などの加重配置ヒューリスティックを作成して、ラベルを「優先」位置に配置することもできます。
通常は近くにあり、重複する可能性がある 2 つのラベルを持つ 2 つのバブルを使用して、配置アルゴリズムの小さな部分を書き出そうとします。この小さなサブセットで機能するように配置アルゴリズムを一般化できる場合は、より多くのバブルで前進できるはずです。
また、おそらく、kd ツリーまたは別の空間分割データ構造の順序で何かを使用して、回避する最近傍を見つけることができます。