わかりました、ここで約束されているように、簡単な解決策:
表記法:は、点との間の距離の2 乗d_{i,j}=d_{j,i}
を表します。を点数とする.点とその点の- 番目の座標を とします。i
j
N
p_i
i
p_{i,k}
k
アルゴリズムを正しく導出できることを祈りましょう。後で説明がありますので、派生を確認できます(インデックスがたくさん表示されるのは嫌いです)。
アルゴリズムは動的計画法を使用して正しい解に到達します
Initialization:
p_{i,k} := 0 for all i and k
Calculation:
for i = 2 to N do
sum = 0
for j = 2 to i - 1 do
accu = d_{i,j} - d_{i,1} - p_{j,j-1}^2
for k = 1 to j-1 do
accu = accu + 2 p_{i,k}*p_{j,k} - p_{j,k}^2
done
p_{i,j} = accu / ( 2 p_{j,j-1} )
sum = sum + p_{i,j}^2
done
p_{i,i-1} = sqrt( d_{i,0} - sum )
done
重大なインデックスの間違いをしていない場合 (通常はそうしています)、これでうまくいくはずです。
この背後にあるアイデア:
作業を楽にするために、原点に任意の最初の点を設定します。のときにp_i
座標を設定しない点ではありません。つまり、2 番目のポイントでは最初の座標のみを設定し、3 番目のポイントでは 1 番目と 2 番目の座標のみを設定します。k
k > i-1
ここで、すべての点 p_{k'}の座標があり、すべてが満たされるようk'<i
に の座標を計算したいとします( の点の制約についてはまだ気にしません)。私たちが持っている一連の方程式を書き留めるとp_{i}
d_{i,k'}
k>k'
d_{i,j} = \sum_{k=1}^N (p_{i,k} - p_{j,k} )^2
p_{i,k}
との両方p_{j,k}
がゼロに等しいためk>k'
、これを次のように減らすことができます。
d_{i,j} = \sum_{k=1}^k' (p_{i,k} - p_{j,k} )^2
また、ループ不変式により、 の場合はすべてp_{j,k}
ゼロになることに注意してくださいk>j-1
。したがって、この方程式を分割します。
d_{i,j} = \sum_{k=1}^{j-1} (p_{i,k} - p_{j,k} )^2 + \sum_{k=j}^{k'} p_{i,j}^2
最初の式については、次のようになります。
d_{i,1} = \sum_{k=1}^{j-1} (p_{i,k} - p_{j,k} )^2 + \sum_{k=j}^{k'} p_i{i,1}^2
これは後で特別な処理が必要になります。
ここで、正規方程式のすべての二項式を解くと、次のようになります。
d_{i,j} = \sum_{k=1}^{j-1} p_{i,k}^2 - 2 p_{i,k} p_{j,k} + p_{j,k}^2 + \sum_{k=j}^{k'} p_{i,j}^2
これから最初の方程式を引くと、次のようになります。
d_{i,j} - d_{i,1} = \sum_{k=1}^{j-1} p_{j,k}^2 - 2 p_{i,k} p_{j,k}
すべての j > 1 に対して。
これを見ると、p_i の座標のすべての正方形がなくなり、必要な正方形だけが既にわかっていることがわかります。これは、線形代数の方法を使用して簡単に解くことができる一連の線形方程式です。実際、この一連の方程式にはもう 1 つ特別なことがあります。方程式は既に三角形の形式になっているため、解を伝播する最後のステップのみが必要です。最後のステップとして、平方根を 1 つ取るだけで解ける 1 つの二次方程式が残ります。
私の推論に従っていただければ幸いです。少し遅れて、私の頭はそれらのインデックスから少し回転しています。
編集:はい、インデックス作成の間違いがありました。修理済み。テストする時間があれば、Python でこれを実装しようとします。