Проблема с поиском единой стоимости на карте Румынии

#python

#python

Вопрос:

Я написал этот код. Это код поиска единой стоимости. Я должен найти путь между Арадом и Бухарестом. Моя проблема в том, что мой код выдает правильную общую стоимость, которая равна 418. Но я не могу понять, как найти путь, который дает эту стоимость. Любая помощь приветствуется. из очереди импортируйте PriorityQueue

 class Graph:
    def __init__(self):
        self.edges={"Arad":["Zerind","Timisoara","Sibiu"],"Zerind":["Oradea"],"Oradea":["Sibiu"],"Timisoara":["Lugoj"],"Lugoj":["Mehadia"],"Mehadia":["Dobreta"],"Dobreta":["Craiova"],"Sibiu":["Fagaras","RimnicuVilcea"],"Craiova":["RimnicuVilcea","Pitesti"],"RimnicuVilcea":["Craiova","Pitesti"],"Fagaras":["Bucharest"],"Pitesti":["Bucharest"],"Bucharest":["Giurgiu","Urziceni"],"Urziceni":["Hirsova","Vaslui"],"Hirsova":["Eforie"],"Vaslui":["Lasi"],"Lasi":["Neamt"]}
        self.weights={"AradZerind":75,"ZerindOradea":71,"AradTimisoara":118,"TimisoaraLugoj":111,"LugojMehadia":70,"MehadiaDobreta":75,"AradSibiu":140,"OradeaSibiu":151,"DobretaCraiova":120,"CraiovaRimnicuVilcea":146,"CraiovaPitesti":138,"SibiuFagaras":99,"SibiuRimnicuVilcea":80,"RimnicuVilceaPitesti":97,"RimnicuVilceaCraiova":146,"FagarasBucharest":211,"PitestiBucharest":101,"BucharestGiurgiu":90,"BucharestUrziceni":85,"UrziceniHirsova":98,"HirsovaEforie":86,"UrziceniVaslui":142,"VasluiLasi":92,"LasiNeamt":87}
    def neighbors(self,node):
        return self.edges[node]
    def get_cost(self,from_node,to_node):
        return self.weights[(from_node   to_node)]



def ucs(graph, start, goal):
    global total_cost
    visited = set()
    path=[]
    queue = PriorityQueue()
    queue.put((0, start))
    while queue:
        cost, node = queue.get()
        if node not in visited:
            visited.add(node)
            if node == goal:
                return visited
            for i in graph.neighbors(node):
                if i not in visited:
                    total_cost = cost   graph.get_cost(node, i)
                    queue.put((total_cost, I)


graph=Graph()
s=ucs(graph,"Arad","Bucharest")
print(s)
  

Ответ №1:

Вы можете использовать инициализацию вашей (приоритетной) очереди следующим образом:

 queue = PriorityQueue()
queue.put([0,[start]])
  

Здесь start приведен кортеж, представляющий начальное состояние или все, что вы хотите представить по-своему.

Затем распакуйте его внутри while цикла:

 cost,path = queue.get()
x,y=path[-1]
  

Вам не нужно заранее определять path var.

Когда целевое состояние достигнуто, вместо возврата стоимости просто выведите (cost) или любой другой параметр, который вы хотите напечатать, и верните путь:

 x,y=path[-1]
  

И, чтобы обновить ее, когда мы просматриваем список смежности каждого узла, вы можете сделать это:

 queue.put([costx,path   [(x2, y2)]]) 
  

Если вы хотите отслеживать многие вещи, вы можете сохранить это внутри ‘PriorityQueue() (вашей очереди).

Я могу добавить код, если вы хотите, но, возможно, в этом не будет необходимости.