Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/55: Рейтинг темы: голосов - 55, средняя оценка - 4.64
7 / 7 / 1
Регистрация: 07.11.2017
Сообщений: 86
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане!
Подскажите пожалуйста, почему у меня пустой результат Код исполняет без ошибок.
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
Ответы с готовыми решениями:

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

Алгоритм Дейкстры
В сказочном королевстве N городов. Некоторые пары городов соединены по дорогам, причем одну и ту же...

Алгоритм Дейкстры
Как реализовать алгоритм Дейкстры D = , , , , , , , , ...

Алгоритм Дейкстры (объяснение)
Вот код, который реализует данный алгоритм, помогите пожалуйста разобраться в нём (кто может...

Поиск в глубину. Поиск кратчайшего пути на взвешенном графе (Алгоритм Дейкстры)
Плз.Нужна помощь в проверке кода. Найти количество путей между двумя вершинами в некотором графе...

3
636 / 476 / 179
Регистрация: 28.05.2012
Сообщений: 1,414
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
636 / 476 / 179
Регистрация: 28.05.2012
Сообщений: 1,414
06.12.2017, 18:29 4
Лучший ответ Сообщение было отмечено dmake как решение

Решение

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

Алгоритм Дейкстры python
Здраствуйте господа . Требуется помощь в написании кода на питоне по алгоритму Дейкстры. Вот мои...

Реализовать алгоритм Дейкстры
Помогите реализовать алгоритм Дейкстры для этой задачи https://habr.com/ru/post/111361/ Вот...

Проблема с реализацией алгоритма Дейкстры
Почему кроатчайший путь в выводе равен 50, хотя должен быть равен 60? # graph graph = {}...

Алгоритм Дейкстры, Алгоритм Беллмана Форда
Нужна программа win forms с реализацией этих двух алгоритмов

Алгоритм Дейкстры
Привет! Кто нибудь может помочь с подобным делом: Используя алгоритм Дейкстры найти длины...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru