Используете алгоритм A* для решения скользящей головоломки и N ферзей?

Я успешно реализовал A* для поиска пути в сетке на NxM.

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

Может ли кто-нибудь подсказать мне, с чем связаны эвристическая функция h и оценка G в этих задачах и как действовать дальше.

-- Например, при поиске по сетке мы добавляем соседей в открытый список, а затем ищем самую низкую оценку F и добавляем ее в закрытый список.

Что нужно сделать, чтобы следовать одному и тому же алгоритму для решения головоломки NQueens и Sliding?

Спасибо :)


person PhoenixDD    schedule 27.09.2014    source источник
comment
Вы выяснили, что такое ваше пространство поиска и как будут выглядеть узлы?   -  person harold    schedule 27.09.2014
comment
ммм нет? о.о надо? Думаю, в поиске по сетке он не нужен?   -  person PhoenixDD    schedule 27.09.2014
comment
При поиске пути через сетку это очень очевидно, вы, вероятно, поняли это, не осознавая, что делаете. Но для NQueens и Sliding Puzzle это явно не то же самое, что поиск пути в сетке — шаги, которые вы делаете, не ведут вас от одной ячейки к другой, они переносят вас из одной сетки в другую сетку, которая каким-то образом связана.   -  person harold    schedule 27.09.2014
comment
Итак, что мне нужно знать, чтобы решить эти головоломки, используя A*?   -  person PhoenixDD    schedule 27.09.2014
comment
Хорошо, я думаю, я сделаю это ответом   -  person harold    schedule 27.09.2014


Ответы (2)


Вам необходимо правильно определить функцию перехода, функцию стоимости и эвристику. Вместо того, чтобы объяснять вам каждый пример, если вы знаете основы A*, вам может быть полезно взглянуть на реализацию проблема N-Queens и N-головоломка библиотека Hipster. Если вы не реализуете свой код на Java, не волнуйтесь, код достаточно ясен, чтобы вы знали, как это сделать.

Надеюсь, мой ответ поможет.

Адриан

person Adrián González    schedule 29.09.2014
comment
Большое спасибо, я успешно реализовал A * в N-Puzzle, используя эвристику = неуместные плитки. но я все еще не могу понять эвристику, которую можно использовать для N-Queens :( - person PhoenixDD; 30.09.2014
comment
Для этой задачи в библиотеке мы используем в качестве эвристики количество атакованных ферзей. Посмотрите, как мы его вычисляем в классе NQueens. Это метод attackedQueens(). - person Adrián González; 30.09.2014
comment
Извините, если скажу что-то вырванное из контекста, так как я не привык к github. Но предыдущая ссылка, которую вы разместили, состоит из алгоритма Hill Climbing, если я не ошибаюсь. Разве он не отличается от A* и, следовательно, не будет ли использование его эвристики в A* создавать проблемы? о.о - person PhoenixDD; 01.10.2014
comment
В случае с N-ферзями функция стоимости представляет собой количество атакованных ферзей. Вы также можете использовать это как эвристику, так как ее не так сложно вычислить. Поскольку функции эвристики и стоимости одинаковы, A * найдет оптимальное решение, расширяющее наименьшее возможное количество состояний. Кроме того, поскольку эвристика такая же, как и стоимость, она действительна для алгоритма (поскольку она допустима и непротиворечива). - person Adrián González; 02.10.2014
comment
Хорошо спасибо большое. Я попробую это прямо сейчас :) - person PhoenixDD; 02.10.2014

A* — это алгоритм, работающий с графами, поэтому, когда вы используете A* для решения задачи, эта задача должна выглядеть как граф. Конечно, вы обычно на самом деле не строите граф, обычно он неявный, но это все же граф (у него есть узлы, а узлы имеют ребра к соседям).

Таким образом, вы должны решить, какие узлы в этом графе. Для поиска пути в сетке узлы соответствуют позициям в сетке.

Затем вы определяете способ (или несколько) генерации соседей из узла. Думая о графе, это функция от узла к набору его исходящих ребер. Для поиска пути в сетке это то, где вы создаете, возможно, 4 соседние позиции (или 8 или что-то еще). По сути, вы определяете «шаги», которые можно предпринять.

Эти шаги имеют свою цену. Это не G, это просто то, на что вы увеличиваете G. Часто это просто 1. Если снова взять поиск пути в сетке в качестве примера, иногда он определяется как 10 для шага на север/восток/юг/запад и 12 для шага по диагонали (аппроксимирует евклидово расстояние с небольшими целыми числами, с которыми легко работать) .

Затем вы найдете допустимую эвристику (та, которая не завышает фактическую стоимость), которая в некотором роде что такое A*. Без этого поиск был бы тупым, эвристика делает его информированным, и он должен быть допустимым для обеспечения оптимальности. Поиск допустимых эвристик, которые также являются хорошими (то есть достаточно высокими), может быть сложным. Если вы найдете несколько из них, скажем, функции h0 и h1, то вы можете взять max(h0, h1), но, конечно, это поможет только в том случае, если ни одна из них не является явным "победителем" в том смысле, что она всегда не ниже другой ( и, очевидно, еще допустимым). Если есть есть явный победитель, вы, очевидно, можете просто использовать его и забыть о другом.

По сути, все это способ «заполнить пробелы» в алгоритме A*, который сам по себе не меняется в зависимости от того, какую задачу вы с его помощью решаете.. за исключением одной детали: закрытый список можно использовать только в том случае, если эвристика непротиворечива. Таким образом, вы все еще делаете знакомую вещь, беря узел с наименьшим F-оценкой из открытого списка, помещая его в ближайший список, просматривая его соседей и помещая их в открытый список, я пропускаю здесь многое, но вы знать дрель.

person harold    schedule 27.09.2014
comment
Ладно, думаю, я разобрался. Большое спасибо. :) - person PhoenixDD; 27.09.2014