7 / 7 / 1
Регистрация: 07.11.2017
Сообщений: 86
1

Алгоритм Дейкстры

06.12.2017, 11:48. Показов 9418. Ответов 3
Метки нет (Все метки)

Добрый день, уважаемые форумчане!
Подскажите пожалуйста, почему у меня пустой результат Код исполняет без ошибок.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from collections import defaultdict
 
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.distances[(from_node, to_node)] = distance
 
def dijkstra(graph, initial):
    visited = {initial: 0}
    path = defaultdict(list)
 
    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.distances[(min_node, edge)]
            if edge not in visited or weight < visited[edge]:
                visited[edge] = weight
                path[edge].append(min_node)
 
    g = Graph()
 
    g.add_node('A')
    g.add_node('B')
    g.add_node('C')
    g.add_node('D')
    g.add_node('E')
    g.add_node('F')
    g.add_node('G')
 
    g.add_edge('A','B',12)
    g.add_edge('A','C',7)
    g.add_edge('B','D',1)
    g.add_edge('B','A',12)
    g.add_edge('D','E',8)
    g.add_edge('C','F',3)
    g.add_edge('D','G',5)
    g.add_edge('F','B',1)
    g.add_edge('F','G',2)
    g.add_edge('C','D',13)
    g.add_edge('E','B',6)
 
    print(dijkstra(g, 'A')['B'])
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2017, 11:48
Ответы с готовыми решениями:

Алгоритм Дейкстры
можете описать работу алгоритма Дейкстры , на примере данной задачи ? не могу понять , как...

Алгоритм Дейкстры
Помогите доделать алгоритм Дейкстри.Проблема в том что надо сделать так что бы выводило к каждой...

Алгоритм Дейкстры
Проверте пожалуйста задачу: Воспользовавшись алгоритмом Дейкстры рассчитать минимальный путь от...

Алгоритм Дейкстры
Всем доброго дня! Столкнулся с проблемой, никак не могу понять, как лучше реализовать алгоритм...

3
625 / 466 / 178
Регистрация: 28.05.2012
Сообщений: 1,394
06.12.2017, 12:26 2
на глаз в 4, 20 строке ошибка и лишние отступы после 42
0
7 / 7 / 1
Регистрация: 07.11.2017
Сообщений: 86
06.12.2017, 14:34  [ТС] 3
Цитата Сообщение от Vigi Посмотреть сообщение
на глаз в 4, 20 строке ошибка и лишние отступы после 42
Поправил отступы и пошли ошибки. Компилятор указывает на 20 строку, но что не так? Ведь я множеству Graph.nodes, которое ранее обозначил частью Графа в строчке 4 присваиваю значение nodes. Что не так?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from collections import defaultdict
 
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.distances[(from_node, to_node)] = distance
 
def dijkstra(graph, initial):
    visited = {initial: 0}
    path = defaultdict(list)
 
    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.distances[(min_node, edge)]
            if edge not in visited or weight < visited[edge]:
                visited[edge] = weight
                path[edge].append(min_node)
 
g = Graph()
g.add_node('A')
g.add_node('B')
g.add_node('C')
g.add_node('D')
g.add_node('E')
g.add_node('F')
g.add_node('G')
g.add_edge('A','B',12)
g.add_edge('A','C',7)
g.add_edge('B','D',1)
g.add_edge('B','A',12)
g.add_edge('D','E',8)
g.add_edge('C','F',3)
g.add_edge('D','G',5)
g.add_edge('F','B',1)
g.add_edge('F','G',2)
g.add_edge('C','D',13)
g.add_edge('E','B',6)
print(dijkstra(g, 'A')['B'])
Добавлено через 33 минуты
Поковырялся еще немного, теперь выпадает ошибка: TypeError: 'NoneType' object is not subscriptable к 65 строке.
Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from collections import defaultdict
 
 
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.distances[(from_node, to_node)] = distance
 
 
def dijkstra(Graph, initial):
    visited = {initial: 0}
    path = defaultdict(list)
 
    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.distances[(min_node, edge)]
            if edge not in visited or weight < visited[edge]:
                visited[edge] = weight
                path[edge].append(min_node)
 
 
g = Graph()
g.add_node('A')
g.add_node('B')
g.add_node('C')
g.add_node('D')
g.add_node('E')
g.add_node('F')
g.add_node('G')
g.add_edge('A', 'B', 12)
g.add_edge('A', 'C', 7)
g.add_edge('B', 'D', 1)
g.add_edge('B', 'A', 12)
g.add_edge('D', 'E', 8)
g.add_edge('C', 'F', 3)
g.add_edge('D', 'G', 5)
g.add_edge('F', 'B', 1)
g.add_edge('F', 'G', 2)
g.add_edge('C', 'D', 13)
g.add_edge('E', 'B', 6)
print(dijkstra(g, 'A')['C'])
Ошибка в последней строчке. Глаз уже замылен - подскажите пожалуйста, что делаю не так.
0
625 / 466 / 178
Регистрация: 28.05.2012
Сообщений: 1,394
06.12.2017, 18:29 4
Лучший ответ Сообщение было отмечено dmake как решение

Решение

у вас функция dijkstra что возвращает? None? а в еще хотите к None обратится по индексу...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2017, 18:29
Помогаю со студенческими работами здесь

Алгоритм Дейкстры
помогите, пожалуйста! По системе двусторонних дорог определить, есть ли в ней город, из которого...

алгоритм Дейкстры
please

Алгоритм Дейкстры
Представлена сеть , где показатели на дугах отражают время в минутах ,требующееся для проезда от...

Алгоритм Дейкстры
Код был взят с плюсов и переписан на шарп public i=3; public int v; private void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru