如何通过距离矩阵求解二维坐标位置

问题遇到的现象和发生背景

求解TSP问题时,题目只给出距离矩阵,未给出点坐标,试通过距离矩阵求解二维坐标位置。

问题相关代码,请勿粘贴截图

matlab代码如下:
clear;clc;
%任意两个城市之间的距离矩阵
D=[0,300,360,210,530,475,500,690;
300,0,380,270,230,285,200,390;
360,380,0,510,230,665,580,770;
210,270,510,0,470,265,450,640;
530,230,230,470,0,515,360,550;
475,285,665,265,515,0,460,650;
500,200,580,450,360,460,0,190;
690,390,770,640,550,650,190,0];
D([1,8],:)=D([8,1],:);
D(:,[1,8])=D(:,[8,1]);
%求各个城市的坐标
DSquare = D.^2;
[N,~]=size(D);
H = eye(N)-ones(N)/N;
K = -0.5HDSquare*H;

[eigVec, eigVal] = eig(K);

Y = eigVec(:,1:2)*sqrt(eigVal(1:2,1:2));%%求解的巡检点的坐标分布情况。

运行结果及报错内容

img


结果出现复数。

我的解答思路和尝试过的方法

另外尝试使用python的numpy库解方程组,输出值为空?

我想要达到的结果

通过距离矩阵求解二维坐标位置,python代码或matlab代码均可。

下有代码,可直接复制使用。如有帮助,敬请采纳,你的采纳是我前进的动力,O(∩_∩)O谢谢!!!!!!!!
路过的朋友也可以点个赞~(≧▽≦)/~

import numpy as np
D = [[0, 300, 360, 210, 530, 475, 500, 690],
     [300, 0, 380, 270, 230, 285, 200, 390],
     [360, 380, 0, 510, 230, 665, 580, 770],
     [210, 270, 510, 0, 470, 265, 450, 640],
     [530, 230, 230, 470, 0, 515, 360, 550],
     [475, 285, 665, 265, 515, 0, 460, 650],
     [500, 200, 580, 450, 360, 460, 0, 190],
     [690, 390, 770, 640, 550, 650, 190, 0]]
D = np.array(D)
N = D.shape[0]
T = np.zeros((N, N))

D2 = D ** 2
H = np.eye(N) - 1 / N
T = -0.5 * np.dot(np.dot(H, D2), H)

eigVal, eigVec = np.linalg.eig(T)
# 城市坐标X
X = np.dot(eigVec[:, :2], np.diag(np.sqrt(eigVal[:2])))

第一步,任意指定一个点P1为(0,0)
第二步,沿x轴正方向任意指定一个点P2.(0, Dp1p2)
第三步,找到一个点P3使得
Dp1p2 ~= Dp1p3+Dp2p3
Dp1p3 ~= Dp1p2+Dp2p3
Dp2p3 ~= Dp1p3+Dp1p2
并将该点设置在正"y 域中(如果它满足这些条件中的任何一个,则该点应放置在 P1P2 轴上).
使用余弦定律确定距离:
cos (A) = (Dp1p2^2 + Dp1p3^2 - Dp2p3^2)/(2Dp1p2 Dp1p3)
P3 = (Dp1p3 * cos (A), Dp1p3 * sin(A))
您现在已经成功构建了一个正交空间并在该空间中放置了三个点
第四步:要确定所有其他点,请重复第 3 步,为您提供一个暂定的 y 坐标.(Xn, Yn)
将距离 {(Xn, Yn), (X3, Y3)} 与矩阵中的 Dp3pn 进行比较.如果相同,则您已成功识别点 n 的坐标.否则,点 n 在 (Xn, -Yn)