【问题标题】:dijkstra's algorithm how do you set values to infinity? [duplicate]dijkstra 的算法如何将值设置为无穷大? [复制]
【发布时间】:2016-04-27 03:31:18
【问题描述】:

您好,我正在研究 dijkstra 的算法,cmets 中的第一个提示是,'''对于图中的所有节点,将距离设置为无穷大,前一个等于无''' 他是什么意思你如何设置等于无穷大的值?还有 在方法中没有结束所以我猜测只是为了让结束成为相邻节点?我这么说是因为有一个 are_adjacent 方法 这是我仅有的一点点

def are_adjacent(self, value1, value2):
    return(self.find(value1).is_adjacent(self.find(value2)))


def dijkstra(self, start): 

【问题讨论】:

  • 嗯,浮动('inf')?
  • 如果您知道顶点数和边的最大长度,那么infinity = len(vertices) * max_length + 1 是一个安全值。它比float('inf') 略快。

标签: python algorithm dijkstra


【解决方案1】:

您可以将值设置为无限:

value = float('inf')

或者在 python 3.5 中:

import math
value = math.inf

【讨论】:

  • 你确定吗? math.inf在python3.4中抛出错误
  • python 3.5 中的新功能
【解决方案2】:

你可以在 Python 中这样做:

var = float('inf')
var = float('-inf')   # for minus oo

使用python >= 3.5 使用math 模块:(正如@alpert 和@YOU 在cmets 中指出的那样)

import math
var = math.inf
var = -math.inf

【讨论】:

    【解决方案3】:
    1. 您可以将其设置为一些较大的值,例如 1e9(NodeCount * MaximumEdgeWeight,不会有超过该值的路径);
      1. 或者将其设置为值“-1”并使用一些“if”进行检查: if(d[v] == -1) {/* 那么它是无穷大 */}。

    【讨论】:

      【解决方案4】:

      您可以让字典将图中的所有节点作为键,并将它们各自的已知距离作为值,您将继续更新并最终返回它 例如。 {'A':0, 'B':3, 'C':5, 'D': 7}

      现在,您的问题是如何将距离设置为无穷大,因为实际上从源到所有其他节点的距离最初是未知的,因此将初始距离设置为无穷大。以下代码可以解决问题:

      result = {}
      result[source] = 0 # as the Distance from source to source itself is 0                
          
      for node in graph.nodes:
         if (node != source):
             result[node] = sys.maxsize
      

      【讨论】:

      • sys.maxsize 通常是2**63 - 1,这不是无穷大。这个问题已经有很多正确答案了。 docs.python.org/3/library/sys.html#sys.maxsize
      • 我已经用这个逻辑实现了 Dijkstra 算法,它工作得很好,因为 sys.maxsize 给你足够大的数字可以作为无穷大,因此在 python
      • 您的答案是 “将初始距离设置为无穷大。以下代码可以解决问题:” 没有确认您将其设置为的数字是 不是无穷大。 Python 中的整数和浮点值都可以远远超过sys.maxsize,所以这不是解决问题的通用方案,即便如此,使用sys.maxsize 而不是显式编写2 ** 63 - 1 也没有任何好处。但是,仍然没有必要使用不是无穷大的数字,因为无穷大是可以在任何版本的 Python 中使用的标准浮点数。
      • 你认为 math.inf 或 float(inf) 在幕后做了什么?
      • 是浮点数无穷大。
      猜你喜欢
      • 2018-10-13
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2021-02-09
      • 2017-01-10
      • 2021-11-07
      相关资源
      最近更新 更多