私は、DykstraのアルゴリズムのPython実装を書くことを試みている学生です。私はこの質問が100回前に尋ねられたことを知っていますが、私の状況についての詳細はいくつかありますが、私は完全に理解していません。pythonでdijkstraのアルゴリズムを使って3次元のリストをどのように実行しますか?
私は10ノードの重み付け無向グラフを持っています。私の実際のグラフにはさらに多くのノードがあります。グラフは3次元のリストとしてソートされます。グラフを生成するために書き込んだプログラムの出力を貼り付けています。
`こんにちは。私はDykstraのアルゴリズムのPython実装を書こうとしている(試みている)学生です。私はこの質問が100回前に尋ねられたことを知っていますが、私の状況についての詳細はいくつかありますが、私は完全に理解していません。
私は10ノードの重み付け無向グラフを持っています。私の実際のグラフにはさらに多くのノードがあります。グラフは3次元のリストとしてソートされます。グラフを生成するために書き込んだプログラムの出力を貼り付けています。
Node 1 : [[8, 3], [9, 11], [2, 12], [3, 12], [7, 6]]
Node 2 : [[5, 6], [4, 3], [1, 12], [8, 11], [7, 1]]
Node 3 : [[6, 2], [1, 12], [5, 7], [9, 1]]
Node 4 : [[2, 3], [8, 2], [10, 5], [5, 10], [7, 4]]
Node 5 : [[2, 6], [4, 10], [3, 7], [7, 8]]
Node 6 : [[3, 2], [9, 10]]
Node 7 : [[2, 1], [4, 4], [5, 8], [1, 6], [8, 3]]
Node 8 : [[1, 3], [2, 11], [4, 2], [7, 3], [10, 4]]
Node 9 : [[1, 11], [6, 10], [3, 1]]
Node 10 : [[4, 5], [8, 4]]
グラフは、3次元のリストとして保存されます。たとえば、インデックス0では、ノード8,9,2,3と7への接続があります。ノード8と0の間の重みは3です。ノード0と9と11の間の重みです。 。 [[8,3]、[9,11]、[2,12]、[3,12]、[7,6]]、[[5,6]、[4,3])[0126] ]、[1,12]、[8,11]、[7,1]]、[[6,2]、[1,12]、[5,7]、[9,1]]、[[2 3]、[8,2]、[10,5]、[5,10]、[7,4]]、[[2,6]、[4,10]、[3,7]、[7 、[8]、[[3,2]、[9,10]]、[[2,1]、[4,4]、[5,8]、[1,6]、[8,3]] [[1,3]、[2,1]、[4,2]、[7,3]、[10,4]]、[[1,11]、[6,10]、[3,1
したがって、課題は入力としてリストを受け入れる最適なルートを出力するdykstraのPython実装を見つけることです。ほとんどのグラフは辞書のデータ型の周りに構築されているようですが、それは私の状況ではありません。
3Dリストを使用して私自身のバージョンのdijkstraを書き始めようとしましたが、運が足りませんでした。また、私はPythonでdijkstraのアルゴリズムの以前に投稿されたバージョンを使用しようとしましたが、三次元のリストではなく辞書を実行するように設計されています。ここに私の以前の試みがあります。
[[[4, 2], [2, 1], [3, 4]], [[1, 1], [4, 2], [3, 4]], [[1, 4], [2, 4],
[4, 4]], [[1, 2], [2, 2], [3, 4]]]
class Graph:
def __init__(self):
self.nodes = set()
self.edges = defaultdict(list)
self.distances = {}
def add_node(self, value):
self.nodes.add(value)
def add_edge(self, from_node, to_node, distance):
self.edges[from_node].append(to_node)
self.edges[to_node].append(from_node)
self.distances[(from_node, to_node)] = distance
def dijsktra(graph, initial):
visited = {initial: 0}
path = {}
nodes = set(graph.nodes)
while nodes:
min_node = None
for node in nodes:
if node in visited:
if min_node is None:
min_node = node
elif visited[node] < visited[min_node]:
min_node = node
if min_node is None:
break
nodes.remove(min_node)
current_weight = visited[min_node]
for edge in graph.edges[min_node]:
weight = current_weight + graph.distance[(min_node, edge)]
if edge not in visited or weight < visited[edge]:
visited[edge] = weight
path[edge] = min_node
return visited, path
私はしばらくの間、これで苦労してきたように私は本当に、誰も私に与えることができる任意のヘルプを大幅に感謝することでしょう。ありがとうございました!
これは、各ノードでペアのリストを持つ通常のdjikstraの実装です。 – Debabrata
既存の実装を使用して、その実装が期待するものにデータ構造を変換するのが最も簡単かもしれません。 – schwobaseggl
投稿を更新して、これまでに試行したこと、具体的にどの問題が実行されているかを表示できますか? –