2012-04-18 6 views
0

Я работаю над изображениями для личного проекта, и я застрял на одном шаге (более того, это относительно простой шаг). Мой вопрос, кстати, не связан с изображениями.модификация алгоритма кратчайшего пути Dijkstra

Я вычисляю значения int для каждого пикселя на изображении. И я хочу найти путь с минимальной стоимостью между пикселями (узлами). На самом деле у меня есть работающая реализация алгоритма A *. Но я не хочу использовать это, потому что я не хочу ограничивать «карту» узлами, которые вы можете передавать или не передавать только. Я хочу, чтобы каждый узел мог быть передан, но с затратами. Некоторые узлы будут стоить дорого, а некоторые - нет. Но не будет узлов, которые нельзя передать.

Я не думаю, что мне нужно дать какой-либо код, потому что это очень изолированная часть проекта. Поэтому я не хочу никого изнашивать. Но в основном у меня есть объект карты, который имеет список узлов. И узлы имеют id, x, y позиции. (верхний, нижний, левый и правый пиксели) и ссылку на узел, чтобы знать, откуда я пришел сюда и т. д.

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

+0

Я не понимаю, почему вам нужна модификация. Обе звезды A * и Дейкстра работают с расходами. В чем проблема? – Ishtar

+0

@Ishtar Я думаю, что в * есть 2 вида узлов. узлы, которые вы можете пройти, и что вы не можете (стены). Я не прав? И для Dijkstra я не знаю, как использовать вершины и ребра. В моем случае они оба одинаковы, и как только вы передаете узел, вы добавляете стоимость этого узла к общей стоимости. – user1125953

ответ

2

Я думаю, что вижу проблему .. «Некоторые узлы будут дорого стоить, а некоторые не будут». На самом деле это не так, как работают алгоритмы, вы должны перевести проблему на узлы (без затрат) и на края (с затратами). Тогда это должно быть легко использовать A *, Dijkstra или любой другой алгоритм поиска пути.

В вашем случае каждый пиксель является узлом/вершиной. Каждый пиксель имеет 4 ребра (кроме границ на границах). Стоимость края будет значением int пикселя назначения.

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

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

+0

Спасибо. Я не думаю, как вы, я думаю, что алгоритмы могут работать для такого случая. Я просто попытался подчеркнуть, что всегда будет путь. Я дам целочисленные значения соответственно, не беспокойтесь об этом. В этом примере я не вижу смысла seperatig узлов и ребер. Потому что, если я реализую подобное, я думаю, что края будут настолько запутанными. Потому что давайте скажем, что x и y - 2 узла. стоимость края между x и y должна отличаться от стоимости края между y и x. Если вы думаете, что я не мог вас хорошо понять, можете ли вы попытаться объяснить это больше? – user1125953

+1

Я думаю, что вы меня прекрасно понимаете. Вы должны сделать выбор, запутать края и известные алгоритмы или запутать модификацию алгоритма. ИМХО добавьте ребра, и тогда вам не нужно беспокоиться о правильности алгоритма. (Существует множество реализаций.) – Ishtar

+0

Можете ли вы рекомендовать мне реализацию C#? Я нашел один, но я думаю, что что-то не так с этим :) – user1125953

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