|
Модераторы: Daevaorn |
|
Isaev |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 125 Регистрация: 8.11.2007 Где: Germany Репутация: нет Всего: нет |
Нет конечно, просто счёт был на часы и не хотелось спорить о теории... Т.к. не полностью в неё вник, к сожалению, чтобы спорить надо было разбираться получается эвристика может быть любая, не обязательно по манхеттену, и пришла потому мысль, что алго из книги тупил именно по этому, там же в расчёче эвристики забиты 2 массива жёстко для какого-то примера, а ввод поля с клавиатуры, как то это тупо... Может потому для другого поля получался далеко не манхеттен, но к решению он преходил, только какой ценой? Надо будет поиграться проверить
Талант! Как время будет, надо будет в пару алго подумать над оптимизацией... Может снова пристану. C++0x в какой среде компилируется? Я о таком не слышал даже пока, думал 0x случайный мусор. Надо будет всё таки собрать последний пример.
Это ясно... Это у сестры лабораторная была, на яве, потому никуда не денешься, но идея затянула лабу сдали, на 51 ход вглубину ява тоже повесилась (куча переполнилась), а остальное нормально считала, но чуть дольше... Для себя переведу позже на Delphi, приятный пример. Как оценить для поля 4х4 максимально длинной решение? 51 это же не предел? |
||||
|
|||||
Леопольд |
|
||||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
g++ 4.5, VS 2010 Это пока ещё драфт. Стандарт не принят (хотели вроде в 2007 принять, поначалу), так что всё может поменяться.
Это сообщение отредактировал(а) Леопольд - 23.11.2010, 08:12 -------------------- вопросов больше чем ответов |
||||
|
|||||
Master01 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Эвристическая функция это Ахилесова пята Astar-а.
Если она переоценивает оставшееся расстояние, то алгоритм может вернуть не самый минимальный путь. НО с другой стороны, если недооценивает, то алгоритм теряет направленность, т.е. начинает рыскать как алгоритм Дейкстры, работает медленее. На самом деле, в задаче поиска реальных путей на карте для эвристики используется тот же манхэтен, хотя это по сути не правильно, поскольку dx + dy (манхэттэн-расстояние) всега заведомо больше sqrt(dx^2 + dy^2) (при положительных dx и dy). т.е. такая эвристика всегда 100% нарушает условие допустимости эвристической функции. Это приводит к тому, что найденные пути могут быть не самыми минимальными. Но зато dx + dy высчитывается несравнимо быстрее чем квадрадный корень из суммы квадратов. Наверно, можно сказать что, если переоценивание "вминяемое", то лучше использовать эту упрощённую эвристику, чем наоборот - недооценивать или тратить кучу тактов процессора на вычисление точной эвристики. Другими словами, как и везде нужен балланс |
|||
|
||||
Isaev |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 125 Регистрация: 8.11.2007 Где: Germany Репутация: нет Всего: нет |
ну применимо к картам никто не мешает изменить эвристическую оценку к тому же sqrt(dx^2 + dy^2), если такой путь часто имеет место быть, то оно себя окупит... а вычисления всегда можно оптимизировать разложив до булевых операций и сдвигов, и скорость будет вполне сносной... Возвращаясь к теме (в частности к 4х4): если я обрабатываю числа не по порядку, а допустим сначала так +----+----+----+----+ | 1 | 2 | 3 | 4 | +----+----+----+----+ | 5 | | | | +----+----+----+----+ | 9 | | | | +----+----+----+----+ | 13 | | | | +----+----+----+----+ а потом 3х3 это же выведет алгоритм раньше к правильному решению? Или я не совсем допонимаю принцып? |
|||
|
||||
Леопольд |
|
||||||||||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
step 51 execution time : 0.383 s
Добавлено @ 20:52 step 60 execution time : 5.352 s
Но решение может bыть не оптимальным, по какой-то причине, на первом примере вместо 36 выдаёт 42 шага. Может не совсем правильно реализовал. Пожалуй, мне это надоело... Добавлено @ 20:57 Только если получится решаемая комbинация. Добавлено @ 21:00
Т.е. надо время считать. Это сообщение отредактировал(а) Леопольд - 23.11.2010, 21:27 -------------------- вопросов больше чем ответов |
||||||||||
|
|||||||||||
Леопольд |
|
|||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
sqrt(dx^2 + dy^2) = S(x, y) dx + dy = M(x, y) S(1,1) < S(1,2) M(1, 1) < M(1,2) И то и другое должно найти оптимальный путь. Суть в том, что если эвристическая функция менее точна, то, почти наверняка, понадоbиться bольше нодов рассмотреть при поиске. -------------------- вопросов больше чем ответов |
|||
|
||||
Isaev |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 125 Регистрация: 8.11.2007 Где: Germany Репутация: нет Всего: нет |
||||
|
||||
Master01 |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Ну а если не имеет место часто быть? Вообще, это соответствует движению по прямой от старта к финишу - крайне частный случай! во всех остальных случаях эвристическая функция будет недооценивать расстояние, что приведёт к тому, что алгоритм начнёт рыскать по крате, как алгоритм Дейкстры, вместо того чтобы двигаться направлено к цели, что есть замедление. Я не говорю, что это не верно. Просто прежде чем вводить ту или иную эвристику нужно хорошо подумать А для той задачи, что я привёл уже люди хорошо подумали и рекомендовали нам делать так .
Ну так МП так и поступает. Добавлено через 13 минут и 33 секунды Нет. Манхэттен не переоценит расстояние только если при движении к цели вам нужно сначало спуститься по вертикали до нужной вертикали, а потом строго горизонтально двигаться уже до цели вправо или влево (ну или ещё там где-то петлять). Во всех остальных случаях расстояние будет переоцениным. т.е. минимальность пути не будет гарантирована. Единственный способ этого гарантированно избежать - предполагать минимально возможное расстояние т.е. прямую, соединяющую 2 точки. (телепорты и пр. ерунду мы не рассматриваем) Но, как я уже писал, это очень редкий случай. Во всех остальных случаях расстояние будет серьёзно недооцененым, вседствии чего, алгоритм начнёт рыскать туда-сюда - т.е. потеряет направленность, будет проверять больше узлов подобно алгоритму Дейкстры.
нет, только если она не точно в меньшую сторону, т.е. недооценивает расстояние. Чем меньше вклад эвристического приближения h(x) в общую оценку f(x) = g(x) + h(x), тем алгоритм менее направлен, т.е. просматривает больше узлов. С другой стороны переоценка - добавляет направленности, но теряется точность, т.е. не гарантируется все те свойства, описанные выше. |
||||||
|
|||||||
Леопольд |
|
|||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это не важно. Главное что для по разному удалённых точек на карте, манхэттен bудет давать разную оценку, для дискретной карты, он подходит лучше (даже если можно передвигаться наискосок). При этом для той, которая bлиже, цена bудет меньше. Для эвристики bольшего не надо, т.е. bудет найден оптимальный путь (это как в пятнашках, можно посчитать количество костяшек, не на своём месте). Но, скорее всего, придётся проверить bольшее количество нодов.
Смысл эвристки не в том что-bы дать реальную оценку предстоящего пути (оbычно это невозможно, иначе нет смысла в алгоритме), а в том, что-bы указать, какие состояния нужно проверить прежде других, что-bы алгоритм искал решение "по направлению к цели" прежде всего. Чем точнее эвристика, тем меньше нодов bудет проверенно. (третий раз повторю, на всякий пожарный, авось не проигнорируешь в этот раз...) Пройденное расстояние, желательно оbязательно надо оценивать так же по тому же принципу как и предстоящее (тогда не bудет переоценки расстояния). Это сообщение отредактировал(а) Леопольд - 25.11.2010, 05:52 -------------------- вопросов больше чем ответов |
|||
|
||||
Master01 |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Леопольд, прокомментирую только первое ваше предложение, т.к. дальше вы там что-то красных букв много понаписали... да и смыла нет. Вот, вам цитата из википедии Функция h(x) должна быть допустимой эвристической оценкой, то есть не должна переоценивать расстояния к целевой вершине Вот ещё из буржуйской, если инфа в русской вызывает сомнения The h(x) part of the f(x) function must be an admissible heuristic; that is, it must not overestimate the distance to the goal Если вы отвечаете мне "не важно" на мои слова про "переоценку" расстояния, то значит, простите, но это скорее всего вы что-то проигнорировали в моих предыдущих постах. Добавлено через 14 минут и 35 секунд
Вообще не верно по сути. Пройденное растояние можно измерить т.к. вы его прошли. А предстоящее можно только угадать, потому что измерять нечего. О какой унификации вы тут говорите, я вообще не понимаю. |
||||
|
|||||
Леопольд |
|
||||||||||||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Т.е. я имел ввиду что оценивать пройденное расстояние надо по тому же принципу что и предстоящее иначе, действительно можно "неугадать" предстоящее. Вот вам результат исполнения, можете проверить сами... Решётки - препятствия. Плюсиками отмечено найденное решение. Точками, остальные рассмотренные состояния, не вошедшие в оптимальный путь. Проbел - не рассматривалось: dx + dy
sqrt(pow(dx, 2) + pow(dy, 2))
Разница в количестве шагов есть? Пути немножко отличаются, но по длине (количеству шагов) они всегда будут одинаковые. Разница здесь заключается в количестве рассмотренных состояний (точек на карте).
Это сообщение отредактировал(а) Леопольд - 25.11.2010, 09:45 -------------------- вопросов больше чем ответов |
||||||||||||
|
|||||||||||||
Леопольд |
|
||||||||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Так, наверное, понятнее в чём разница:
r() - стоимость пройденного пути h() - эвристическая оценка r() = dx + dy h() = dx + dy
r() = sqrt(pow(dx, 2) + pow(dy, 2)) h() = sqrt(pow(dx, 2) + pow(dy, 2))
r() = dx + dy h() = sqrt(pow(dx, 2) + pow(dy, 2))
h() < r() - рассматриваются сперва те ноды, которые ближе к старту (большее количество нодов) r() = sqrt(pow(dx, 2) + pow(dy, 2)) h() = dx + dy
h() > r() - рассматриваются сперва те ноды, которые ближе к цели (меньшее количество нодов) h() = r(), гарантирует оптимальность решения (наименьший путь) насчёт h() < r(), не уверен, интуитивно кажется то решение оптимальное h() > r(), быстрее поиск, но нет гарантии оптимального решения Это сообщение отредактировал(а) Леопольд - 25.11.2010, 11:26 -------------------- вопросов больше чем ответов |
||||||||
|
|||||||||
Леопольд |
|
|||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Забавно. Увеличил в 1.5 раза h() относительно r() в пятнашках и получил оптимальный результат (51 шаг) менее чем за 3 секунды.
http://liveworkspace.org/code/7e1472ca6b32...5357e0d330320c3 Если в два раза, то решает за 61 ход менее чем за секунду... http://liveworkspace.org/code/58e9e2b3536e...f06f846a39dcafc В пять раз :
Это сообщение отредактировал(а) Леопольд - 25.11.2010, 12:56 -------------------- вопросов больше чем ответов |
|||
|
||||
Master01 |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Леопольд, ну вот словами "я же говорил" этого не передать ... |
||||
|
|||||
Леопольд |
|
|||
Опытный Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Эмпирически выявил что точность теряется после определённого порога переоценки. Если эвристику считать так (h() * (1 + 0.01 * r()), то потерь точности не наблюдается... До тех пор, пока не пересечёшь некий определённый порог, оптимальность сохраняется, скорость увеличивается.
А я разве с этим спорил? Но вот ещё что было сказано:
Плюс к этому, не раз отметил что чем менее "подходяще" оценивается путь и эвристика (предполагается что одинаковым способом) тем больше узлов придётся просчитать, однако решение, останется оптимальным. Т.е. можно обеспечить направленность не только "вмИняемой" переоценкой, но и более подходящим способом оценки (без переоценки эвристики), что гарантирует оптимальный результат. На что "услышал" категоричноеА так как делать мне было нефиг, я ударился в полемику. P.S. Когда ж мне надоест писать одно и то же разными словами, вот ведь зануда... Это сообщение отредактировал(а) Леопольд - 25.11.2010, 15:10 -------------------- вопросов больше чем ответов |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |