简体   繁体   English

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

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

I wrote a code that produces the desired number of points in a certain width and length range in the coordinate system.我编写了一个代码,可以在坐标系中的某个宽度和长度范围内产生所需数量的点。 It calculates and tabulate the distance matrix of these points I produced using the Euclidean method.它计算我使用欧几里得方法产生的这些点的距离矩阵并将其制成表格。

My code is here:我的代码在这里:

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 is: 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

I want to create an algorithm that goes around all the points in the shortest path, starting from a random one of the entered points.我想创建一种算法,从输入的随机点开始,围绕最短路径中的所有点。 (The nearest neighbor method continues by finding the closest point to the starting point according to the Euclidean distance. Then it goes to the closest point to this new point among the unentangled points. This process continues until all points are traversed and the round is completed). (最近邻法继续根据欧几里得距离找到离起点最近的点,然后去未纠缠的点中离这个新点最近的点。这个过程一直持续到遍历完所有点,完成一轮)。 How can I repeat this process 10 different times at 10 different points and get an output like this:我怎样才能在 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
.
...

Thanks a lot for the help.非常感谢您的帮助。

If I have understood your problem correctly, this should do the job for a single path.如果我正确理解了您的问题,那么这应该可以完成单条路径的工作。

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 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

From that you should be able to adapt the code to run 10 times.从那你应该能够调整代码运行 10 次。

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

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