Add Python notes
This commit is contained in:
122
python/графы/дейкстра.py
Executable file
122
python/графы/дейкстра.py
Executable file
@@ -0,0 +1,122 @@
|
||||
graph = {
|
||||
1: {
|
||||
2: 7,
|
||||
3: 9,
|
||||
6: 14
|
||||
},
|
||||
2: {
|
||||
1: 7,
|
||||
3: 10,
|
||||
4: 15
|
||||
},
|
||||
3: {
|
||||
1: 9,
|
||||
2: 10,
|
||||
4: 11,
|
||||
6: 2
|
||||
},
|
||||
4: {
|
||||
2: 15,
|
||||
3: 11,
|
||||
5: 6,
|
||||
},
|
||||
5: {
|
||||
4: 6,
|
||||
6: 9,
|
||||
},
|
||||
6: {
|
||||
1: 14,
|
||||
5: 9,
|
||||
3: 2
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class GraphPoint:
|
||||
def __init__(self, graph, number, routes):
|
||||
self.graph = graph
|
||||
self.number = number
|
||||
self.routes = routes
|
||||
self.visited = False
|
||||
self.minimum_range = 9999
|
||||
|
||||
|
||||
def get_unvisited_neighbours(self):
|
||||
neighbours = []
|
||||
for number in self.routes.keys():
|
||||
point = self.graph.get_point(number)
|
||||
if not point.visited:
|
||||
neighbours.append(point)
|
||||
return neighbours
|
||||
|
||||
|
||||
def get_range(self, point):
|
||||
return self.routes[point.number]
|
||||
|
||||
|
||||
def get_all_neighbours(self):
|
||||
neighbours = [self.graph.get_point(x) for x in self.routes.keys()]
|
||||
return neighbours
|
||||
|
||||
|
||||
|
||||
class Graph:
|
||||
def __init__(self, data):
|
||||
self.data = data
|
||||
self.points = {}
|
||||
|
||||
for number, routes in data.items():
|
||||
self.points[number] = GraphPoint(self, number, routes)
|
||||
|
||||
self.points[1].minimum_range = 0
|
||||
|
||||
|
||||
def get_point(self, number):
|
||||
point = self.points.get(number)
|
||||
|
||||
if point is None:
|
||||
raise ValueError(f"Graph has no point with number {number}")
|
||||
|
||||
return point
|
||||
|
||||
|
||||
|
||||
myGraph = Graph(graph)
|
||||
|
||||
|
||||
start = myGraph.get_point(1)
|
||||
queue = []
|
||||
queue.append(start)
|
||||
|
||||
|
||||
while len(queue) > 0:
|
||||
current_point = min(queue, key=lambda x: x.minimum_range)
|
||||
queue.remove(current_point)
|
||||
current_point.visited = True
|
||||
|
||||
for neighbour in current_point.get_unvisited_neighbours():
|
||||
new_range = current_point.minimum_range + current_point.get_range(neighbour)
|
||||
|
||||
if new_range < neighbour.minimum_range:
|
||||
neighbour.minimum_range = new_range
|
||||
|
||||
queue.append(neighbour)
|
||||
|
||||
|
||||
|
||||
path = []
|
||||
pos = myGraph.get_point(5)
|
||||
|
||||
|
||||
while pos != start:
|
||||
for neighbour in pos.get_all_neighbours():
|
||||
if neighbour.get_range(pos) + neighbour.minimum_range == pos.minimum_range:
|
||||
path.append(pos)
|
||||
pos = neighbour
|
||||
break
|
||||
|
||||
path.append(start)
|
||||
|
||||
for i in path[::-1]:
|
||||
print(i.number)
|
||||
# No comments here. Good l_ck!
|
||||
176
python/графы/поиск в глубину.py
Executable file
176
python/графы/поиск в глубину.py
Executable file
@@ -0,0 +1,176 @@
|
||||
# Матрица смежности
|
||||
# [y][x] - существование пути (ребра) из y в x (опционально - вместо существования bool вес int)
|
||||
# При нумерации с 1 при этом методе существует несоответствие номеров узлов и индексов (индекс = номер - 1)
|
||||
graph = (
|
||||
(0, 1, 1, 0, 0, 0, 1),
|
||||
(1, 0, 1, 1, 0, 0, 0),
|
||||
(1, 1, 0, 0, 0, 0, 0),
|
||||
(0, 1, 0, 0, 1, 0, 0),
|
||||
(0, 0, 0, 1, 0, 1, 0),
|
||||
(0, 0, 0, 0, 1, 0, 1),
|
||||
(1, 0, 0, 0, 0, 1, 0)
|
||||
)
|
||||
|
||||
|
||||
# Поиск в глубину
|
||||
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
|
||||
queue = [] # Список узлов, которые нужно посетить
|
||||
queue.append(0) # Стартовый узел
|
||||
|
||||
while len(queue): # Пока есть узлы, которые надо посетить
|
||||
node1 = queue.pop(-1)
|
||||
visited_nodes[node1] = 2
|
||||
|
||||
for node2 in range(6, -1, -1): # С последнего к первому. от 6 до 0 включительно
|
||||
if graph[node1][node2] == 1 and visited_nodes[node2] == 0: # Узел смежный и не обнаружен
|
||||
queue.append(node2)
|
||||
visited_nodes[node2] = 1
|
||||
|
||||
|
||||
# Поиск первого пути в невзвешенном графе (из точки 3 в 5)
|
||||
|
||||
class Edge:
|
||||
def __init__(self, begin, end):
|
||||
self.begin = begin
|
||||
self.end = end
|
||||
|
||||
def __str__(self):
|
||||
return f"Edge({self.begin + 1}, {self.end + 1})"
|
||||
|
||||
|
||||
def find_edges(graph, starting_point, stopping_point):
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
edges = []
|
||||
|
||||
queue = [] # Список узлов, которые нужно посетить
|
||||
queue.append(starting_point) # Стартовый узел
|
||||
while len(queue): # Пока есть узлы, которые надо посетить
|
||||
node1 = queue.pop(-1)
|
||||
visited_nodes[node1] = 2
|
||||
print('Checking node %s' % node1)
|
||||
|
||||
for node2 in range(6, -1, -1):
|
||||
print(f'Checking path to {node2}')
|
||||
if graph[node1][node2] == 1 and visited_nodes[node2] == 0: # Узел смежный и не обнаружен
|
||||
print('Path exists and is undetected. Saving')
|
||||
|
||||
queue.append(node2)
|
||||
visited_nodes[node2] = 1
|
||||
edges.append(Edge(node1, node2))
|
||||
|
||||
if node2 == stopping_point:
|
||||
print('Found stop, returning')
|
||||
return edges
|
||||
|
||||
return edges
|
||||
|
||||
|
||||
start = 2
|
||||
req = 4
|
||||
edges = find_edges(graph, start, req)
|
||||
|
||||
print('\nResulting list: ')
|
||||
for i in edges:
|
||||
print(i)
|
||||
|
||||
print("\nPath:")
|
||||
while len(edges):
|
||||
edge = edges.pop(-1)
|
||||
if edge.end == req:
|
||||
req = edge.begin
|
||||
print(edge)
|
||||
|
||||
|
||||
|
||||
# ==================================================================
|
||||
|
||||
|
||||
|
||||
# Список смежности
|
||||
# ключ - номер узла, значение - список узлов, с которыми есть связь
|
||||
print('\n\n\n\n\n\nСписок смежности')
|
||||
|
||||
graph = {
|
||||
1: (2, 3, 7),
|
||||
2: (1, 3, 4),
|
||||
3: (1, 2),
|
||||
4: (2, 5),
|
||||
5: (4, 6),
|
||||
6: (5, 7),
|
||||
7: (1, 6)
|
||||
}
|
||||
|
||||
|
||||
# Поиск в глубину
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
|
||||
queue = []
|
||||
queue.append(1)
|
||||
|
||||
while len(queue):
|
||||
node1 = queue.pop(-1)
|
||||
visited_nodes[node1 - 1] = 2
|
||||
|
||||
for node2 in graph.get(node1)[::-1]:
|
||||
# Проверка на смежность в этом методе не нужна, потому что в списке уже содержатся смежные узлы.
|
||||
if visited_nodes[node2 - 1] == 0:
|
||||
visited_nodes[node2 - 1] = 1
|
||||
queue.append(node2)
|
||||
|
||||
|
||||
|
||||
# Поиск первого пути в невзвешенном графе (из точки 3 в 5)
|
||||
|
||||
class Edge:
|
||||
def __init__(self, begin, end):
|
||||
self.begin = begin
|
||||
self.end = end
|
||||
|
||||
def __str__(self):
|
||||
return f"Edge({self.begin}, {self.end})"
|
||||
|
||||
|
||||
def find_edges(graph, starting_point, stopping_point):
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
|
||||
queue = []
|
||||
queue.append(starting_point)
|
||||
edges = []
|
||||
|
||||
while len(queue):
|
||||
node1 = queue.pop(-1)
|
||||
visited_nodes[node1 - 1] = 2
|
||||
print(f'Checking node {node1}')
|
||||
|
||||
for node2 in graph.get(node1)[::-1]:
|
||||
print(f'Checking existing path to {node2}')
|
||||
# Проверка на смежность в этом методе не нужна, потому что в списке уже содержатся смежные узлы.
|
||||
if visited_nodes[node2 - 1] == 0:
|
||||
print('Path is undetected. Saving')
|
||||
|
||||
visited_nodes[node2 - 1] = 1
|
||||
queue.append(node2)
|
||||
edges.append(Edge(node1, node2))
|
||||
|
||||
if node2 == stopping_point:
|
||||
print('Found stop, returning')
|
||||
return edges
|
||||
|
||||
return edges
|
||||
|
||||
|
||||
start = 3
|
||||
req = 5
|
||||
edges = find_edges(graph, start, req)
|
||||
print('\nResulting list: ')
|
||||
for i in edges:
|
||||
print(i)
|
||||
|
||||
print("\nPath:")
|
||||
while len(edges):
|
||||
edge = edges.pop(-1)
|
||||
if edge.end == req:
|
||||
req = edge.begin
|
||||
print(edge)
|
||||
178
python/графы/поиск в ширину.py
Executable file
178
python/графы/поиск в ширину.py
Executable file
@@ -0,0 +1,178 @@
|
||||
# Матрица смежности
|
||||
# [y][x] - существование пути (ребра) из y в x (опционально - вместо существования bool вес int)
|
||||
# При нумерации с 1 при этом методе существует несоответствие номеров узлов и индексов (индекс = номер - 1)
|
||||
graph = (
|
||||
(0, 1, 1, 0, 0, 0, 1),
|
||||
(1, 0, 1, 1, 0, 0, 0),
|
||||
(1, 1, 0, 0, 0, 0, 0),
|
||||
(0, 1, 0, 0, 1, 0, 0),
|
||||
(0, 0, 0, 1, 0, 1, 0),
|
||||
(0, 0, 0, 0, 1, 0, 1),
|
||||
(1, 0, 0, 0, 0, 1, 0)
|
||||
)
|
||||
|
||||
|
||||
# Поиск в ширину
|
||||
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
|
||||
queue = [] # Список узлов, которые нужно посетить
|
||||
queue.append(0) # Стартовый узел
|
||||
|
||||
while len(queue): # Пока есть узлы, которые надо посетить
|
||||
node1 = queue.pop(0)
|
||||
visited_nodes[node1] = 2
|
||||
|
||||
for node2 in range(7):
|
||||
if graph[node1][node2] == 1 and visited_nodes[node2] == 0: # Узел смежный и не обнаружен
|
||||
queue.append(node2)
|
||||
visited_nodes[node2] = 1
|
||||
|
||||
|
||||
|
||||
# Поиск кратчайшего пути в невзвешенном графе (из точки 3 в 5)
|
||||
|
||||
class Edge:
|
||||
def __init__(self, begin, end):
|
||||
self.begin = begin
|
||||
self.end = end
|
||||
|
||||
def __str__(self):
|
||||
return f"Edge({self.begin + 1}, {self.end + 1})"
|
||||
|
||||
|
||||
def find_edges(graph, starting_point, stopping_point):
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
edges = []
|
||||
|
||||
queue = [] # Список узлов, которые нужно посетить
|
||||
queue.append(starting_point) # Стартовый узел
|
||||
while len(queue): # Пока есть узлы, которые надо посетить
|
||||
node1 = queue.pop(0)
|
||||
visited_nodes[node1] = 2
|
||||
print('Checking node %s' % node1)
|
||||
|
||||
for node2 in range(7):
|
||||
print(f'Checking path to {node2}')
|
||||
if graph[node1][node2] == 1 and visited_nodes[node2] == 0: # Узел смежный и не обнаружен
|
||||
print('Path exists and is undetected. Saving')
|
||||
|
||||
queue.append(node2)
|
||||
visited_nodes[node2] = 1
|
||||
edges.append(Edge(node1, node2))
|
||||
|
||||
if node2 == stopping_point:
|
||||
print('Found stop, returning')
|
||||
return edges
|
||||
|
||||
return edges
|
||||
|
||||
|
||||
start = 2
|
||||
req = 4
|
||||
edges = find_edges(graph, start, req)
|
||||
|
||||
print('\nResulting list: ')
|
||||
for i in edges:
|
||||
print(i)
|
||||
|
||||
print("\nPath:")
|
||||
while len(edges):
|
||||
edge = edges.pop(-1)
|
||||
if edge.end == req:
|
||||
req = edge.begin
|
||||
print(edge)
|
||||
|
||||
|
||||
|
||||
|
||||
# ==================================================================
|
||||
|
||||
|
||||
|
||||
# Список смежности
|
||||
# ключ - номер узла, значение - список узлов, с которыми есть связь
|
||||
print('\n\n\n\n\n\nСписок смежности')
|
||||
|
||||
graph = {
|
||||
1: (2, 3, 7),
|
||||
2: (1, 3, 4),
|
||||
3: (1, 2),
|
||||
4: (2, 5),
|
||||
5: (4, 6),
|
||||
6: (5, 7),
|
||||
7: (1, 6)
|
||||
}
|
||||
|
||||
|
||||
# Поиск в ширину
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
|
||||
queue = []
|
||||
queue.append(1)
|
||||
|
||||
while len(queue):
|
||||
node1 = queue.pop()
|
||||
visited_nodes[node1 - 1] = 2
|
||||
|
||||
for node2 in graph.get(node1):
|
||||
# Проверка на смежность в этом методе не нужна, потому что в списке уже содержатся смежные узлы.
|
||||
if visited_nodes[node2 - 1] == 0:
|
||||
visited_nodes[node2 - 1] = 1
|
||||
queue.append(node2)
|
||||
|
||||
|
||||
|
||||
# Поиск кратчайшего пути в невзвешенном графе (из точки 3 в 5)
|
||||
|
||||
class Edge:
|
||||
def __init__(self, begin, end):
|
||||
self.begin = begin
|
||||
self.end = end
|
||||
|
||||
def __str__(self):
|
||||
return f"Edge({self.begin}, {self.end})"
|
||||
|
||||
|
||||
def find_edges(graph, starting_point, stopping_point):
|
||||
visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена
|
||||
|
||||
queue = []
|
||||
queue.append(starting_point)
|
||||
edges = []
|
||||
|
||||
while len(queue):
|
||||
node1 = queue.pop(0)
|
||||
visited_nodes[node1 - 1] = 2
|
||||
print(f'Checking node {node1}')
|
||||
|
||||
for node2 in graph.get(node1):
|
||||
print(f'Checking existing path to {node2}')
|
||||
# Проверка на смежность в этом методе не нужна, потому что в списке уже содержатся смежные узлы.
|
||||
if visited_nodes[node2 - 1] == 0:
|
||||
print('Path is undetected. Saving')
|
||||
|
||||
visited_nodes[node2 - 1] = 1
|
||||
queue.append(node2)
|
||||
edges.append(Edge(node1, node2))
|
||||
|
||||
if node2 == stopping_point:
|
||||
print('Found stop, returning')
|
||||
return edges
|
||||
|
||||
return edges
|
||||
|
||||
|
||||
start = 3
|
||||
req = 5
|
||||
edges = find_edges(graph, start, req)
|
||||
print('\nResulting list: ')
|
||||
for i in edges:
|
||||
print(i)
|
||||
|
||||
print("\nPath:")
|
||||
while len(edges):
|
||||
edge = edges.pop(-1)
|
||||
if edge.end == req:
|
||||
req = edge.begin
|
||||
print(edge)
|
||||
Reference in New Issue
Block a user