Яндекс.Метрика

среда, 17 октября 2012 г.

Graphviz или как нарисовать конечный автомат

Тут мне стало известно о пакете graphviz, с помощью которого легко и удобно рисовать графы.

Делается это так. Допустим, вы сидите под убунту, тогда пакет называется graphviz и ставить его нужно так:

apt-get install graphviz

Дальше создаем файлик state_machine.dot (принятое расширение .dot) и для примера пишем следующее.

digraph state_machine {
    one -> two [label = "буква"];
    one -> five [label = "все остальное"];
    two -> three [label = "цифра"];
    three -> one [label = "пробел, запятая"];
    three -> five [label = "все остальное", len = 1.0];
}

Да, это не конечный автомат, а так, первое, что пришло в голову, но для примера сойдет :)

Дальше компилируем так:

dot -Tpdf -O state_machine.dot

Почему pdf? Его легко вставить в теховский файл и скомпилировать pdflatex-ом.

Также можно получить png, svg, ps и пр. путем изменения параметра при ключе T. В итоге получаем:


Рисунок немного уродский, что нужно непременно исправить. Например, можно повернуть изображение горизонтально, обозначить конечное и начальное состояние окружностями. Да че уж там, все состояния обозначим окружностями, а конечные — двойными. Ну и для учебного примера одно из состояний нарисуем ромбом, заполненным цветом. И подпишем рисуночек снизу. И уменьшим чуть-чуть весь рисунок.

digraph state_machine {
    rankdir = LR; // альбомная представление рисунка
    size = "10"; // размер рисунка
    node [shape = doublecircle]; one five; // двойной круг
    node [shape = circle]; two; // круг
    node [shape = diamond, style = filled, color = lightgray]; three // ромб, внутри залитый светло-серым цветом
    one -> two [label = "буква"];
    one -> five [label = "все остальное"];
    two -> three [label = "цифра"];
    three -> one [label = "пробел, запятая"];
    three -> five [label = "все остальное", len = 1.0]; // длина стрелочки вроде
   label = "Пример для понимания, как работает graphviz"
    fontsize = 10;
}

Результат:


Чуть-чуть стало приличнее. Я думаю, можно дальше поиграться и построить нормальный сложный автомат, который дают на лабах.

Простейший пример можно посмотреть здесь: http://www.youtube.com/watch?v=6eJnQo22nHA

Чуть-чуть есть здесь http://mydebianblog.blogspot.com/2010/01/graphviz.html

А чуть сложнее здесь: http://www.graphviz.org/Gallery.php Но надеюсь, что примеры, расположенные снизу (если пройти по ссылке) никогда вам не пригодятся.


2 комментария:

  1. мне обычно google-docs помогают в таких случаях

    ОтветитьУдалить
    Ответы
    1. Так в гугл-доках нельзя автоматически построить графы, все ручками, не?

      Удалить