繁体   English   中英

在 Python 中找到坐标系中某些点之间的最短路径

[英]Finding the Shortest Path Between Certain Points in the Coordinate System in Python

我编写了一个代码,可以在坐标系中的某个宽度和长度范围内产生所需数量的点。 它计算我使用欧几里得方法产生的这些点的距离矩阵并将其制成表格。

我的代码在这里:

import pandas as pd
from scipy.spatial import distance_matrix, distance

import random

npoints = int(input("Type the npoints:"))
width = float(input("Enter the Width you want:"))
height = float(input("Enter the Height you want:"))

sample = []
for _ in range(npoints):
    sample.append((width * random.random(), height * random.random()))
print(*[f"({w:.2f}, {h:.2f})" for w, h in sample], sep=', ')

mat_dist = distance.cdist(sample, sample, 'euclidean')
df_mat_dist = pd.DataFrame(mat_dist)
print(df_mat_dist)

Output 是:

Type the npoints:5
Enter the Width you want:6
Enter the Height you want:7
(3.25, 3.55), (5.51, 6.47), (5.87, 5.31), (2.27, 3.20), (0.96, 3.83)
          0         1         2         3         4
0  0.000000  3.690201  3.153510  1.047022  2.305800
1  3.690201  0.000000  1.209096  4.608588  5.257688
2  3.153510  1.209096  0.000000  4.176733  5.123103
3  1.047022  4.608588  4.176733  0.000000  1.450613
4  2.305800  5.257688  5.123103  1.450613  0.000000

Process finished with exit code 0

我想创建一种算法,从输入的随机点开始,围绕最短路径中的所有点。 (最近邻法继续根据欧几里得距离找到离起点最近的点,然后去未纠缠的点中离这个新点最近的点。这个过程一直持续到遍历完所有点,完成一轮)。 我怎样才能在 10 个不同的点重复这个过程 10 次,并得到一个像这样的 output:

Tour Number:1
Number of points visited in order in the relevant round: 0-7-3-8-2...
Total route length of the tour: 18,75755

Tour Number:2
The number of the points visited in order in the relevant round: 6-9-11-2-7...
Total route length of the tour: 14,49849
.
...

非常感谢您的帮助。

如果我正确理解了您的问题,那么这应该可以完成单条路径的工作。

import random
import pandas as pd
from scipy.spatial import distance_matrix, distance

npoints = int(input("Type the npoints: "))
width = float(input("Enter the Width you want: "))
height = float(input("Enter the Height you want: "))

sample = []
for _ in range(npoints):
    sample.append((width * random.random(), height * random.random()))
print(*[f"({w:.2f}, {h:.2f})" for w, h in sample], sep=', ')

mat_dist = distance.cdist(sample, sample, 'euclidean')
df_mat_dist = pd.DataFrame(mat_dist)
print(df_mat_dist)

#Randomly select the first point
closest_idx = random.randrange(npoints)
path_points = [closest_idx]

#Find the closest point to the starting point, different from diagonal and save results
path_length = 0

for _ in range(npoints-1):
    closest_dist = df_mat_dist.loc[closest_idx, ~df_mat_dist.index.isin(path_points)].min()
    closest_idx = df_mat_dist.loc[closest_idx, ~df_mat_dist.index.isin(path_points)].idxmin()
    path_points.append(closest_idx)
    path_length += closest_dist

print(path_points, path_length)

Output

Type the npoints: 5
Enter the Width you want: 6
Enter the Height you want: 7
(2.45, 6.66), (3.01, 3.94), (5.06, 0.51), (5.89, 1.04), (1.37, 5.03)
          0         1         2         3         4
0  0.000000  2.775327  6.677550  6.587089  1.950042
1  2.775327  0.000000  3.993631  4.086550  1.970787
2  6.677550  3.993631  0.000000  0.988898  5.834766
3  6.587089  4.086550  0.988898  0.000000  6.030719
4  1.950042  1.970787  5.834766  6.030719  0.000000
[1, 4, 0, 3, 2] 11.49681560383563

从那你应该能够调整代码运行 10 次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM