Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере? / 11 сообщений из 11, страница 1 из 1
14.04.2012, 12:05
    #37753851
ModAStar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
Основное условие, линии должны быть по максимуму "горизонтально-вертикальными", никаких диагональных или кривых линий.
Мой модифицированный алгоритм прокладывает путь, как показано красным цветом на рисунке.

А как сделать эвристику такой, чтобы он шёл, как показано синей линий? Что мне учесть и в какой последовательности? Этот путь визуально лучше и, возможно, оптимальнее.

Спасибо за ответы.
...
Рейтинг: 0 / 0
14.04.2012, 13:24
    #37753894
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
ModAStar,

держаться не ближе по вертикали
держаться не ближе по горизонтали
длина пути = длина по вертикали + длина по горизонтали
не ломать путь, если есть путь той же длины в прежнем направлении
...
Рейтинг: 0 / 0
15.04.2012, 17:44
    #37754615
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
2 ModAStar:

Во-первых, A* -- это алгоритм поиска пути на графе . Я вот гляжу на вашу картинку и не вижу, где здесь граф. Где старт, где финиш? (смутно догадываюсь, где, но не уверен, что правильно) Где препятствия?

(Если надо добавить текстовые пояснения прямо на картинку, то можно поступить следующим образом. Берём Inkscape , вставляем эту картинку (Файл > Импортировать...), добавляем надписи со стрелочками, сохраняем всё в новую png-картинку (Файл > Экспортировать в растр...). И хорошо бы пожать получившуюся png-картинку PNGOUT -ом, он не искажает цвета, а только оптимизирует сжатие.)

Во-вторых, A* пытается найти кратчайший путь, а вы уверены, что синий путь короче красного?
...
Рейтинг: 0 / 0
15.04.2012, 17:50
    #37754618
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
ModAStar,

На каком основании алгоритм должен пойти по синей линии? Т.е. сначала заметно отдалиться от "пункта назначения" в противоположную сторону (влево), а потом так же пойти фиг знает куда вниз?
...
Рейтинг: 0 / 0
16.04.2012, 01:10
    #37754904
ModAStar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
Спасибо за ответы.

Я забыл написать кратко описание задачи. Есть два прямоугольника + препятсвия. Каждый из них имеет 4 точки соединения: левую, верхнюю, правую, нижнюю. Нужно соединить прямоугольники "горизонтально-вертикальными" линиями от одной точки к другой, обходя препятсвия.

Aleksandr Sharahov:
Практически Ваши предложения включены в функции вычисления веса точки. Только вот посленее (не ломать путь, если есть путь той же длины в прежнем направлении) пока не уверен, что знаю как реализовать.

Пётр Седов:
1. Ну графа нет, но есть инкапсулированный двумерный масив точек, Открытый и Закрытый списки, как в описании алгоритма. Считайте левую содинительную точку прямоугольника началом и нижнюю правого - концом.
2. Синий путь, конечно же, не кратчайший. Но так и A* ищет кратчайший путь зависимо от заданной эвристики. Потому и он и есть относительно кратчайшим.

Edd.Dragon:
Как-то так, красочно Вы описали принцим работы искомого алгоритма. )
Но да.
...
Рейтинг: 0 / 0
16.04.2012, 01:33
    #37754916
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
ModAStarEdd.Dragon:
Как-то так, красочно Вы описали принцим работы искомого алгоритма. )
Но да.

Ну я вижу его реализацию примерно так:

1. Сначала надо таки добиться, чтобы линия не ломалась, когда в этом нет смысла (т.е. не стремилась подобраться к конечной координате как можно раньше).

2. После этого обрамляем исходные прямоугольники желаемым "паддингом" (делаем их больше) и уже от них строим линию.
3. Паддинги убираются, добавляются 2 недостающих сегмента и вуаля:



Паддинги можно как встроить в алгоритм создании линии, так и подсовывать ему увеличенные прямоугольники.
...
Рейтинг: 0 / 0
16.04.2012, 03:39
    #37754948
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
2 ModAStar:

ModAStarЕсть два прямоугольника + препятсвия.
Какую форму имеют препятствия -- прямоугольники (выровненные по осям), выпуклые многоугольники, произвольные многоугольники? Препятствие может пересекаться со стартовым/финишным прямоугольником? С другими препятствиями? Можно идти прямо по краю препятствия (вплотную), или лучше держаться поодаль?

