Алгоритм Беллмана и распределение памяти

Тема в разделе "LANGS.C", создана пользователем perez, 2 янв 2009.

  1. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Доброго времени суток, всезнающий all!
    На днях пришлось заюзать вышеуказанный алгоритм (кто не в курсе, поиск оптимального пути на взвешенном графе).
    Не думал, что возникнут вопросы, но они возникли.
    Если граф достаточно большой, нет смысла весь его держать в памяти. Нужно только текущие ветки.

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

    Есть у меня идеи, но какие-то карявые. Такой оптимизацией не занимался. Может кто уже делал что подобное.
    Размерность графа - 3. Но это думаю не особо большую роль играет.

    ЗЫ Кстати есть идея с sqlite сделать, чтобы обрабатывать данные о вершинах в индексированных таблицах.

    Вобщем делимся мнениями.
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    chuti pereformuliruite zadachu v storonu konkretnosti i opredelionnosti, otbrosiv lishnie detali vrode sqlite i bellmanov.

    vy hotite menedger pamiati? Opishite ego jelaemye svoistva s minimum vtorostepennyh detalei
     
  3. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    qqwe
    В том и дело, что мне нужно реализовать алгоритм Беллмана, а как - это вопрос.
    Я задал вопрос более широко. Возможно не нужно писать менеджер памяти, я и хотел посоветоваться.
    По поводу конкретных свойств менеджера памяти - они вытекают из особенностей самого алгоритма. А описывать алгоритм здесь смысла не вижу,
    очень долго будет. Вот ссылка на вики ru.wikipedia.org/wiki/Алгоритм_Беллмана-Форда. Алгоритм очень распространенный, я надеюсь многие с ним знакомы. Спасибо.
     
  4. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Эм может я что-то не понимаю, но к чему менеджер памяти в графе с 3 вершинами? o_O
    Или под "размерностью" подразумевается что-то другое?

    vector < vector < pair<int,int> > > g; // сам граф
    vector<int> par; // откуда пришли в i-ую вершину (из какой вершины)
    ?
    Если нужно совсем динамическое, то можно в сторону map<int, set<int> >, multimap<int,int>, hashmap и т.п.

    [added]
    Хотя, если только Форда-Беллмана запускать, то граф вообще можно хранить как set < pair< pair<int,int>, int> > - список рёбер.
     
  5. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    >> Размерность графа - 3
    Имел ввиду матрица 3-хмерная.

    STL вообще не покатит. Я конечно понимаю, что очень удобно создавать и обращаться с элементами в контейнере.
    Но при большой размерности ты себе представляешь, сколько будет вызывать new / delete ?! А создать весь граф сразу тоже нельзя (см. первое сообщение).

    Выделить надо сразу какой-то буфер, и в нем работать. То есть менеджер памяти. Но тогда нужны алгоритмы быстрой перестановки/поиска и тд.
    Все-таки склоняюсь к тому, чтобы заюзать sqlite движок. Чем не менеджер памяти? И доступ к огромным объемам очень быстрый. И сохранить сразу можно.
     
  6. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    perez, окей, но какие именно операции на графе выполняються будут? От того, насколько динамичной должна быть структура, всё ведь сильно зависит.
     
  7. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Ну смотри. Делается очередная итерация. Делается по шагу из всех оконечных текущих вершин. Во - первых надо знать, что это за вершины.
    Все текущие пути увеличатся. Проверить цену доступ до каждой новой точки со всех сторон. Выявить не актуальные ветки. Проследить неактуальную ветку назад до первого ответвления. Удалить не актуалные переходы. Уже куча механизмов, связанных с доступом и удалением. Потом появляются пробелы в памяти в основном мелкие и в большом количестве.

    Во всей этой структуре необходимо прослеживать очередность ходов, то есть кто за кем, чтобы потом вернуться по пути. Ветвлений ОЧЕНЬ много.
    Есть мысль Просто создать большой массив структур и просто по ходу дела инициализировать их вместо того чтобы новые создавать / удалять. Но тут опять же если просто после скольких-то итераций алгоритма "чистить память" от пробелов, возникает куча лишних действий с индексацией (i-й элемент знает, за кем он стоит, но при перемещении в массиве индекс сменится). Короче поиска немеряно будет по массиву. Потом если предположить, что можно отсортировать этот массив, то как сравнивать элементы? У них будет x, y, z и кое-какая доп инфа. Наврядли это получится.
     
  8. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    И если так важна оптимизация, почему Форд-Беллман, а не Дейкстра?
     
  9. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    >> И если так важна оптимизация, почему Форд-Беллман, а не Дейкстра?

    Ну наверное потому, что алгоритм Беллмана я со студенческой скамьи знаю, в простом случае даже реализовывал.
    Знаю реальные задачи, решенные с пом. него. Потом уважаю своего профессора по мат. программированию, который любит его =)
    Я с ним больше знаком, его можно усложнять, навешивать разные фичи. К примеру можно задать как условие - минимально количество поворотов
    в пути. То есть не единственное условие - кратчайший путь, а дополнительные можно вводить.
     
  10. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    perez, я если честно, вообще не понял твой предпоследний пост. Какие ветки, какие удаления переходов? Это относится к самому алгоритму Форда-Беллмана или к специфике программы?

    Вот классический алгоритм Форда-Беллмана в простейшей stl-ной реализации:
    Код (Text):
    1. int n; // число вершин
    2. vector < vector < pair<int,int> > > g; // граф списками смежности
    3. vector<int> dst (n, INF), p (n, -1); // расстояние до каждой вершины, и предыдущая вершина в оптимальном пути
    4. dst[start_v] = 0;
    5. for(;;) {
    6.     bool any = false;
    7.     for (int i=0; i<n; ++i)
    8.         if (dst[i] != INF)
    9.             for (size_t j=0; j<g[i].size(); ++j) {
    10.                 int to = g[i][j].first;
    11.                 if (dst[i] + g[i][j].second < dst[to]) {
    12.                     dst[to] = dst[i] + g[i][j].second;
    13.                     p[to] = i;
    14.                     any = true;
    15.                 }
    16.             }
    17.     if (!any)  break;
    18. }
    В ходе самого Форда-Беллмана ничего ниоткуда удалять не надо, пути все потом можно восстановить по вектору p[], памяти кроме самого графа надо на 2N int'ов. Так что плиз объясни ещё раз, что ты хотел сказать.