第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

python dijkstra使用類實(shí)現(xiàn)算法可能出現(xiàn)的問題

python dijkstra使用類實(shí)現(xiàn)算法可能出現(xiàn)的問題

慕的地6264312 2023-09-19 17:27:38
所以我一直在嘗試用 python 創(chuàng)建一個(gè)圖形程序,其中包含 dfs、bfs 和 dijkstra 算法在其中實(shí)現(xiàn)的類,到目前為止已經(jīng)提出:class Vertex:    def __init__(self, name):        self.name = name        self.connections = {}    def addNeighbour(self, neighbour, cost):        self.connections[neighbour] = costclass Graph:    def __init__(self):        self.vertexs = {}    def addVertex(self, newVertex):        new = Vertex(newVertex)        self.vertexs[newVertex] = new    def addEdge(self, src, dest, cost):        self.vertexs[src].addNeighbour(self.vertexs[dest], cost)    def dfs(self, start, end, visited):        visited[start] = True        print(start, end=' ')        if start == end:            # End node found            return True        else:            # Use depth first search            for connection in graph.vertexs[start].connections:                if visited[connection.name] == False:                    if self.dfs(connection.name, end, visited) == True:                        # Return true to stop extra nodes from being searched                        return True    def bfs(self, start, end, visited, queue):        if len(queue) == 0:            # Queue is empty            queue.append(start)        visited[start] = True        currentNode = queue.pop(0)        print(currentNode, end=' ')        if start == end:            # End node found            return True        else:            # Do breadth first search            for connection in graph.vertexs[currentNode].connections:                if visited[connection.name] == False:                    # Queue all its unvisited neighbours                    queue.append(connection.name)            for newNode in queue:                self.bfs(newNode, end, visited, queue)但我認(rèn)為輸出似乎有問題。如果我想從節(jié)點(diǎn) 1 移動(dòng)到節(jié)點(diǎn) 0,當(dāng)前的輸出是:從節(jié)點(diǎn) 1 到節(jié)點(diǎn) 0 的 DFS 遍歷路徑: 1 6 2 0 從節(jié)點(diǎn) 1 到節(jié)點(diǎn) 0 的 BFS 遍歷路徑: 1 6 2 3 0 3 4 5 從節(jié)點(diǎn) 1 到 0 的最短可能路徑: 1 0 3 4 5 6 2 costing 10但是,我認(rèn)為輸出應(yīng)該是:從節(jié)點(diǎn) 1 到節(jié)點(diǎn) 0 的 DFS 遍歷路徑: 1 6 2 0 4 5 3 從節(jié)點(diǎn) 1 到節(jié)點(diǎn) 0 的 BFS 遍歷路徑: 1 6 2 3 0 4 5 從節(jié)點(diǎn) 1 到節(jié)點(diǎn) 0 的最短路徑: 1 6 2 0 costing 15任何人都可以看到這有什么問題嗎?
查看完整描述

1 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

您的代碼實(shí)際上存在幾個(gè)問題:

  1. 您需要指定您的 Djikstra 算法在哪里停止,在您的代碼中沒有提到什么是結(jié)束節(jié)點(diǎn)(在您的示例中它應(yīng)該是 0)

  2. 計(jì)算成本并cost = result[len(result) - 1]不能獲得字典中的最后一個(gè)元素(字典通常沒有排序,因此“最后一個(gè)元素”甚至不存在?。D鷳?yīng)該將成本檢索為cost = result[end],其中end是最終節(jié)點(diǎn),在您的示例中為 0。

  3. 您將該函數(shù)調(diào)用為result = graph.dijkstra(1, 0, graph.vertexs[2].connections, {}, {node: None for node in graphList}),但是,該函數(shù)的第三個(gè)參數(shù)應(yīng)該是初始節(jié)點(diǎn)的鄰居集,所以它應(yīng)該graph.vertexs[1].connections在您的情況下。

綜上所述,為了使代碼按預(yù)期工作,可以對函數(shù)進(jìn)行如下修改:

def dijkstra(self, current, currentDistance, distances, visited, unvisited, end):

    for neighbour, distance in distances.items():

        if neighbour.name not in unvisited:

            continue

        newDistance = currentDistance + distance

        if unvisited[neighbour.name] is None or unvisited[neighbour.name] > newDistance:

            unvisited[neighbour.name] = newDistance

    visited[current] = currentDistance


    if current == end:

      return visited


    del unvisited[current]

    if not unvisited:

        return True

    candidates = [node for node in unvisited.items() if node[1]]

    current, currentDistance = sorted(candidates)[0]

    

    self.dijkstra(current, currentDistance, graph.vertexs[current].connections, visited, unvisited, end)

    return visited

并按如下方式調(diào)用它:


print("Shortest possible path from node 1 to 0:")

start = 1

end = 0

result = graph.dijkstra(start, 0, graph.vertexs[start].connections, {}, {node: None for node in graphList}, end)

cost = result[end]

path = " ".join([str(arrInt) for arrInt in list(result.keys())])

print(path, "costing", cost)

通過這樣做,輸出變?yōu)?/p>


從節(jié)點(diǎn) 1 到 0 的最短路徑: 1 6 2 0 成本 15


查看完整回答
反對 回復(fù) 2023-09-19
  • 1 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號