Django 在图中查找两个顶点之间的路径
Posted
技术标签:
【中文标题】Django 在图中查找两个顶点之间的路径【英文标题】:Django finding paths between two vertexes in a graph 【发布时间】:2017-07-03 04:32:50 【问题描述】:这主要是一个逻辑问题,但上下文是在 Django 中完成的。
在我们的数据库中,我们有顶点和线类,它们形成了一个(神经)网络,但它是无序的,我无法更改它,它是一个遗留数据库
class Vertex(models.Model)
code = models.AutoField(primary_key=True)
lines = models.ManyToManyField('Line', through='Vertex_Line')
class Line(models.Model)
code = models.AutoField(primary_key=True)
class Vertex_Line(models.Model)
line = models.ForeignKey(Line, on_delete=models.CASCADE)
vertex = models.ForeignKey(Vertex, on_delete=models.CASCADE)
现在,在应用程序中,用户将能够直观地选择两个顶点(下面的绿色圆圈)
javascript然后将这两个顶点的pk发送给Django,它必须找到满足它们之间路由的Line类,在这种情况下,以下4个红色Lines:
业务逻辑:
一个顶点可以有 1-4 行与之相关 一条线可以有 1-2 个与之相关的顶点 两个顶点之间只有一种可能的路线到目前为止我所拥有的:
我知道答案可能包括递归 必须通过从一个顶点到找到另一个顶点的每条路径都尝试找到该路径,无法直接找到它 由于有四路和三路交叉点,因此在整个递归过程中必须保存所有尝试的路线(不确定这一点)我知道基本逻辑是循环遍历每个 Vertex 的所有行,然后获取这些行中的另一个 Vertex,并继续递归地走,但我真的不知道从哪里开始。
这是我所能得到的,但它可能没有帮助(views.py):
def findRoute(request):
data = json.loads(request.body.decode("utf-8"))
v1 = Vertex.objects.get(pk=data.get('v1_pk'))
v2 = Vertex.objects.get(pk=data.get('v2_pk'))
lines = v1.lines.all()
routes = []
for line in lines:
starting_line = line
#Trying a new route
this_route_index = len(routes)
routes[this_route_index] = [starting_line.pk]
other_vertex = line.vertex__set.all().exclude(pk=v1.pk)
#There are cases with dead-ends
if other_vertex.length > 0:
#Mind block...
【问题讨论】:
【参考方案1】:正如您所指出的,这不是与 Django/Python 相关的问题,而是逻辑/算法问题。
要在图中找到两个顶点之间的路径,您可以使用很多算法:Dijkstra、A*、DFS、BFS、Floyd–Warshall 等。您可以根据需要进行选择:最短/最小路径,所有路径...
如何在 Django 中实现这一点?我建议不要将算法应用于模型本身,因为这可能很昂贵(在时间、数据库查询等方面),特别是对于大图;相反,我宁愿将图形映射到内存数据结构中并在其上执行算法。
你可以看一下这个Networkx,它是一个非常完整(数据结构+算法)且有据可查的库; python-graph,它提供了一个合适的数据结构和一整套重要的算法(包括上面提到的一些)。更多选项Python Graph Library
【讨论】:
我个人希望通过关系来实现,因为这似乎更快,但 Networkx 真的很棒,并且对其他项目有帮助以上是关于Django 在图中查找两个顶点之间的路径的主要内容,如果未能解决你的问题,请参考以下文章