Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
1

Динамический граф, поиск в ширину

29.04.2014, 20:57. Показов 6340. Ответов 4
Метки нет (Все метки)

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
66
67
68
69
70
71
72
73
74
mark_list = []  # список вершин, в которых мы уже были
queue_list = []  # очередь, т.е. список вершин. которые нам нужно посмотреть
path_list = [] # типа "путь" от вершины А к Б
 
class prpr:
    
    def __init__(self, name):
        self.listvertex = []  # список вершин, которые соединены с этой вершиной
        self.name = name # имя вершины
 
def add_vertex (self, graph_obj): # ф-я добавление вершины
    self.listvertex.append(graph_obj)  
    
      
def search_vertex(self, search_graph_obj): # ф-я поиска в ширину
    find_vertex =  search_graph_obj in self.listvertex
    if (self.name != search_graph_obj.name):
        mark_list.append(self)
        while len(queue_list) != 0:
            queue_list.pop(0)
            if len(self.listvertex) != 0:
                for i in self.listvertex:
                    queue_list.append(i)
                while len(queue_list) != 0 and queue_list[0] in mark_list:
                    queue_list.pop(0)
                if len(queue_list) != 0:
                    search_vertex(queue_list[0], search_graph_obj)
            else:
                break
    else:
        queue_list.pop(0)
    if len(path_list) != 0 and path_list[len(path_list)-1] in self.listvertex:
        path_list.append(self)
    if find_vertex == True:
        path_list.append(self)
 
 
        
 
 
# просто сделал граф  в ручную и проверил его    
 
sd = prpr("sd")
print (sd.name)
 
qw = prpr("qw")
add_vertex(sd,qw)
 
#qwt = prpr("qwt")
#add_vertex(sd,qwt)
 
##dffa = prpr("dffa")
#add_vertex(qwt,dffa)
 
we = prpr("we")
add_vertex(qw,we)
 
df = prpr("df")
add_vertex(qw,df)
 
wer = prpr("wer")
add_vertex(df,wer)
 
#dff = prpr("dff")
#add_vertex(wer,dff)
 
#add_vertex(dffa,dff)
#add_vertex(we,wer)
 
queue_list.append(sd)
search_vertex(sd, wer)
 
#mark_list.clear() 
#queue_list.clear()
но вот с путём что-то не так.
Не могу придумать что и как там отслеживать, чтобы корректный путь записать.

Добавлено через 5 часов 50 минут
update
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2014, 20:57
Ответы с готовыми решениями:

Бинарное дерево. Граф. Поиск в ширину
Помогите интернет-магазину! Магазин имеет связь с социальной сетью, и когда кто-то покупает в ней...

Граф. Поиск в ширину
Добрый день! Помогите, пожалуйста, выполнить поиск в ширину из вершины V11 ...

Поиск в ширину. Граф.
Здравствуйте, собственно задача: в графе найти кратчайший путь от А до B. На основе FAQ'ка...

Бинарное дерево. Граф. Поиск в ширину
Реализуйте бинарное дерево поиска. А также методы добавления в него определенного значения, и...

Обойти граф в ширину
граф представить в виде: Списка инцидентности обойти граф: в ширину 1)В вершины графа записать...

4
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
01.05.2014, 18:30  [ТС] 2
update
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
02.05.2014, 17:58 3
Лучший ответ Сообщение было отмечено YYwww как решение

Решение

Что-то тут слишком запутанно... Мой вариант:
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
from collections import deque
    
def build_path(src, dst, prev):
    path = [dst]
    cur = dst
    while cur is not src:
        cur = prev[cur]
        path.append(cur)
    return reversed(path)
 
def bfs(src, dst=None):
    queue = deque((src, ))
    previous = {src: None}
    while len(queue) != 0:
        cur = queue.popleft()
        for v in cur.listvertex:
            if v not in previous:
                previous[v] = cur
                queue.append(v)
                if v is dst:
                    return previous
    return previous
 
...
for v in build_path(sd, wer, bfs(sd, wer)):
    print v.name
2
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
02.05.2014, 23:36  [ТС] 4
объясните мне только что такое:

что тут подключили?
Python
1
from collections import deque
эта функция (вкратце) что делает?
Python
1
def bfs(src, dst=None):
и для чего эта переменная?
Python
1
previous

Буду разбирать ваш код
огромное Вам спасибо!
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
03.05.2014, 10:31 5
https://docs.python.org/2/libr... ue-objects
В общем-то для очереди можно использовать и list, но это неоптимально, так как это по сути непрерывный массив, и при удалении элемента из него приходится сдвигать все последующие. А deque (double-ended queue) как раз для таких вещей подходит.
bfs (breadth-first search) непосредственно осуществляет поиск в ширину из вершины src, возвращает previous; если ещё указать dst, то поиск остановится, когда доходит до dst.
previous[v] - последняя вершина пути от src к v.
1
03.05.2014, 10:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2014, 10:31
Помогаю со студенческими работами здесь

Бінарне дерево. Граф. Пошук в ширину
Допоможіть інтернет-крамниці! Крамниція має звязок з соціальною мережею, і коли хотось купує в ній...

Ориентированный граф + обход в глубину и ширину
1. Задана матрица смежности или инцидентности (по выбору). 2. Построить граф, каждый элемент...

Обойти граф в ширину и прочитать текст в вершинах графа
Рализовать с помощью списка инцедентности граф из 10 вершин(в которых записаны буквы фамилии и...

Создать класс реализующий граф,сделать его обход в ширину
Задание следующее: задать класс, реализующий граф( из списка ребер в матрицу инцидентности) и...

Построить граф, применить к нему алгоритмы поиска в ширину и глубину
Построить свой смешанный (который имеет ориентированные и неориентированные ребра) граф (не менее...

Поиск в ширину (Обход в ширину)
Напишите, пожалуйста, реализацию bfs в с++ и объясните что к чему


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

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