RNA折りたたみのグラフをBGLでレイアウトしたいのですが、それは保証された平面構造を持ち、すべての辺が同じ長さでなければなりません(2種類の辺があります。このような赤で結合)、:Fruchterman Reingoldのレイアウトが収束しない
rna secondary structure 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に頼ることなくレイアウトが欲しいです。
(-100、 -100,200,200)の無作為レイアウトのrectも指定できます。カスタムのattractive_force関数 '1e5 * d * d/k'ではレイアウトを生成しますが、それでもかなり悪いです。カスタム冷却機能 '100 - (1 - pow(steps/max_steps、4))'では、GraphVizが生成するものの近くにはまだ少しでも良くなります... – pascal
'1e5 *'引力グラフはどのように見えますか?多分もっと高いものを試してみてください。あなたの魅力的で斥力的な力の関数に基づいて目標の長さ(ソート)を計算することも可能です。それらの間に2つの頂点と1つの辺がある場合を考慮してください。 – James
OK、カスタムフォース機能ではGraphViz 'neato'より悪くはありません。これは私のポストでは絵の近くにありませんが、ランダムではなく円形のレイアウトで受け入れられます。 – pascal