ModAStarНу графа нет, но есть инкапсулированный двумерный масив точек,
Множество точек жёстко задано условием задачи, или введено искусственно, просто чтобы был граф для алгоритма A*? (который всегда работает на графе, даже если у вас в программе отсутствует класс Graph) Когда поворачиваем на 90 градусов, можно это делать в местах с произвольными вещественными координатами x, y? (если да, то получается поиск пути в непрерывном пространстве, и можно подумать об алгоритме, который не будет искусственно сводить его к дискретному пространству)
...
Рейтинг: 0 / 0
17.04.2012, 00:10
    #37756300
ModAStar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
Edd.DragonModAStarEdd.Dragon:
Как-то так, красочно Вы описали принцим работы искомого алгоритма. )
Но да.

Ну я вижу его реализацию примерно так:

1. Сначала надо таки добиться, чтобы линия не ломалась, когда в этом нет смысла (т.е. не стремилась подобраться к конечной координате как можно раньше).

2. После этого обрамляем исходные прямоугольники желаемым "паддингом" (делаем их больше) и уже от них строим линию.
3. Паддинги убираются, добавляются 2 недостающих сегмента и вуаля:



Паддинги можно как встроить в алгоритм создании линии, так и подсовывать ему увеличенные прямоугольники.

Спасибо за идею, рациональное зерно здесь есть.

Пётр Седов2 ModAStar:

ModAStarЕсть два прямоугольника + препятсвия.
Какую форму имеют препятствия -- прямоугольники (выровненные по осям), выпуклые многоугольники, произвольные многоугольники? Препятствие может пересекаться со стартовым/финишным прямоугольником? С другими препятствиями? Можно идти прямо по краю препятствия (вплотную), или лучше держаться поодаль?

ModAStarНу графа нет, но есть инкапсулированный двумерный масив точек,
Множество точек жёстко задано условием задачи, или введено искусственно, просто чтобы был граф для алгоритма A*? (который всегда работает на графе, даже если у вас в программе отсутствует класс Graph) Когда поворачиваем на 90 градусов, можно это делать в местах с произвольными вещественными координатами x, y? (если да, то получается поиск пути в непрерывном пространстве, и можно подумать об алгоритме, который не будет искусственно сводить его к дискретному пространству)

Препятствие может быть практически любой формы.

Множество точек сгенерировано искуственно под A*. Посему, если поделитесь каким-то более походящим алгоритмом, буду безмерно благодарен.
...
Рейтинг: 0 / 0
18.04.2012, 03:36
    #37758306
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
2 ModAStar:

Может быть не колдовать с эвристикой алгоритма A*, а преобразовать полученный путь, чтобы в нём было как можно меньше поворотов на 90 градусов? (см. приложенную картинку)

ModAStarПрепятствие может быть практически любой формы.

Множество точек сгенерировано искуственно под A*. Посему, если поделитесь каким-то более походящим алгоритмом, буду безмерно благодарен.
Раз вам нужен путь, состоящий из строго горизонтальных/вертикальных отрезков, то дискретный способ (граф точек на регулярной сетке) может быть даже лучше, чем возиться с непрерывным пространством, где препятствия произвольной формы.
...
Рейтинг: 0 / 0
18.04.2012, 10:51
    #37758585
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
и не знал что есть какие то алгоритмы - обходишь, что бы пересечений было мало и ладно
...
Рейтинг: 0 / 0
26.04.2012, 04:08
    #37771528
ModAStar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере?
Пётр Седов2 ModAStar:

Может быть не колдовать с эвристикой алгоритма A*, а преобразовать полученный путь, чтобы в нём было как можно меньше поворотов на 90 градусов? (см. приложенную картинку)

ModAStarПрепятствие может быть практически любой формы.

Множество точек сгенерировано искуственно под A*. Посему, если поделитесь каким-то более походящим алгоритмом, буду безмерно благодарен.
Раз вам нужен путь, состоящий из строго горизонтальных/вертикальных отрезков, то дискретный способ (граф точек на регулярной сетке) может быть даже лучше, чем возиться с непрерывным пространством, где препятствия произвольной формы.
Да, я генерирую дискретное множество, с ним и работаю.
За идею упрощения отрезков, используя количество поворотов, спасибо, использовал в А*, работает отлично. ;)

Всем спасибо за обсуждение. Алгоритм практически готов на 95%, эвристику подобрал, результатом и скоростью доволен.
Кстати, тормоза в скорости работы алгоритма были из-за неоптимизированной логики вычисления пересечений отрезка с объектами.
Но, слава Богу, глаза узрели и разум осилил сие. :)

Ещё раз всем спасибо! Вы все мне очень помогли.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как описать эвристику для А* алгоритма, чтобы получилось, как в вложенном примере? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]