当前位置: 首页 > 知识库问答 >
问题:

如何计算A*星与自定义启发式在networkx?

傅阿苏
2023-03-14

我试图用一个自定义的启发式算法计算两个节点之间的最短路径长度。启发式方法测量两个节点之间的加权最短路径长度加上最短路径内的节点数。考虑一个交通问题,我需要在城市网络中找到两个城市之间的最短路径。最短路径是具有最小总距离(以天为单位)和城市中最小公交次数(以天为单位)的路径。

我试图使用networkxa_star_path_length功能。以下是我已经尝试过的:

def distance(a,b):
    return ( nx.dijkstra_path_length(G,a,b, 'day') + len(nx.dijkstra_path(G, a, b)) )

nx.astar_path_length(G, 'A', 'F', heuristic=distance, weight='day')

假设具有六个节点的图中每条边的权重如下所示:

A,B --> 1 day
B,C --> 1 day
C,D --> 1 day
D,F --> 1 day
A,E --> 4 day
E,F --> 1 day

对于每个访问的节点,我需要花费1天的时间。

因此,城市A和城市F之间的最短路径如下:A--

结果应该是(41)(11)=7。

路径A-B-C-D-F的距离可能最短。但是由于有很多次的过境,它们不再是最短的路径。

我用a_star函数尝试了我的函数,但是算法仍然更喜欢路由A-B-C-D-F,而不是A-E-F。

请帮忙。

共有1个答案

史昀
2023-03-14

这里的问题是您试图修改启发式,而不是实际的图权重。实际上,A*算法返回的最小权重路径与Djikstra算法返回的路径相同,它的速度要比Djikstra快得多,因为它没有进行随机的广度优先搜索,但有一个启发式算法可以帮助它在图中的正确方向上进行引导。重要的是,不管启发式是什么,它仍然会找到最小权重路径†。

解决此问题的方法是将运输编号合并到重量中。我认为这应该等于在图表中的每一个权重上加1(或者你想怎么加一跳的权重)。

通常,我认为某些启发式属性有例外。

 类似资料:
  • 有没有一种方法可以将自定义移动放入构建启发式中?我正在从事一个项目,该项目接近optaplanner中的护士名册问题,但除了将员工分配到轮班任务之外,我还需要将员工分配到轮班中所需的小任务。所以当我将员工安排在轮班中时,我需要将员工安排在所有他可以完成的小任务中(有技能)。我不希望这是第二个计划实体,员工是计划变量,我只是希望当我将员工分配到一个班次时,循环处理该班次内的所有小任务(在班次的开始和

  • 我正在尝试使用 A* 算法找到任何长度的滑动块拼图的最佳解决方案。 滑动积木拼图是一种游戏,白色(W)和黑色(B)的瓷砖排列在一个线性游戏板上,有一个单一的空白空间(-)。给定棋盘的初始状态,游戏的目的是将瓷砖排列成目标模式。 例如,我目前在董事会上的状态是BBW-WWB,我必须达到BBB-WWW状态。瓷砖可以通过以下方式移动:1.滑入相邻的空白空间,成本为1。2. 跳过另一个瓷砖进入空白区域,费

  • 我不知道如何把它放到一个启发式函数中,而且我对状态的数目有疑问。如果我承认这些动作(从水龙头灌满一个,把一个倒到下水道,从一个倒到另一个,直到接收罐满了或倒罐空了),有15种可能的状态,但如果我考虑关于加仑数量的所有可能性,有24种可能性。那是正确的吗? (0,0) (3,0)(0,5) 但是我也为一个问题找到了这个答案(水壶的启发式函数),现在我很困惑。谁能给我解释一下吗? 最大(estimat

  • 在阅读了这个问题的答案之后,我试着将其放在中。启动(使用),我尝试了别名。他们没有被认出来。 我想知道如何在全局和虚拟环境中设置。

  • 问题内容: 我需要从MySQL选择语句中的某个日期算起几周。其中一个表中有一个日期列,我需要计算该日期有几周。 例子: 6 days away, weeks out = 0 7 days away, weeks out = 1 13 days away, weeks out = 1 14 days away, weeks out = 2 问题答案: 使用DATEDIFF函数: WEEKS的问题在于

  • 问题内容: 我正在尝试中构建一个简单的自定义。我在这里可以编写自定义的Transformer,但是我不确定如何在上执行此操作Estimator。我也不明白做什么,为什么我需要这么多的设置方法和获取方法。似乎有一个适用于自定义模型的文档(请参阅此处,但PySpark没有。 示例模型的伪代码: 问题答案: 一般来说,没有文档,因为对于Spark 1.6 / 2.0,大多数相关API都不打算公开。它应该