Как использовать алгоритмы верстки графов Boost 1.41.0 - PullRequest
3 голосов
/ 22 декабря 2009

У меня проблема с использованием алгоритмов разметки графов. повысить версию 1_41_0 mingw g ++ 4.4.0.

Итак, есть проблемы, с которыми я столкнулся. Можете ли вы посоветовать мне их?

  1. Функция fruchterman_reingold_force_directed_layout не скомпилирована.
  2. kamada_kawai_spring_layout скомпилирован, но программа потерпела крах.
  3. Неверная документация для алгоритмов компоновки, пример для fruchterman_reingold_force_directed_layout не скомпилирован.

Это мой пример. Чтобы использовать функцию просто раскомментируйте один. Строка 60, 61, 63.

#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_utility.hpp>
#include <boost/graph/simple_point.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/graph/circle_layout.hpp>
#include <boost/graph/fruchterman_reingold.hpp>
#include <boost/graph/kamada_kawai_spring_layout.hpp>
#include <iostream>

//typedef boost::square_topology<>::point_difference_type Point;
typedef boost::square_topology<>::point_type Point;

struct VertexProperties
{
    std::size_t index;
    Point point;
};

struct EdgeProperty
{
    EdgeProperty(const std::size_t &w):weight(w) {}
    double weight;
};


typedef boost::adjacency_list<boost::listS,
            boost::listS, boost::undirectedS,
            VertexProperties, EdgeProperty > Graph;

typedef boost::property_map<Graph, std::size_t VertexProperties::*>::type VertexIndexPropertyMap;
typedef boost::property_map<Graph, Point VertexProperties::*>::type PositionMap;
typedef boost::property_map<Graph, double EdgeProperty::*>::type WeightPropertyMap;

typedef boost::graph_traits<Graph>::vertex_descriptor VirtexDescriptor;

int main()
{
    Graph graph;

    VertexIndexPropertyMap vertexIdPropertyMap = boost::get(&VertexProperties::index, graph);

    for (int i = 0; i < 3; ++i) {
        VirtexDescriptor vd = boost::add_vertex(graph);
        vertexIdPropertyMap[vd] = i + 2;
    }

    boost::add_edge(boost::vertex(1, graph), boost::vertex(0, graph), EdgeProperty(5), graph);
    boost::add_edge(boost::vertex(2, graph), boost::vertex(0, graph), EdgeProperty(5), graph);

    std::cout << "Vertices\n";
    boost::print_vertices(graph, vertexIdPropertyMap);

    std::cout << "Edges\n";
    boost::print_edges(graph, vertexIdPropertyMap);

    PositionMap positionMap = boost::get(&VertexProperties::point, graph);
    WeightPropertyMap weightPropertyMap = boost::get(&EdgeProperty::weight, graph);

    boost::circle_graph_layout(graph, positionMap, 100);
   // boost::fruchterman_reingold_force_directed_layout(graph, positionMap, boost::square_topology<>());

    boost::kamada_kawai_spring_layout(graph, positionMap, weightPropertyMap,
        boost::square_topology<>(), boost::side_length<double>(10), boost::layout_tolerance<>(),
        1, vertexIdPropertyMap);

    std::cout << "Coordinates\n";
    boost::graph_traits<Graph>::vertex_iterator i, end;
    for (boost::tie(i, end) = boost::vertices(graph); i != end; ++i) {
        std::cout << "ID: (" << vertexIdPropertyMap[*i] << ") x: " << positionMap[*i][0] << " y: " << positionMap[*i][1] << "\n";
    }

    return 0;
}

1 Ответ

0 голосов
/ 28 марта 2010

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

Объявите свой график как

typedef boost::adjacency_list<boost::vecS,
            boost::vecS, boost::undirectedS,
            VertexProperties, EdgeProperty > Graph;

если у вас нет веских причин поступить иначе, таким образом, vertex_id гарантированно будет в [0, n).

Если вы удалите фиктивный "+2" из своих индексов vertexId, ваш идентификатор вершины должен теперь соответствовать реальному идентификатору вершины вершин (и, следовательно, ваша программа больше не должна сегрегироваться).

Это должно быть сделано для kamada_kaway, но ИМХО, ваш код может быть улучшен многими способами, просто внимательно посмотрев пример кода BGL.

РЕДАКТИРОВАТЬ: исправлена ​​опечатка s / setS / vecS /

...