22

GraphVizでプロセスのコレクションを視覚化しています。各プロセスは、プログラム順にいくつかの読み取りまたは書き込み操作で構成されます。当然、各プロセスに対して左から右の順序で操作を配置することが望ましい。

GraphViz(バージョン2.28)を使用すると、私のコードは次のようになります。

digraph G 
{
ranksep = 1.0; size = "10,10";
{ 
    node [shape = plaintext, fontsize = 20];
    0 -> 1 -> 2 -> 3 -> 4;
}
node [shape = box];
{rank = same;0;wy1;rf1;rc1;rz1;ry1;ra1;rb1;rx2;}
{rank = same;1;wf1;}
{rank = same;2;wx2;wc1;}
{rank = same;3;wf2;wz2;wx3;wa1;}
{rank = same;4;wz1;wy2;wx5;wb1;}
wy1 -> rf1;
rf1 -> rc1;
rc1 -> rz1;
rz1 -> ry1;
ry1 -> ra1;
ra1 -> rb1;
rb1 -> rx2;
wx2 -> wc1;
wf2 -> wz2;
wz2 -> wx3;
wx3 -> wa1;
wz1 -> wy2;
wy2 -> wx5;
wx5 -> wb1;
wf1 -> rf1[color = blue];
wc1 -> rc1[color = blue];
wz1 -> rz1[color = blue];
wy1 -> ry1[color = blue];
wa1 -> ra1[color = blue];
wb1 -> rb1[color = blue];
wx2 -> rx2[color = blue];

// W'WR Order:
wx3 -> wx2[style = dashed, color = red];

// W'WR Order:
wx5 -> wx2[style = dashed, color = red];
}

申し訳ありませんが、評判の低い出力画像を投稿することは許可されていません。コードを実行できる場合は、pid = 3で処理中の順序が狂っているため、結果がそれほど満足のいくものではないことがわかります。具体的には、GraphVizレイアウトアルゴリズムが(理想的な)順序を「wf2->wz2->wa1」に再配置しました。 -> wx3"から"wx3、wf2、wz2、wa1"。したがって、私の問題は次のとおりです。

私の問題:ランク環境で左から右へのノードの順序付けを強制する方法は?

このサイトを探索して、私はいくつかの同様の問題と潜在的な解決策を見つけました。ただし、私の特定の例では機能しませんでした。

  • Graphviz .dotノードの順序:constraint = falseオプションを使用すると、PDF画像が悪化しました。私はドットのユーザーズマニュアルをチェックしました:

    ランクの割り当て中、エッジのヘッドノードはテールノードよりも高いランクになるように制約されます。ただし、エッジにconstraint = falseがある場合、この要件は適用されません。

    上記のステートメントに基づいて、(おそらく)constraint = falseオプションは、同じランクではなく、異なるランク間で有効になります。

  • Graphviz ---ランダムなノードの順序とラベルを通過するエッジ:驚いたことに、constraint = falseオプションは、同じランクの「有限状態マシン」に大いに役立ちました。繰り返しますが、それは私をトラブルから救うことはありません。

  • graphviz:ノードの順序を維持しながらの円形レイアウト:プロセスグラフは、ノードの数とエッジの両方で動的です。したがって、ノードの絶対位置を使用することは魅力的ではない可能性があります(多くのエッジ交差を引き起こすためですか?)。

    提案をありがとう。そして、実行可能コードは非常に高く評価されます。

ドットファイル

4

1 に答える 1

18
    digraph G 
{
ranksep = 1.0; size = "10,10";
{ 
    node [shape = plaintext, fontsize = 20];
    0 -> 1 -> 2 -> 3 -> 4;
}
node [shape = box];
{
rank = same;
0->wy1->rf1->rc1->rz1->ry1->ra1->rb1->rx2 [color=white];
rankdir=LR;
}
{
rank = same;
1->wf1[color=white];
rankdir=LR
}
{
rank = same;
2->wx2->wc1[color=white];
rankdir=LR;
}
{
rank = same;
3->wf2->wz2->wx3->wa1[color=white];
rankdir=LR;
}
{
rank = same;
4->wz1->wy2->wx5->wb1[color=white];
rankdir=LR;
}
wy1 -> rf1;
rf1 -> rc1;
rc1 -> rz1;
rz1 -> ry1;
ry1 -> ra1;
ra1 -> rb1;
rb1 -> rx2;
wx2 -> wc1;
wf2 -> wz2;
wz2 -> wx3;
wx3 -> wa1;
wz1 -> wy2;
wy2 -> wx5;
wx5 -> wb1;
wf1 -> rf1[color = blue];
wc1 -> rc1[color = blue];
wz1 -> rz1[color = blue];
wy1 -> ry1[color = blue];
wa1 -> ra1[color = blue];
wb1 -> rb1[color = blue];
wx2 -> rx2[color = blue];

// W'WR Order:
wx3 -> wx2[style = dashed, color = red];

// W'WR Order:
wx5 -> wx2[style = dashed, color = red];
}

私はあなたの問題を正しく理解しているかどうかはよくわかりませんが、これを使ってみて、それがあなたが望むものであるかどうかコメントしてください. ノードの正しいランキングのために非表示のエッジを追加し、rankdir を使用して左右のレイアウトを使用しました。

于 2013-01-17T15:30:15.613 に答える