【问题标题】:Can't index through graph containing string values无法通过包含字符串值的图形进行索引
【发布时间】:2022-11-21 10:43:32
【问题描述】:

我的目标是能够使用 Dijkstra 算法读取所有其他建筑物之间特定建筑物之间的最短距离。我相信如果我能改正错误,我就能完成我的目标。下面的错误在 for 循环处停止,它试图通过顶点进行索引。我认为这可能与不包含整数数据类型的图形有关,但这无关紧要,因为它应该只比较图形中的数字。如果有人能指出我正确的方向,这样我就能明白我做错了什么,那就太好了。

追溯(最近一次通话): dijkstra 中的文件“main.py”,第 26 行 对于 self.graph[u] 中的 v: 键错误:0

import sys 
  
class Graph(): 
  
  def __init__(self, vertices): 
    self.V = vertices 
    self.graph = {}
    
  def min_distance(self,distance,traversed):
    min_index = 0 
    min_value = sys.maxsize
    for i in range(self.V):
      if traversed[i] is False and min_value > distance[i]:
        min_value = distance[i]
        min_index = i
    return min_index
    
  def dijkstra(self,source):
    distance = [sys.maxsize] * self.V
    traversed = [False] * self.V
    distance[source] = 0
        
    for i  in range(self.V):
      u = self.min_distance(distance,traversed)
      traversed[u] = True
      for v in self.graph[u]:               #ERROR
        if(traversed[v] is False):
          distance[v] = min(distance[v],distance[u]+self.graph[u][v])
    print("from the give source vertex -- > ",source)
    for vertex in range(self.V):
      print("Vertex ",vertex," --> Distance = ",distance[vertex])
                
g  = Graph(19)

g.graph = {
    'College Square':{'Lewis Science Center':200, 'Prince Center':300},
    'Lewis Science Center':{'College Square':200, 'Speech Language Hearing':250, 'Computer Science':150},
    'Speech Language Hearing':{'Lewis Science Center':250, 'Burdick':100, 'Maintenance College':120},
    'Computer Science':{'Prince Center':80, 'Torreyson Library':40, 'Burdick':30, 'Lewis Science Center':150},
    'Burdick':{'Computer Science':30, 'Speech Language Hearing':100, 'Torreyson Library':80, 'Maintenance College':300, 'McALister Hall':200},
    'Prince Center':{'College Square':300, 'Computer Science':80, 'Torreyson Library':30, 'Police Dept.':100},
    'Torreyson Library':{'Prince Center':30, 'Computer Science':40, 'Burdick':80, 'Old Main':30},
    'Old Main':{'Torreyson Library':30, 'Police Dept.':200, 'Fine Art':90, 'McALister Hall':100},
    'Maintenance College':{'Speech Language Hearing':120, 'Burdick':300, 'McALister Hall':150, 'Wingo':100, 'New Business Building':150, 'Oak Tree Apt.':160},
    'Police Dept.':{'Prince Center':100, 'Old Main':200, 'Fine Art':50, 'Student Health Center':100},
    'Fine Art':{'Police Dept.':50, 'Old Main':90, 'McALister Hall':180, 'Student Center':80},
    'McALister Hall':{'Fine Art':180, 'Old Main':100, 'Burdick':200, 'Maintenance College':150, 'Wingo':50, 'Student Center':100},
    'Student Center':{'Fine Art':80, 'McALister Hall':100, 'Wingo':100, 'New Business Building':110, 'Student Health Center':50},
    'Wingo':{'Student Center':100, 'McALister Hall':50, 'Maintenance College':100, 'New Business Building':50},
    'Student Health Center':{'Police Dept.':100, 'Student Center':50, 'Brewer-Hegeman':200},
    'New Business Building':{'Student Center':110, 'Wingo':50, 'Maintenance College':150, 'Oak Tree Apt.':30, 'Brewer-Hegeman':20},
    'Oak Tree Apt.':{'Maintenance College':160, 'New Business Building':30, 'Brewer-Hegeman':40},
    'Brewer-Hegeman':{'Student Health Center':200, 'New Business Building':20, 'Oak Tree Apt.':40, 'Bear village Apt.':350},
    'Bear village Apt.':{'Brewer-Hegeman':350}

     }

