疯狂的输出数字 - python 中的 Dijkstra 算法 - 寻找最短路径

crazy output numbers - Dijkstra algorithm in python - finding the shortest path

我正在使用 Dijkstra 算法寻找最短路径。

例如:

从 a 到 b 的直接方式 :5

从 b 到 c 的直接方式 :2

从a到c的直接方式:9 ...那么从 a 到 c 的最短路径距离 7,而不是 9。

问题是: 我以为我在加数字,比如 3.1、2、5.4、6.7、10.8,所以小数点后只有一位的数字,或者自然数。但我从这个算法得到的结果是这样的: 22.400000000000002.. 我不知道为什么会这样。

import heapq  #you don't have to install this

def dijkstra(graph, start):
  distances = {node: float('inf') for node in graph}  
  distances[start] = 0  
  queue = []
  heapq.heappush(queue, [distances[start], start])  

  while queue:  
    current_distance, current_destination = heapq.heappop(queue)  

    if distances[current_destination] < current_distance:  
      continue
    
    for new_destination, new_distance in graph[current_destination].items():
      distance = current_distance + new_distance  
      if distance < distances[new_destination]: 
        distances[new_destination] = distance
        heapq.heappush(queue, [distance, new_destination]) 
    
  return distances

下面是'graph'

graph = {
    index[1]: {index[2]: 5.3, index[22]: 11.3},
    index[2]: {index[3]:4.7},
    index[3]: {index[4]: 4.1, index[8]: 9.4, index[22]:4.3},
    index[4]: {index[5]: 2.5, index[8]: 4.6},
    index[5]: {index[6]: 4.6, index[10]:7.5, index[16]:10.3,index[22]:5.8},
    index[6]: {index[7]: 5.8},
    index[7] : {index[8]:6.7},
    index[8] : {index[9]:5.1},
    index[9] : {index[10]:3.7},
    index[10] : {index[11]:5.2,index[17]:17.5},
    index[11] : {index[12]:8.7,index[13]:6.7, index[22]:11.2},
    index[12] : {index[13]:4.3,index[16]:15.9},
    index[13] : {index[14]:3.3,index[15]:6.5},
    index[14] : {index[15]:9.7,index[16]:10.1},
    index[15] : {index[16]:2.9},
    index[16] : {index[17]:7.1,index[18]:2.4,index[22]:4.2},
    index[17] : {index[18]:4.7},
    index[18] : {index[19]:9,index[21]:3.2},
    index[19] : {index[20]:4.2},
    index[20] : {index[21]:4.2},
    index[21] : {index[22]:1.7},
    index[22] : {index[1]:11.3}
}

..并且''index'是...

index = {
    1:'a',
    2:'b',
    3:'c',
    4:'d',
    5:'e',
    6:'f',
    7:'g',
    8:'h',
    9:'i',
    10:'j',
    11:'k',
    12:'l',
    13:'m',
    14:'n',
    15:'o',
    16:'p',
    17:'q',
    18:'r',
    19:'s',
    20:'t',
    21:'u',
    22:'v'
}
print('from',index[5],'to',dijkstra(graph, index[5]))

谢谢!

我很确定它已被多次回答,但我现在找不到。请随时标记为重复。

TLDR:算法没有问题,只是因为浮点数在计算机内存中的表示方式。

计算机以二进制形式存储数字,包括浮点数。有些分数不能用二进制表示,因为它们存储的位数有限。这有时会导致奇怪的舍入错误,如下所示(取自 this question):

n = 5.59
round(n, 1) # 5.5999999999999996

请注意,这也取决于平台。不同的 CPU 和不同的 Python 实现使用不同的长度来存储浮点数。您可能不会在不同的机器上看到相同的结果,甚至在使用不同浮点类型的同一台机器上(例如通过 numpy