Подтвердить что ты не робот

Как обеспечить упорядочение слева направо node в макете ранга GraphViz?

Я представляю коллекцию процессов с помощью 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". Поэтому моя проблема:

Моя проблема. Как обеспечить упорядочение слева направо node в среде ранга?

Изучая этот сайт, я нашел некоторые подобные проблемы и возможные решения. Однако они просто не работали в моем конкретном примере:

  • Graphviz.dot node ordering: опция constraint = false сделала мое изображение в формате PDF хуже. Я проверил руководство пользователя dot, в котором говорится:

    При присвоении ранга головка node края ограничена на более высокий ранг, чем хвост node. Если ребро имеет ограничение = false, это требование не выполняется.

    Основываясь на вышеприведенных утверждениях (предположим), ограничение = ложная опция вступает в силу между разными рангами, а не в одном ранге.

  • Graphviz --- случайный node порядок и ребра, проходящие через метки: с удивлением параметр constraint = false помог "конечному автомату", много в одном ранге. Опять же, это не спасает меня от неприятностей.

  • graphviz: круговой макет при сохранении порядка node: График процесса является динамическим как по количеству узлов, так и по краям. Таким образом, может быть, не привлекательно использовать абсолютное положение для узлов (чтобы вызвать много пересечений ребер?).

    Спасибо за любые предложения. И исполняемый код будет очень оценен.

dot file

4b9b3361

Ответ 1

    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 для использования левого правого макета.