g.dijkstra(0)

【问题讨论】:

  • 我认为这里的问题是你混淆了表示。您正在使用整数来表示顶点,但图形是按名称索引的,因此您需要以某种方式将它们关联起来。

标签: python algorithm graph


【解决方案1】:

改为使用字符串”

import sys 
  
class Graph(): 
  
  def __init__(self, vertices): 
    self.V = vertices 
    self.graph = {}
    
  def min_distance(self,distance,traversed):
    min_index = 0 
    min_value = sys.maxsize
    for i in self.graph:
      if traversed[i] is False and min_value > distance[i]:
        min_value = distance[i]
        min_index = i
    return min_index
    
  def dijkstra(self,source):
    distance={}
    traversed={}
    for i in self.graph:
        traversed[i] = False
        distance[i] = sys.maxsize
    distance[source] = 0
        
    for i  in self.graph:
      u = self.min_distance(distance,traversed)
      traversed[u] = True
      for v in self.graph[u]:               #ERROR
        if(traversed[v] is False):
          distance[v] = min(distance[v],distance[u]+self.graph[u][v])
    print("from the give source vertex -- > ",source)
    for vertex in self.graph:
      print("Vertex ",vertex," --> Distance = ",distance[vertex])
                
g  = Graph(19)

g.graph = {
    'College Square':{'Lewis Science Center':200, 'Prince Center':300},
    'Lewis Science Center':{'College Square':200, 'Speech Language Hearing':250, 'Computer Science':150},
    'Speech Language Hearing':{'Lewis Science Center':250, 'Burdick':100, 'Maintenance College':120},
    'Computer Science':{'Prince Center':80, 'Torreyson Library':40, 'Burdick':30, 'Lewis Science Center':150},
    'Burdick':{'Computer Science':30, 'Speech Language Hearing':100, 'Torreyson Library':80, 'Maintenance College':300, 'McALister Hall':200},
    'Prince Center':{'College Square':300, 'Computer Science':80, 'Torreyson Library':30, 'Police Dept.':100},
    'Torreyson Library':{'Prince Center':30, 'Computer Science':40, 'Burdick':80, 'Old Main':30},
    'Old Main':{'Torreyson Library':30, 'Police Dept.':200, 'Fine Art':90, 'McALister Hall':100},
    'Maintenance College':{'Speech Language Hearing':120, 'Burdick':300, 'McALister Hall':150, 'Wingo':100, 'New Business Building':150, 'Oak Tree Apt.':160},
    'Police Dept.':{'Prince Center':100, 'Old Main':200, 'Fine Art':50, 'Student Health Center':100},
    'Fine Art':{'Police Dept.':50, 'Old Main':90, 'McALister Hall':180, 'Student Center':80},
    'McALister Hall':{'Fine Art':180, 'Old Main':100, 'Burdick':200, 'Maintenance College':150, 'Wingo':50, 'Student Center':100},
    'Student Center':{'Fine Art':80, 'McALister Hall':100, 'Wingo':100, 'New Business Building':110, 'Student Health Center':50},
    'Wingo':{'Student Center':100, 'McALister Hall':50, 'Maintenance College':100, 'New Business Building':50},
    'Student Health Center':{'Police Dept.':100, 'Student Center':50, 'Brewer-Hegeman':200},
    'New Business Building':{'Student Center':110, 'Wingo':50, 'Maintenance College':150, 'Oak Tree Apt.':30, 'Brewer-Hegeman':20},
    'Oak Tree Apt.':{'Maintenance College':160, 'New Business Building':30, 'Brewer-Hegeman':40},
    'Brewer-Hegeman':{'Student Health Center':200, 'New Business Building':20, 'Oak Tree Apt.':40, 'Bear village Apt.':350},
    'Bear village Apt.':{'Brewer-Hegeman':350}

     }

g.dijkstra('College Square')

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2017-11-16
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多