【问题标题】:Nearest neighbor algorithm最近邻算法
【发布时间】:2020-09-10 10:53:30
【问题描述】:

我有我的最近邻算法,我试图在一个循环中遍历所有点。路径的长度计算为路径上相邻点之间的欧几里得距离之和,就像我在函数“dist”中所做的那样。问题是由于某种原因它没有打印最后一点。

Input style:
n      #number of points
x1, y2 #coordinates of the point
x2, y2
...

example:
4
0 0
1 0
1 1
0 1
it gives me output >> 1 2 3 
the desired output should be >> 1 2 3 4
from math import sqrt

n = int(input())
points = []

for i in range(0, n):
    x, y = list(map(float, input().split()))
    points.append([x,y])


def dist(ip1, ip2):
    global points
    p1 = points[ip1]
    p2 = points[ip2]
    return sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)


circuit = set()
start_vertex = 0
dark_side = set(range(n)) - {start_vertex}

visited_islands = []
current_vertex = start_vertex
while len(dark_side) > 0:
    min_distance = None
    best_v = None
    for v in dark_side:
        if ((min_distance is None) or
                (min_distance > dist(current_vertex, v))):
            min_distance = dist(current_vertex, v)
            best_v = v

    visited_islands.append(current_vertex+1)
    circuit.add((current_vertex, best_v))
    dark_side.remove(best_v)
    current_vertex = best_v
# visited_islands.append(visited_islands[0]) #going to the start when done
print(*visited_islands)
# print(len(visited_islands))

【问题讨论】:

  • 您正在使用变量dark_side 执行while 循环。我不明白这个变量的初始化:dark_side = set(range(n)) - {start_vertex}。但是,它是用字典{1, 2, 3} 初始化的。所以它只会在退出之前循环3次。
  • 为了澄清这个问题,您是否试图找出每个点的最近邻?还是你在寻找路径?看起来你正在尝试做前者。

标签: python algorithm nearest-neighbor


【解决方案1】:

我修改了你的最后一段代码,假设你正在为输入中的每个点寻找最近的邻居。

circuit = set()
visited_islands = []
for current_vertex in range(n):
    min_distance = None
    best_v = None
    for v in range(n):
        if current_vertex == v:
            continue
        if ((min_distance is None) or
                (min_distance > dist(current_vertex, v))):
            min_distance = dist(current_vertex, v)
            best_v = v
    circuit.add((current_vertex, best_v))
    visited_islands.append(current_vertex+1)

print(*visited_islands)
print(circuit)

输出:

1 2 3 4

{(0, 1), (1, 0), (2, 1), (3, 0)}

【讨论】:

    猜你喜欢
    • 2012-06-27
    • 2014-01-17
    • 2018-05-09
    • 2010-10-16
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2018-01-30
    相关资源
    最近更新 更多