在给定顶点和一些限制

时间:2017-11-09 11:04:43

标签: algorithm graph dynamic-programming graph-theory

我尝试针对以下问题提出算法,但直到现在我还是无法解决它。我想这个问题属于图形问题。也许有人可以给我一个正确的关键字/算法的提示。 :)

所以我的问题:我有一组顶点和一些限制。我试图找到关于限制的顶点之间的所有边缘。

  • 我有一个nxn顶点矩阵
  • 我有一个开始(S)和一个结束(E)(声音像网络/流程)
  • 可以忽略S和E的列和行中的顶点
  • S位于矩阵中的(1,1)处,E位于(n,n)
  • 图表从S指向E,即我必须找到从左上角到右下角的路径。我不能回去。
  • 对于通过矩阵的每一步,我必须增加行和列
  • 我必须越过S和E之间的至少一个顶点

让我们来看看这个例子:

S - - -
- 1 2 -
- 3 4 -
- - - E

我可以识别路径

  • S> 1> 4> ë
  • S> 3> ë
  • S> 2> ë
  • S> 4> E(在我们的用例中与S14E相同,但这并不重要。如果我们可以通过算法过滤它,那将是不错的,但不是必须的。)

更复杂的例子

S - - - -
- 1 2 3 -
- 4 5 6 -
- - - - E

使用以下路径:

  • S> 1> 5> ë
  • S> 1> 6> ë
  • S> 1> ë
  • S> 2> 6> ë
  • S> 2> E(与S26E相同)*
  • S> 3> ë
  • S> 4> ë
  • S> 5> E(与S15E相同)*
  • S> 6> ë

*在我们的用例中

人们还可以想到将具有高度B和宽度T的矩形划分为大小相等的矩形的问题。在我们的使用案例中,B和T的分离数量应该是可以修改的。请参阅图片以获取示例enter image description here

3 个答案:

答案 0 :(得分:1)

在评论中,我暗示了动态编程,如果只需要多个解决方案,这就是解决这个问题的方法。我误解了问题。

要打印所有解决方案,您必须计算所有解决方案,并通过递归完成。递归步骤具有属性gcd(x,y)= 1,因为如果它不是一个大于步骤的情况则会跳过'在一些节点上。

这是一个简单的python解决方案,它以您指定的格式打印结果。

from fractions import gcd

def valid_steps(max_x, max_y):
    for x in xrange(1, max_x+1):
        for y in xrange(1, max_y+1):
            if gcd(x, y) == 1:
                yield x, y

def _solve(n, m, path, xy_2_name):
    x, y = path[-1]
    if x == n and y == m:
        print [xy_2_name[xy] for xy in path]
        return
    for sx, sy in valid_steps(n - x, m - y):
        _solve(n, m, path + [(x+sx, y+sy)], xy_2_name)

def solve(n, m):
    xy_2_name = dict()
    xy_2_name[(1, 1)] = 'S'
    xy_2_name[(n, m)] = 'E'
    c = 1
    for y in xrange(2, m):
        for x in xrange(2, n):
            xy_2_name[(x, y)] = c
            c += 1
    _solve(n, m, [(1, 1)], xy_2_name)

solve(5, 4)

答案 1 :(得分:0)

我不确定这是否有用,但也许您可以查看Theta *(只是google' Theta star')。我不确定这是否符合您的需求,但我觉得您只需要非贪婪的实施。

答案 2 :(得分:0)

看起来可以使用简单的最短路径算法来解决。

图表G = (V,E)。边集E={(i,j), where row(j) > row(i) and col(j) > col(i) }此外,请确保(Start,End)不属于E。然后,很容易看出该图没有定向循环。从StartEnd的任何路径都是满足您的约束的路径。特别是,最短路径(例如,在应用Dijkstra的最短路径算法时很容易获得)满足您的约束条件。

要查找StartEnd之间的所有路径,您需要某种枚举算法。通常,图中两个节点之间的路径数量是图形输入大小的指数。