boost::graph
От: k732  
Дата: 15.05.08 17:21
Оценка:
стоит задача графического отображения объектов.

есть N элементов. Из этока множества попарно известны расстояния (но правда не все)
Нужен алгоритм расстановок точек в геометрич. фигуру.

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

P.S. Книгу про boost::graph заказал, но идти будет несколько дней, а тут нужно срочно.
Можно ли решить данную задачу с помощью данной библиотеки или есть еще какие способы ?

Если не сложно — то небольшой примерчик по работе с библиотекой...
Re: boost::graph
От: chipmunk  
Дата: 22.05.08 07:09
Оценка:
пример поиска кратчайшего пути (вес = расстояние между узлами):

#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/adjacency_list.hpp>
using namespace std;
using namespace boost;

int main(int argc, char* argv[])
{
    typedef adjacency_list<vecS, vecS, undirectedS, property<vertex_distance_t, double>, property<edge_weight_t, double> > GraphType;

    GraphType G;
    property_map<GraphType, edge_weight_t>::type weightmap;

    GraphType::edge_descriptor ed;
    bool inserted;

    tie(ed, inserted) = add_edge(1, 2, G); weightmap[ed] = 5;
    tie(ed, inserted) = add_edge(1, 3, G); weightmap[ed] = 20;
    tie(ed, inserted) = add_edge(2, 3, G); weightmap[ed] = 8;

    int start_vertex_id = 1;
    int end_vertex_id = 3;

    GraphType::vertex_descriptor vd;
    vd = vertex(start_vertex_id, G);

    vector<GraphType::vertex_descriptor> pp(num_vertices(G));
    vector<double> dd(num_vertices(G));

    dijkstra_shortest_paths(G, vd, predecessor_map(&pp[0]).distance_map(&dd[0]));

    int i = end_vertex_id;
    cout << "path: " << i;
    while(i != start_vertex_id) {        
        i=pp[i];
        cout << " " << i;
    }
    cout << "; len: " << dd[end_vertex_id] << endl;

    return 0;
}



Здравствуйте, k732, Вы писали:

K>Если не сложно — то небольшой примерчик по работе с библиотекой...
Re: boost::graph
От: conraddk Россия  
Дата: 09.06.08 19:46
Оценка:
Здравствуйте, k732, Вы писали:

K>стоит задача графического отображения объектов.


K>есть N элементов. Из этока множества попарно известны расстояния (но правда не все)

K>Нужен алгоритм расстановок точек в геометрич. фигуру.

Задача уже решена? Есть несколько идей, необязательно с Boost::Graph
Д.К. << RSDN@Home 1.2.0 alpha rev. 655>>
Все на свете должно происходить медленно и неправильно...
Re: boost::graph
От: d1mk4  
Дата: 09.06.08 21:35
Оценка:
Здравствуйте, k732, Вы писали:

K>Если не сложно — то небольшой примерчик по работе с библиотекой...


В той книге которую Вы заказали все примеры находятся здесь:
boost\libs\graph\example\

примеры нахождения кратчайших путей с помощью алгоритма Дейкстры, Беллмана-Форда и многое другое Вы сможете найти там + вся документация в boost\libs\graph\doc\ по мотивам этой книги...
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Re[2]: boost::graph
От: k732  
Дата: 10.06.08 02:23
Оценка:
>Задача уже решена?
пока нет
Re[3]: boost::graph
От: conraddk Россия  
Дата: 10.06.08 11:18
Оценка:
Идея следующая. Берем какой-нибудь алгоритм раскладки графа, использующий физические аналогии (в Бусте есть Камада-Каваи и Фрухтерман-Рейнгольд), разбираемся, как он работает. Потом добавляем в эту физическую систему дополнительные силы, действующие на пары вершин, для которых известно расстояние. Своего рода "пружины", которые в состоянии покоя имеют заданную длину. Сжатие и растяжение приводит к появлению противодействующей силы. Надо поиграться с коэффициентами разных сил, думаю, можно получить приличный результат.
Д.К. << RSDN@Home 1.2.0 alpha rev. 655>>
Все на свете должно происходить медленно и неправильно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.