Я представляю коллекцию процессов с помощью 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: График процесса является динамическим как по количеству узлов, так и по краям. Таким образом, может быть, не привлекательно использовать абсолютное положение для узлов (чтобы вызвать много пересечений ребер?).
Спасибо за любые предложения. И исполняемый код будет очень оценен.