2014-11-14 2 views
0

Моя проблема заключается в сортировке строк, указанных в трех списках, с использованием реализации поиска A *, поэтому мне нужно разработать эвристическую функцию, которая позволит эффективно решать различные случаи этой проблемы.Эвристическая функция A * поиск сортировки

состояния может быть представлен с списком 3 списков, например: [[C B], [D], [H G F A E]]

я забрать верхнюю часть любого стека и переместить его в любую другую. Например, H выше может быть перемещен поверх C или D, а [HG] можно перенести во второй стек, чтобы создать [HGD] и т. Д. В этом домене есть затраты оператора на единицу, поэтому каждый перемещать затраты 1, независимо от того, сколько слов перемещается.

Цель состоит в том, чтобы взять начальную конфигурацию блоков и переместить их все в левый стек в отсортированном порядке сверху вниз. Например, учитывая 8 блоков в приведенном выше примере, целью будет [[A B C D E F G H] [] []].

Мне нужно разработать эвристику, которая может использоваться с A * search, чтобы сделать поиск эффективным. Я должен попытаться сохранить допустимую эвристику. Для этого вы можете попытаться, чтобы ваши эвристики приблизили количество шагов, оставшихся до достижения цели.

Я думаю об эвристике зависит от отсортированных слов в каждом стеке, а сумма очков каждого стека является эвристикой для состояния, но это неэффективно, я думаю, что мне нужно включить ascii-код каждого письмо к моим расчетам, любые идеи?

+0

Итак, вы хотите отсортировать список этих проблем по количеству шагов для решения проблемы? Подсказка. Если у вас есть парное сравнение, например, на Java, убедитесь, что функция поиска вызывается только один раз для каждого элемента в списке, а не для каждой комбинации. Например, используйте хэш-карту для кэширования результатов поиска. Возможно, этого достаточно для ускорения. –

+0

Кроме того, ваша проблема очень похожа на проблему Towers of Hanoi, просто со случайной начальной конфигурацией. Возможно, это поможет вам в поиске хорошей эвристики A *. –

+0

да, я программирую с помощью java, единственное, что мне нужно, это значение эвристики для каждого состояния, поэтому мне нужно, чтобы алгоритм мог вычислять эвристическое значение для каждого возможного состояния, тогда я могу выбрать лучший. что вы имеете в виду именно функцией поиска? –

ответ

0

В начале попробуйте простую или наивную эвристику. Например, «h» будет суммой невозрастающего порядка двух букв. Скажем, когда вы разрабатываете нового ребенка, у вас есть что-то вроде этого [ACBED], возьмите первую пару [AC], они находятся в порядке возрастания, ничего не делают, но для следующей пары [CB] это не в порядке возрастания, а затем добавьте один к "час". [BE] хорошо. Для [ED] добавьте один в «h». Итак, «h == 2». Эта эвристика выглядит просто, но я считаю, что это лучше, чем слепой поиск (т. Е. Поиск по ширине/глубине). Из этой идеи вы можете добавить дополнительные правила для повышения эвристики на основе анализа результатов. Надеюсь, это полезно.

Смежные вопросы