![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 26.01.2011
Сообщений: 48
|
![]()
Постановка задачи:
есть несколько bmp (визуальная карта, карта трений и карта высот), все они грузятся программой, цвета пикселей задают соответственно трение и высоту. По визуальной карте движется объект (в зависимости от высоты и от трения на него действуют соответствующие силы), управление стрелками, настройки - правая кнопка мыши. Цель: доехать до красного кружка на карте. Exe прилагается, при необходимости выложу конкретные части кода. Собственно вопрос: необходимо сделать автоматическое движение объекта до цели по оптимальному пути (наименьший перепад высот, наименьшее трение). Для этого хотел использовать алгоритм Дейкстры. На небольших графах работает хорошо, но здесь не могу представить карту в виде матрицы смежности: просто не хватает памяти. (Вершины графа - пиксели карты, каждый пиксель-вершина связана с соседними пикселями). Структура "двумерный массив, где в каждой ячейки хранится восемь записей типа: с кем есть связь, ее цена" для карты 800х600 занимает >70 мб, полноценная матрица смежности - более двух ГБ. Возможно, стоить использовать для этой цели другой алгоритм? Буду рад любому совету, заранее благодарен. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Р какой матрице смежности Вы говорите?
Ячейка квадратной сетки имеет либо 4 либо 8 соседей в зависимости от введенной метрики. 800х600 - это полмиллиона ячеек. Для карты проходимости достаточно пол 4 байта на ячейку - 2 Мбайта. Пусть даже для совсем уж скрупулезного учета нам требуется еще добавить проходимость ребер - еще 4 Мб. Итого 6 Мб. По собственному опыту при надлежащей реализации карта 256х256 полностью просчитывается за 30 мс на процессоре с тактовой частотой 166 МГц. |
![]() |
![]() |
![]() |
#3 |
ios developer
Старожил
Регистрация: 16.11.2007
Сообщений: 2,885
|
![]()
Еще два дополнения:
1. Делать ячейку величиной в пиксель - маразм. Обычно карта местности, в конечном итоге, строится исходя из сетки. 2. Вроде бы как необязательно держать в памяти сразу все вершины с весами. Можно карту разбить на куски, согласуясь с эвристикой. Тем более, если персонаж двигается не из левого верхнего угла в правый нижний, - нет никакого смысла сразу генерировать сетку для всей карты.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
|
![]() |
![]() |
![]() |
#4 | ||
Пользователь
Регистрация: 26.01.2011
Сообщений: 48
|
![]()
Матрица смежности. Имеем 800*600=480 000 вершин. В МС будет 480 000*480 000=очень много вершин. Кроме того, вес перехода - число типа Real.
Цитата:
Смотрел реализации волнового алгоритма, но везде клетки карты не связаны между собой (т.е., например, лес имеет цену прохода 10, вода - препятствие и т.д.). У меня же такого нет, цену имеет переход из одной ячейки в другую (подъем в гору, спуск). Из-за этого приходится (другого пока не придумал) использовать граф. Цитата:
Но ведь нет гарантии, что оптимальный путь найдется на квадратной части карты, где один угол - объект, противоположный - цель, возможно, придется возвращаться назад, объезжая какую-то "горную цепь" |
||
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 26.01.2011
Сообщений: 48
|
![]()
Алгоритм А* выглядит довольно привлекательным для этой цели. Не могли бы Вы помочь разобраться с эвристической оценкой пути от рассматриваемой клетки до цели? Такой подход будет эвристической оценкой?
Эвр. оценка (Суммируем цены перехода на оранжевые клетки начиная от текущей, игнорируя препятствия) |
![]() |
![]() |
![]() |
#6 | |
ios developer
Старожил
Регистрация: 16.11.2007
Сообщений: 2,885
|
![]() Цитата:
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
|
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 26.01.2011
Сообщений: 48
|
![]()
Спасибо, в статье, что Вы предложили, нашел ссылку конкретно про эвристику:
http://www.policyalmanac.org/games/heuristics.htm |
![]() |
![]() |
![]() |
#8 |
ios developer
Старожил
Регистрация: 16.11.2007
Сообщений: 2,885
|
![]()
Еще пришел в голову вариант взять сетку с изначально крупным шагом, смежные с препятствиями ячейки дробить на более мелкие. Самой идее это не противоречит, но надо учитывать сокращение дистанции при переходе.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
|
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 26.01.2011
Сообщений: 48
|
![]()
Хотелось бы еще уточнить: для хранения открытых и закрытых вершин, карты пройденных вершин достаточно будет использовать, например, двунаправленный список, где в каждой ячейке будет храниться стоимость пути, эвр. оценка, их сумма и родитель? Или стоит использовать что-то другое?
|
![]() |
![]() |
![]() |
#10 | |
ios developer
Старожил
Регистрация: 16.11.2007
Сообщений: 2,885
|
![]()
Цитата из линка, приведенного выше:
Цитата:
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
поиск пути | Nikita1111 | Visual C++ | 1 | 09.02.2012 00:44 |
Поиск абонента по на карте номеру телефона. | sexybabeonwings | Общие вопросы Delphi | 1 | 26.09.2009 16:39 |