优化的探路者

时间:2016-12-27 19:31:01

标签: python pathfinder

我有一个很难解决的问题,我会尽力描述它。我不是母语为英语的人,所以如果对我的意思有任何疑问,请问我

描述

我正在与某种探路者挣扎。我有一个网格,其中列出了N个坐标点[x,y]。您需要从A点到B点,两者都属于上一个列表。您只能在两个存在的点之间移动。我需要一个函数,它将点列表,起点A,终点B和最大距离D作为参数。

目标是找出你是否可以使用中间点从A到B,而不必在路径的两个连续点之间行进超过距离D.如果你不能,我们需要找到最小距离D'遵循上述规则。

示例: Example graph

在该图上从点7到点5,最小化在两点之间行进的最大距离的路径是7> 1。 1> 17> 15> 8> 10> 3> 16> 5

解决方案

我已经使用Python提出了解决此问题的方法。然而,当有超过一百点时,我的剧本正在受苦。我真的试图通过减少无用的记忆效应并试图避免无用的测试来最大限度地优化它,但是,它仍然不够。你对如何提高它的有效性有任何想法吗?我曾想过尝试递归方法,但我不认为这会改变任何东西,因为这只是一种写递归的迭代方法。欢迎任何提示:)

我使用python解决问题的方法:

def OptimizedPath( a, b, points, Dmax ):
# Dmax is the maximal distance you can travel between two points
# D is a function which calculate the distance between two points
maxi = D( points[a], points[b])
if maxi < Dmax: # if the direct travel is already ok
    return Dmax
else:
    ways = [[a]]    # itervative methode to explore all paths
    while ways != []:
        nways = []  # new matrix that will contain all paths of n+1 points
        for w in ways:
            # PAcc returns the list of points you can access in less than a distance maxi
            for i in PAcc( w, maxi, points):
                nways.append( w + [i] )

        ways = []
        for w in nways:
            if w[-1] == b:  # if a path has arrived to it's destination
                if Dmaxw( w, points ) < Dmax:   # if it has done it without traveling more than Dmax between two points
                    return Dmax
                elif Dmaxw( w, points ) < maxi: # if it has done it better than the best path found
                    maxi = Dmaxw( w, points )
            elif Dmaxw( w, points ) < maxi: # if it's not over and the maximum distance between two points is smaller than maxi
                ways.append( w )
    return maxi

2 个答案:

答案 0 :(得分:0)

将您的网格视为Graph,每个点都为vertex。找到每对顶点之间的距离,然后您可以使用Dijkstra Algorithm(单源最短路径算法)找到点AB之间的最小距离。虽然时间复杂度将保持O(n^2),因为您需要在最初找到每对顶点之间的距离。

答案 1 :(得分:0)

好吧伙计,

我想对你们所有人表示衷心的感谢,但最终Dijkstra算法解决了所有问题。我无法适应这个特定的问题,因为这是我第一次使用这些高级图优化算法而我并不想找到最短路但两点之间的最大距离。 它最终起作用并带来了更好的结果(包括时间和内存使用)。

我的问题的解决方案,使用python

def nextc( A, U ):
    mini = A[U[0]][0]
    indice = U[0]
    for i in range(1,len(A)):
        if A[i][0] < mini and i in U:
            mini = A[i][0]
            indice = i
    return indice

def DijkstraS( s, e, points ):
    L = D( points[s], points[e] )
    U = [ x for x in range( len(points) ) ]
    A = [ [float('inf'), -1] for i in range(len(points))]
    A[s][0] = 0
    while U != []:
        current = nextc( A, U )
        U.remove(current)
        for P in U:
            Dt = D( points[P], points[current] )
            if Dt < L and max( Dt, A[current][0]) < A[P][0]:
                A[P][0] = max( Dt, A[current][0])
                A[P][1] = current
    return A[e][0]