Выбор жадного алгоритма для поиска пути с наименьшей стоимостью - PullRequest
1 голос
/ 21 марта 2011

У меня есть пирамида чисел. Каждое число представляет количество связанных точек. Мне нужно использовать жадный алгоритм, чтобы найти путь с наименьшей стоимостью, чтобы добраться от вершины пирамиды до низа. Я читал о неинформированных и информированных алгоритмах поиска, но все еще не знаю, что выбрать. Что, по вашему мнению, лучше всего подходит для такого рода проблем? Жадный поиск в первую очередь / A * поиск или другое? Это такая простая проблема, но я не использую все эти алгоритмы, чтобы знать, какой вариант лучше. И, как я уже сказал, это должен быть жадный алгоритм.

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Если я правильно вас понимаю, в вашей пирамиде у вас всегда есть возможность спуститься влево или вправо, а стоимость перехода на дно - это сумма всех узлов, через которые вы проходите.

В этом случае просто пройдите вверх снизу.Начните со 2-го ряда снизу.Для каждого узла в строке посмотрите на его левого и правого потомков в ряду ниже.Добавьте стоимость более дешевого дочернего узла к узлу, на котором вы находитесь.Двигайтесь вверх по ряду и повторяйте, пока не окажетесь у корня / вершины.Каждый узел теперь будет содержать стоимость самого дешевого пути оттуда до дна.Просто жадно спускайтесь, выбирая дочерний узел с более дешевой стоимостью.

1 голос
/ 22 марта 2011

Если у вас нет необходимости использовать жадный алгоритм, который здесь не верен.Для решения этой проблемы вы, естественно, используете технику, называемую «динамическое программирование».

Вы инициализируете все квадраты вашей пирамиды (вы делаете резервную копию) с бесконечностью - за исключением начальной точки, которая имеет собственное значение.

И вы обрабатываете пирамиду сверху вниз, строка за строкой.Вы пытаетесь перейти туда, где можете, из первого ряда (так что единственный - это верх), и вы обновляете узлы во втором ряду, присваивая им значение top + их значение.Затем вы переходите во второй ряд и обновляете узлы в следующем ряду.

Вполне возможно, что ранее вы нашли лучший маршрут к этому узлу (ведущий от узла, расположенного на одно место слева), поэтому вы будете обновлять только в том случае, если вновь созданный маршрут "быстрее".(Таким образом, вы произвели инициализацию бесконечности, что означает, что в начале вы не знаете, существует ли какой-либо маршрут на самом деле). После того, как вы закончите обработку уровня пирадов таким образом, вы узнаете, что у вас есть наилучшие возможные маршруты к узлам, которые размещены вуровень чуть ниже.

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

0 голосов
/ 21 марта 2011

То, что вы хотите, это алгоритм Дейкстры, который проще, чем поиск A *, но я думаю, что DFS сделает это с.Я не уверен, что ты действительно хочешь.

...