Граф / дерево представления и рекурсии - PullRequest
1 голос
/ 16 марта 2010

В настоящее время я пишу алгоритм оптимизации в MATLAB, в котором я полностью отстой, поэтому я действительно могу использовать вашу помощь. Я действительно изо всех сил пытаюсь найти хороший способ представления графа (или, скорее, дерева с несколькими корнями), который бы выглядел примерно так:

альтернативный текст http://img100.imageshack.us/img100/3232/graphe.png

В основном наши корни - 11/12/13 (стадия 0), 2x - стадия 1, 3x стадия2 и 4x стадия3. Как вы можете видеть, узлы из stageX подключены только к нескольким узлам из stage (X + 1) (поэтому их не обязательно подключать ко всем).

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

У меня есть простое представление с использованием матриц, но его действительно сложно поддерживать, поэтому мне было интересно, есть ли хороший способ сделать это?

Второй вопрос: когда я закончу с этим представлением, мне нужно вычислить, насколько хорош каждый маршрут (от корней до конца) (например, скажем, мне нужно сравнить, 11-21-31-41 лучший или 11-21-31-42 лучше), чтобы сделать это, я буду использовать переменные, которые содержит каждый узел. Но значения должны быть вычислены рекурсивно, скажем, мы начинаем с 11, но чтобы вычислить, насколько хороши 11-21-31-41, нам сначала нужно перейти к 41, сделать некоторые вычисления, перейти к 31, сделать некоторые вычисления, перейти 21, сделайте некоторые вычисления, а затем мы можем вычислить 11, используя все предыдущие вычисления. То же самое с 11-21-31-42 (мы начинаем с 42, затем 31-> 21-> 11). Мне нужно проверить все возможные маршруты таким образом. И вот вопрос, как это сделать? Может быть, BFS / DFS? Но я не совсем уверен, как сохранить все результаты.

Это некоторые длинные вопросы, но я надеюсь, что я не прошу вас делать домашнее задание (так как я получил все алгоритмы, просто я не очень хорош в Matlab, и мой учитель не позволил бы мне сделать это в Java).

1 Ответ

3 голосов
/ 17 марта 2010

Конечно, это может быть не самое эффективное решение, но если у вас есть доступ к Matlab 2008+, вы можете определить класс узла для представления вашего графика.

Документация Matlab содержит хороший пример связанных списков, который можно использовать в качестве шаблона.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...