BGLを使用してRNAフォールディングのグラフをレイアウトしたいのですが、平面構造が保証されており、すべてのエッジが同じ長さである必要があります(通常のシーケンスと赤の結合の2種類のエッジがあります)。
rnaの二次構造http://www.ncrna.org/frnadb/sec_structure/png/FR096703.png
namespace boost {
enum vertex_position_t { vertex_position };
BOOST_INSTALL_PROPERTY(vertex, position);
};
template<class PairIterator>
void layout(std::string seq, PairIterator begin, PairIterator end) {
using namespace boost; using namespace std;
// backbone edges + bonding edges
vector<pair<size_t,size_t>> edge_list(begin, end);
for(size_t i = 0 ; i < seq.size() - 1 ; i++)
edge_list.push_back(make_pair(i, i + 1));
typedef rectangle_topology<> topology;
typedef topology::point_type point;
boost::minstd_rand random;
topology space(random, -1000, -1000, 2000, 2000);
adjacency_list<vecS, vecS, undirectedS,
property<vertex_position_t, point>
> g(edge_list.begin(), edge_list.end(), seq.size());
random_graph_layout(g, get(vertex_position, g), space);
fruchterman_reingold_force_directed_layout(g, get(vertex_position, g), space,
cooling(linear_cooling<double>(100)));
// draw
}
ただし、これにより、非常にランダムなレイアウトが得られます(クールダウン100、200、400の場合)。より長いクールダウンは、頂点をコーナーに押し込むだけです(画像は完全なレイアウトを示しています)。エッジが一貫して長すぎるようです...
エッジのターゲットの長さを指定し、ある程度のマージン内に到達するまでシミュレーションを停止させたくありません。
私のコードはブーストサンプルからまとめられていますが、プロパティマップなどに固執する必要はなく、GraphVizに頼らずにレイアウトが必要です。