Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Алгоритмы поиска пути. От поиска в ширину до A

Содержание

Графы: основыГраф – множество вершин и ребер. Ребра соединяют между собой вершины.Графы бывают разные:Неориентированные и ориентированныеВзвешенные и невзвешенные.
Алгоритмы поиска путиОт поиска в ширину до A* Графы: основыГраф – множество вершин и ребер.	Ребра соединяют между собой вершины.Графы бывают Графы: примерыНеориентированный невзвешенныйОриентированный взвешенный Графы в играхТайловая сетка(tile map, grid) Графы в играхПолигональная карта(polygonal map) Графы в играхНавигационная сетка(navigation mesh) Графы в играхПочему тайловая сетка это граф? Поиск кратчайшего пути: задача	Есть вершина начала пути и вершина конца пути. Нужно Поиск кратчайшего пути: общие принципыРазбиваем клетки на два типа: посещенные и непосещенные.Постепенно Поиск кратчайшего пути: обзорПоиск в ширину(breadth-first search)Алгоритм Дейкстры(Dijkstra's algorithm)Поиск первого наилучшего(best-first search)A*(A star) Поиск в ширину: идеяРавномерно во все стороны расширяется радиус обхода.Посещенные вершины хранятся Поиск в ширину: демо Поиск в ширину: демо Поиск в ширину: демо Поиск в ширину: демо Поиск в ширину: кодПростейший вариант(инициализация)						frontier = Queue()			frontier.put(start)			visited = {}			visited[start] = True Поиск в ширину: кодПростейший вариант(алгоритм)			while not frontier.empty():				current = frontier.get()			for next in graph.neighbors(current):				if Поиск в ширину: кодЧтобы узнать, откуда пришли(инициализация)				frontier = Queue()			frontier.put(start) 			came_from = {}			came_from[start] = None Поиск в ширину: кодЧтобы узнать, откуда пришли (алгоритм)				while not frontier.empty():				current = frontier.get()			for Поиск в ширину: кодЧтобы узнать кол-во шагов (инициализация)				frontier = Queue()			frontier.put(start) 			distance = {}			distance[start] = 0 Поиск в ширину: кодЧтобы узнать кол-во шагов(алгоритм)		while not frontier.empty():			current = frontier.get()		for next Поиск в ширину: use casesОтметить все достижимые вершины из данной вершиныНайти пути Поиск в ширину: ограничения Алгоритм Дейкстры: идеяИсследуем вершины не равномерно, а ориентируясь на расстояние до начала Алгоритм Дейкстры: демо Алгоритм Дейкстры: демо Алгоритм Дейкстры: демо Алгоритм Дейкстры: демо Алгоритм Дейкстры: демо Алгоритм Дейкстры: кодfrontier = PriorityQueue()frontier.put(start,0)came_from = {}cost_so_far = {}came_from[start] = Nonecost_so_far[start] = 0 Алгоритм Дейкстры: код while not frontier.empty():	current = frontier.get()		for next in graph.neighbors(current):		new_cost = Алгоритм Дейкстры: use casesНайти кратчайший путь от одной вершины до многих других Алгоритм Дейкстры : ограниченияЕсли нужно найти путь до единственной вершины, исследуется слишком много клеток Поиск первого наилучшего: идеяИсследуем вершины, ориентируясь на расстояние до целиИспользуем эвристику(heuristic) Поиск первого наилучшего: демо Поиск первого наилучшего: демо Поиск первого наилучшего: демо Поиск первого наилучшего: демо Поиск первого наилучшего: кодfrontier = PriorityQueue()frontier.put(start, 0)came_from = {}came_from[start] = None Поиск первого наилучшего: код while not frontier.empty():	current = frontier.get()		for next in graph.neighbors(current):		new_cost Поиск первого наилучшего: use casesБыстро найти кратчайший путь от одной вершины до другой, когда нет препятствий Поиск первого наилучшего: ограничения Кратчайший путь не найден A*: идеяИсследуем вершины не равномерно, а ориентируясь на расстояние до начала поиска…И A*: демо A*: кодfrontier = PriorityQueue()frontier.put(start, 0)came_from = {}cost_so_far = {}came_from[start] = Nonecost_so_far[start] = 0 A*: код while not frontier.empty():	current = frontier.get()		for next in graph.neighbors(current):		new_cost = cost_so_far[current] A*: use casesБыстро найти кратчайший путь от одной вершины до другой, даже если есть препятствия A*: эвристикиЭвристики бывают разные. От выбора эвристики зависит корректность алгоритма и его быстрота.Манхэтонновское расстояние A*: эвристикиДиагональное расстояние A*: эвристикиЕвклидово расстояние Спасибо!
Слайды презентации

Слайд 2 Графы: основы
Граф – множество вершин и ребер.
Ребра соединяют

Графы: основыГраф – множество вершин и ребер.	Ребра соединяют между собой вершины.Графы

между собой вершины.
Графы бывают разные:
Неориентированные и ориентированные
Взвешенные и невзвешенные.


Слайд 3 Графы: примеры
Неориентированный невзвешенный
Ориентированный взвешенный

Графы: примерыНеориентированный невзвешенныйОриентированный взвешенный

Слайд 4 Графы в играх
Тайловая сетка(tile map, grid)

Графы в играхТайловая сетка(tile map, grid)

Слайд 5 Графы в играх
Полигональная карта(polygonal map)

Графы в играхПолигональная карта(polygonal map)

Слайд 6 Графы в играх
Навигационная сетка(navigation mesh)

Графы в играхНавигационная сетка(navigation mesh)

Слайд 7 Графы в играх
Почему тайловая сетка это граф?

Графы в играхПочему тайловая сетка это граф?

Слайд 8 Поиск кратчайшего пути: задача
Есть вершина начала пути и

Поиск кратчайшего пути: задача	Есть вершина начала пути и вершина конца пути.

вершина конца пути. Нужно найти кратчайший путь от начала

до конца.


Слайд 9 Поиск кратчайшего пути: общие принципы
Разбиваем клетки на два

Поиск кратчайшего пути: общие принципыРазбиваем клетки на два типа: посещенные и

типа: посещенные и непосещенные.
Постепенно посещаем клетки.
Изначально только стартовая клетка

посещена.

Слайд 10 Поиск кратчайшего пути: обзор
Поиск в ширину(breadth-first search)
Алгоритм Дейкстры(Dijkstra's algorithm)
Поиск

Поиск кратчайшего пути: обзорПоиск в ширину(breadth-first search)Алгоритм Дейкстры(Dijkstra's algorithm)Поиск первого наилучшего(best-first search)A*(A star)

первого наилучшего(best-first search)
A*(A star)


Слайд 11 Поиск в ширину: идея
Равномерно во все стороны расширяется

Поиск в ширину: идеяРавномерно во все стороны расширяется радиус обхода.Посещенные вершины

радиус обхода.

Посещенные вершины хранятся в очереди(queue).

Заканчиваем, когда очередь пуста(изначально

в очереди находится стартовая клетка).

Слайд 12 Поиск в ширину: демо

Поиск в ширину: демо

Слайд 13 Поиск в ширину: демо

Поиск в ширину: демо

Слайд 14 Поиск в ширину: демо

Поиск в ширину: демо

Слайд 15 Поиск в ширину: демо

Поиск в ширину: демо

Слайд 16 Поиск в ширину: код

Простейший вариант(инициализация)


frontier = Queue()
frontier.put(start)
visited =

Поиск в ширину: кодПростейший вариант(инициализация)						frontier = Queue()			frontier.put(start)			visited = {}			visited[start] = True

{}
visited[start] = True


Слайд 17 Поиск в ширину: код

Простейший вариант(алгоритм)


while not frontier.empty():
current =

Поиск в ширину: кодПростейший вариант(алгоритм)			while not frontier.empty():				current = frontier.get()			for next in

frontier.get()
for next in graph.neighbors(current):
if next not in visited:
frontier.put(next)
visited[next] =

True



Слайд 18 Поиск в ширину: код

Чтобы узнать, откуда пришли(инициализация)

frontier =

Поиск в ширину: кодЧтобы узнать, откуда пришли(инициализация)				frontier = Queue()			frontier.put(start) 			came_from = {}			came_from[start] = None

Queue()
frontier.put(start)
came_from = {}
came_from[start] = None




Слайд 19 Поиск в ширину: код

Чтобы узнать, откуда пришли (алгоритм)


while

Поиск в ширину: кодЧтобы узнать, откуда пришли (алгоритм)				while not frontier.empty():				current =

not frontier.empty():
current = frontier.get()
for next in graph.neighbors(current):
if next not

in came_from:
frontier.put(next)
came_from[next] = current


Слайд 21 Поиск в ширину: код

Чтобы узнать кол-во шагов (инициализация)

frontier

Поиск в ширину: кодЧтобы узнать кол-во шагов (инициализация)				frontier = Queue()			frontier.put(start) 			distance = {}			distance[start] = 0

= Queue()
frontier.put(start)
distance = {}
distance[start] = 0



Слайд 22 Поиск в ширину: код

Чтобы узнать кол-во шагов(алгоритм)


while not

Поиск в ширину: кодЧтобы узнать кол-во шагов(алгоритм)		while not frontier.empty():			current = frontier.get()		for

frontier.empty():
current = frontier.get()
for next in graph.neighbors(current):
if next not in

distance:
frontier.put(next)
distance[next] = distance[current] + 1




Слайд 24 Поиск в ширину: use cases
Отметить все достижимые вершины

Поиск в ширину: use casesОтметить все достижимые вершины из данной вершиныНайти

из данной вершины

Найти пути и расстояния до всех вершин

из данной вершины(просмотреть, что находится рядом с героем/монстром)

Слайд 25 Поиск в ширину: ограничения

Поиск в ширину: ограничения

Слайд 26 Алгоритм Дейкстры: идея
Исследуем вершины не равномерно, а ориентируясь

Алгоритм Дейкстры: идеяИсследуем вершины не равномерно, а ориентируясь на расстояние до

на расстояние до начала поиска

Посещенные вершины хранятся в очереди

с приоритетом(min priority queue) – чем меньше расстояние до вершины, тем больше ее приоритет. Т. е. тем раньше эта вершина будет исследована.






Слайд 27 Алгоритм Дейкстры: демо

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

Слайд 28 Алгоритм Дейкстры: демо

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

Слайд 29 Алгоритм Дейкстры: демо

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

Слайд 30 Алгоритм Дейкстры: демо

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

Слайд 31 Алгоритм Дейкстры: демо

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

Слайд 32 Алгоритм Дейкстры: код
frontier = PriorityQueue()
frontier.put(start,0)
came_from = {}
cost_so_far =

Алгоритм Дейкстры: кодfrontier = PriorityQueue()frontier.put(start,0)came_from = {}cost_so_far = {}came_from[start] = Nonecost_so_far[start] = 0

{}
came_from[start] = None
cost_so_far[start] = 0


Слайд 33 Алгоритм Дейкстры: код

while not frontier.empty():
current = frontier.get()

for

Алгоритм Дейкстры: код while not frontier.empty():	current = frontier.get()		for next in graph.neighbors(current):		new_cost

next in graph.neighbors(current):
new_cost = cost_so_far[current] + graph.cost(current, next)
if next

not in cost_so_far or new_cost < cost_so_far[next]:
cost_so_far[next] = new_cost
frontier.put(next, new_cost)
came_from[next] = current

Слайд 34 Алгоритм Дейкстры: use cases
Найти кратчайший путь от одной

Алгоритм Дейкстры: use casesНайти кратчайший путь от одной вершины до многих

вершины до многих других вершин во взвешенном графе

Когда нет

знания об общей структуре графа. Т. е. мы обладаем лишь локальной информацией о графе(вблизи каждой клетки)

Слайд 35 Алгоритм Дейкстры : ограничения
Если нужно найти путь до

Алгоритм Дейкстры : ограниченияЕсли нужно найти путь до единственной вершины, исследуется слишком много клеток

единственной вершины, исследуется слишком много клеток


Слайд 36 Поиск первого наилучшего: идея
Исследуем вершины, ориентируясь на расстояние

Поиск первого наилучшего: идеяИсследуем вершины, ориентируясь на расстояние до целиИспользуем эвристику(heuristic)

до цели

Используем эвристику(heuristic)


Слайд 37 Поиск первого наилучшего: демо

Поиск первого наилучшего: демо

Слайд 38 Поиск первого наилучшего: демо

Поиск первого наилучшего: демо

Слайд 39 Поиск первого наилучшего: демо

Поиск первого наилучшего: демо

Слайд 40 Поиск первого наилучшего: демо

Поиск первого наилучшего: демо

Слайд 41 Поиск первого наилучшего: код
frontier = PriorityQueue()
frontier.put(start, 0)
came_from =

Поиск первого наилучшего: кодfrontier = PriorityQueue()frontier.put(start, 0)came_from = {}came_from[start] = None

{}
came_from[start] = None



Слайд 42 Поиск первого наилучшего: код

while not frontier.empty():
current =

Поиск первого наилучшего: код while not frontier.empty():	current = frontier.get()		for next in

frontier.get()

for next in graph.neighbors(current):
new_cost = cost_so_far[current] + graph.cost(current, next)
if

next not in came_from:
priority = heuristic(goal, next)
frontier.put(next, priority)
came_from[next] = current

Слайд 43 Поиск первого наилучшего: use cases

Быстро найти кратчайший путь

Поиск первого наилучшего: use casesБыстро найти кратчайший путь от одной вершины до другой, когда нет препятствий

от одной вершины до другой, когда нет препятствий


Слайд 44 Поиск первого наилучшего: ограничения
Кратчайший путь не найден

Поиск первого наилучшего: ограничения Кратчайший путь не найден

Слайд 45 A*: идея
Исследуем вершины не равномерно, а ориентируясь на

A*: идеяИсследуем вершины не равномерно, а ориентируясь на расстояние до начала

расстояние до начала поиска…

И на расстояние до цели. Т.е.

используем эвристику.

Сочетание алгоритма Дейкстры и поиска первого наилучшего.

Слайд 46 A*: демо

A*: демо

Слайд 47 A*: код
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
cost_so_far =

A*: кодfrontier = PriorityQueue()frontier.put(start, 0)came_from = {}cost_so_far = {}came_from[start] = Nonecost_so_far[start] = 0

{}
came_from[start] = None
cost_so_far[start] = 0


Слайд 48 A*: код

while not frontier.empty():
current = frontier.get()

for next

A*: код while not frontier.empty():	current = frontier.get()		for next in graph.neighbors(current):		new_cost =

in graph.neighbors(current):
new_cost = cost_so_far[current] + graph.cost(current, next)
if next not

in cost_so_far or new_cost < cost_so_far[next]:
cost_so_far[next] = new_cost
priority = new_cost + heuristic(goal, next)
frontier.put(next, priority)
came_from[next] = current

Слайд 49 A*: use cases

Быстро найти кратчайший путь от одной

A*: use casesБыстро найти кратчайший путь от одной вершины до другой, даже если есть препятствия

вершины до другой, даже если есть препятствия


Слайд 50 A*: эвристики
Эвристики бывают разные. От выбора эвристики зависит

A*: эвристикиЭвристики бывают разные. От выбора эвристики зависит корректность алгоритма и его быстрота.Манхэтонновское расстояние

корректность алгоритма и его быстрота.






Манхэтонновское расстояние


Слайд 51 A*: эвристики






Диагональное расстояние

A*: эвристикиДиагональное расстояние

Слайд 52 A*: эвристики






Евклидово расстояние

A*: эвристикиЕвклидово расстояние

  • Имя файла: algoritmy-poiska-puti-ot-poiska-v-shirinu-do-a.pptx
  • Количество просмотров: 128
  • Количество скачиваний: 0