![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Есть только те, что уже известны, и те, которые, возможно, ведут к ещё неизвестным состояниям. У пятнашек пространство поиска 15! / 2 = 653 837 184 000 различных состояний (вторая половина недостижима из первой, и наоbорот). Достаточно много и для современных машин...
Это как? ![]() В пятнашках, из одного состояния можно получить от двух, до четырёх других состояний. Как они могут bыть промаркированы beз использования списка уже открытых? На дискретной карте (с количеством состояний менее чем M x N), для поиска пути, можно сделать O(1), не спорю. Если карта не слишком bольшая... Запускал на решение код из "твоей" книги? Интересно за сколько у теbя решит... Вот, по моему, самое узкое место:
Это сообщение отредактировал(а) Леопольд - 22.11.2010, 00:18 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
из интереса: ИИ должен найти самое лучшее решение или любое, но быстро ?
|
|||
|
||||
Master01 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Простите, я говорил, про A* приминительно к своей задаче, а касательно его применение к 15-шкам? я не очень силён... каким боком его тут прикрутить пока не представляю ...
Я, конкрено, использовал A* для решения задачи нахождения пути на некоторой карте, где карта представляла собой именно непрерывное пространство, а объекты в нём (препятствия) - простые полигоны (простые - значит без дыр) любой формы с любым количеством вершин. На самом деле, A*-ра там было всего 10% от всей работы. Всё остальное было связано именно с представлением в памяти этого непрывного пространства. Непрывное оно было в том смысле что в нём было возможно перемещение в любом направлении, на любое предельно малое расстояние и любая координата могла быть взята с любой степенью точности (на практике, конечно, существовали ограничения, накладываемые самой ЭВМ). Леопольд, я не имел ввиду что не нужно вести учёт "открытых/закрытых". Я хотел сказать, что не нужны сами списки - как структура данных (ну или деревья и пр.) потому что поиск в них - минимум логарифм (тут уж лучше хэш таблицы, там сложность - таже константа). Правельнее делать отметки в самих узлах. Для этого, конечно, ваша карта должна хранить узлы в виде объектов. В свой класс node вы добавляете поле bool is_in_close и is_in_open. Далее обращение к этим полям, при условии что сам объект-узел у вас уже есть - тривальная операция. Другой вопрос - какое время потребуется вашей карте, чтобы вернуть вам этот объект-узел? (на самом деле, тоже можно получить константу) Поэтому я и упомянул - "самая большая оптимизация - это правильно организовать само пространство поиска и чтение/запись в это пространство. " mes, Эвристика не гарантирует наилучшего решения, но зато работает быстро. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Добавлено @ 08:26 Решение оптимальное. Тот же подход используется в методе ветвей и границ в задаче коммивояжёра. Эвристическая функция нужна, что-bы попытаться изbежать полного переbора. Это сообщение отредактировал(а) Леопольд - 22.11.2010, 11:07 -------------------- вопросов больше чем ответов |
|||
|
||||
Master01 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Не, я тут правильно сказал. Надо различать карту - как сущность, хранящую пространство, и сам Astar - механиз, осуществляющий в нём поиск. Их связывает лишь тонкий мостик - интерфейс, через, который Astar получает всю необходимую информацию о пространстве. А так, это две независимые сущности. К примеру, это значит, что вы можете менять методы представления пространства и при этом совершенно не нарушать работу самого Astar-а. (до тех пор, конечно, пока неизменным остаётся интерфейс) Я привёл выше книги, в которых, это очень хорошо описано, включая архитектуру подобных систем и пр. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Isaev, я сейчас С++0x осваиваю, на нём код алгоритма понятнее:
Я имел ввиду что здесь речь про пятнашки, а не про карту. Если посмотришь код, то увидишь что сам алгоритм реализован отдельно. Это сообщение отредактировал(а) Леопольд - 22.11.2010, 14:26 -------------------- вопросов больше чем ответов |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Узкое место оказалось в Node::operator<
Так решает меньше чем за секунду...
Это сообщение отредактировал(а) Леопольд - 22.11.2010, 14:22 -------------------- вопросов больше чем ответов |
|||
|
||||
Isaev |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 8.11.2007 Где: Germany Репутация: нет Всего: нет |
из книги 450 сек, твой вариант из соседней темы 30 сек.
Что значит не гарантирует, это поиск минимального пути, конечно если говорить о картах минимальный путь не всегда лучший, но в данном случае это гарантирует минимальное решение
Да! я чувствовал ![]() только собрать не могу, может что-то в инклюдах нету?
19 D:\Programme\Dev-Cpp\Game15_Leo\main.cpp expected `)' before '<' token |
||||||||
|
|||||||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Isaev, тут нужен С++0x (предполагаемый bудующий стандарт). Выкинь конструктор с std::initializer_list.
Измени мой код из соседней темы, он для текущего стандарта. Это сообщение отредактировал(а) Леопольд - 22.11.2010, 17:41 -------------------- вопросов больше чем ответов |
|||
|
||||
Isaev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 8.11.2007 Где: Germany Репутация: нет Всего: нет |
Леопольд, а как отвязать этот код от boost
при трансляции на другой язык очень мешает |
|||
|
||||
Master01 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Я рискну не поверить ![]() Эвристические алгоритмы по своему определению не могут ничего гарантировать для общего случая, а Astar использует эвристику. Фактически это алгоритм Дейкстры (для которого, минимальность найденного пути гарантируется) с добавлением эвристики с целью сделать его быстрее. Насчёт путей на карте, тоже, простите, не верно - [стоимость пути] != [длина пути]. Лучший путь (он же минимальный) не обязательно самый короткий, но стоимость его всегда минимальна. Под стоимостью тут понимайте что угодно - от банального расстояния, до денежной стоимости проезда по различным участкам. |
|||
|
||||
Isaev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 8.11.2007 Где: Germany Репутация: нет Всего: нет |
Master01, из определения
Мы об одним и том же, только с разных сторон ![]() Именно если под стоимостью понимать банальное расстояние, то [стоимость пути] = [длина пути]. В общем это не столь важно... Леопольд, я тоже помешан на оптимизации, это привито ещё спектрумом, где каждый байт был на счету... У тебя был пример решения в 36 ходов, вот матрица для решения в 51 ход. 12, 2, 9, 13, 3, 11, 1, 10, 5, 14, 0, 4, 7, 15, 8, 6 оптимизированный вариант я пока так и не собрал, а старый её не тянет, т.к. после минут 5 вылетает по переполнению памяти. При чём странно работает, т.к. грузит процессор только вначале на полную, при этом используемая память быстро растёт до 860Мб потом быстро вниз до 50Мб и занятость процессора 10-20% так работает довольно долго, но потом вылетает... Странно. У тебя он отработает? и за сколько? |
|||
|
||||
Master01 |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Isaev, я вам уже наверно надоел, да? ![]() Все эти прекрасные свойства, описанные вами выше, выполняются только если ваша эвристическая функция h(x) всегда равна 0 (но тогда это уже алгоритм Дейкстры). Иными словами, если она гарантировано не привышает реально оставшегося расстояния до точки останова! т.е. когда мы можем ткнуть пальцем в небо и сказать, мол, до финиша не более N единиц стоимости. Если это возможно, то всё что вы написали выше - правда ![]() Но это возможно не всегда т.е. не для любой задачи. В моём случае и, я допускаю, в вашем тоже это реально, но это не значит, что так оно всегда. Поэтому я и сказал, что в общем случае Astar (да и вообще эвристические алгоритмы) не гарантирует оптимальность решения, ровно как и что решение будет найдено, если даже оно существует.
http://ru.wikipedia.org/wiki/%D0%AD%D0%B2%...%B8%D1%82%D0%BC |
||||||
|
|||||||
Леопольд |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Для решения в 51 ход пришлось оптимизировать по памяти. Отъедало всю доступную (1.6 GB), потом , видимо, начинала юзать swap, и нагрузка на процессор падала до 1-5%. Теперь юзает ~400 MB .
execution time : 16.759 s (AMD Athlon X2 4000+, Ubuntu 10.10, g++4.5)
решение в 52 хода съело ~1GB... Это сообщение отредактировал(а) Леопольд - 23.11.2010, 08:17 -------------------- вопросов больше чем ответов |
||||||||
|
|||||||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Не уверен что стоит делать на джаве, она ведь гораздо дольше раbотает... Разве нельзя какой-ниbуть bиндер к С++ или С использовать?
Это сообщение отредактировал(а) Леопольд - 22.11.2010, 23:40 -------------------- вопросов больше чем ответов |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |