a. Нарисуем города – вершины графа, найдем число необходимых ребер:
6-1 = 5
b. Выберем ребра, имеющие минимальный вес 1: 1-4, 2-5, 4-5, включаем их в граф
c. Опять выберем ребра с минимальным весом 2: 1-3, 1-6, 3-5, ребро 3-5 образует цикл, поэтому в граф его включать не будем. Т.к. количество ребер равно 5, то минимальное остовное дерево построено.
Вес минимального остовного дерева равен: 1 + 1 + 1 + 2 + 2 = 7.
3) Найти кратчайшие пути от вершины 1 до всех остальных вершин графа, изображенного на рис. 4.16, по алгоритму Дейкстры.
Рис. 4.16
Решение:
a) Т.к. исходная вершина 1, то длина пути 1-1 = 0 – постоянная метка (обозначили +). всем остальным вершинам присвоим метки ¥.
Таблица 4.2
рассматриваемая вершина
0+
¥
¥
¥
¥
¥
p = 1
b) Из вершины 1 выходят дуги в вершины 2, 4, 5. Пересчитываем метки этих вершин и заполняем следующую строку:
d(2) = min (¥; 0 + 3) = 3
d (4) = min (¥; 0 + 2) = 2
d (5) = min (¥; 0 + 8) = 8
В качестве постоянной выберем вершину с меньшей меткой 2 – вершина 4.
Таблица 4.3
выбранная вершина
0+
¥
¥
¥
¥
¥
p = 1
0+
¥
2+
¥
p = 4
c) Из вершины 4 выходят дуги в вершины 2, 5. Пересчитываем метки этих вершин и заполняем следующую строку:
d (2) = min (3; 2 + 7) = 3
d (5) = min (8; 2 + 5) = 7
В качестве постоянной выберем вершину с меньшей меткой 3 – вершина 2.
Таблица 4.4
выбранная вершина
0+
¥
¥
¥
¥
¥
p = 1
0+
¥
2+
¥
p = 4
0+
3+
¥
2+
¥
p = 2
d) Из вершины 2 выходят дуги в вершины 3, 5, 6. Пересчитываем метки этих вершин и заполняем следующую строку:
d (3) = min (¥; 3 + 6) = 9
d (5) = min (7; 3 + 1) = 4
d (6) = min (¥; 3 + 1) = 4
Так как метки вершин 5 и 6 одинаковы, то в качестве постоянной вершину выберем произвольно – вершина 5.
Таблица 4.5
выбранная вершина
0+
¥
¥
¥
¥
¥
p = 1
0+
¥
2+
¥
p = 4
0+
3+
¥
2+
¥
p = 2
0+
3+
2+
4+
p = 5
e) Из вершины 5 выходят дуги в вершины 3, 6. Пересчитываем метки этих вершин и заполняем следующую строку:
d (3) = min (9; 4 + 5) = 9
d (6) = min (4; 4 + 3) = 4
В качестве постоянной выберем вершину с меньшей меткой 4 – вершина 6.
Таблица 4.6
выбранная вершина
0+
¥
¥
¥
¥
¥
p = 1
0+
¥
2+
¥
p = 4
0+
3+
¥
2+
¥
p = 2
0+
3+
2+
4+
p = 5
0+
3+
2+
4+
4+
p = 6
f) Из вершины 6 выходит дуга в вершину 3. Пересчитываем метку этой вершины и заполняем последнюю строку:
d (3) = min (9; 4 + 4) = 8
В качестве постоянной выберем вершину с меньшей меткой 8 – вершина 3. На этом расчет окончен, найдены кратчайшие пути до всех вершин графа из точки 1.
Таблица 4.7
выбранная вершина
0+
¥
¥
¥
¥
¥
p = 1
0+
¥
2+
¥
p = 4
0+
3+
¥
2+
¥
p = 2
0+
3+
2+
4+
p = 5
0+
3+
2+
4+
4+
p = 6
0+
3+
8+
2+
4+
4+
p = 3
4) Определить кратчайшие пути от вершины 1 до всех остальных вершин графа, изображенного на рис. 4.17, по алгоритму Беллмана.
a). Для построения кратчайших путей графа удобно воспользоваться таблицей: в столбцах записаны вершины графа, в строках - . Первый столбец соответствует первой вершине s и содержит только 0.
Рис. 4.17
b). На первом шаге находятся пути одной дуги от вершины 1 до вершин 2,4,5.
c). Занесем в строку 1, если пути нет, то ставим ¥. Пути состоящие более чем из 2-х дуг следует искать только для вершин, в которые входят дуги, выходящие из вершин 2,4,5:
из 2 – в 3,4,5,6
из 4 – в 2,5,7,8
из 5 – в 2,3,4,6,7,9
d). Уменьшились длины путей до вершин: 2,3,6,7,8,9. А значит, имеет смысл искать более короткие дуги до тех вершин графа, в которые входят дуги из перечисленных вершин
из 2 – в 3,4,5,6
из 3 – в 2,5,6
из 6 – в 3,5,8,9
из 7 – в 4,5,8
из 8 – в 4,5,6,7,9
из 9 – в 5,6
.
e). Уменьшились длины путей до вершин: 3,5,6,8,9. А значит, имеет смысл искать более короткие дуги до тех вершин графа, в которые входят дуги из перечисленных вершин. И т.д.
f). При заполнении 7-й строки обнаруживаем, что значения строки повторяют 6-ю строку, а значит, алгоритм закончил свою работу.
Составим дерево кратчайших путей:
- корень – вершина 1
- длина кратчайшего пути до вершины 4 была найдена уже на первом шаге – включаем дугу 1-4 в дерево.
- во второй строке стоят кратчайшие пути до вершин 2 и 7, а из диаграммы видно, что эти пути идут через вершину 4.
- в третьей строке стоит кратчайший путь до вершины 6 (содержит три дуги), а из диаграммы видно, что этот пути идет через вершины 4 и 2, и т.д.
Таблица 4.8
¥
¥
¥
¥
¥
Дерево:
Рис. 4.18
5) Отыскать все гамильтоновы циклы графа, изображенного на рис. 4.19.
Рис. 4.19
Решение:
a). Выберем вершину 1 за начальную точку.
b). Выпишем наборы, состоящие из начальной вершины и смежной с ней: 1-2, 1-3, 1-4.
c). Выпишем наборы, состоящие из наборов п. 2 и смежных с ними вершин: 1-2-5, 1-3-4, 1-3-5, 1-4-3, 1-4-5.
d). Выпишем наборы, состоящие из наборов п. 3 и смежных с ними вершин: 1-2-5-3, 1-2-5-4, 1-3-4-5, 1-3-5-4, 1-3-5-2, 1-4-3-5, 1-4-5-3, 1-4-5-2.
e). Выпишем наборы, состоящие из наборов п. 4 и смежных с ними вершин: 1-2-5-3-4, 1-2-5-4-3, 1-3-4-5-2, 1-3-5-4, 1-3-5-2, 1-4-3-5-2, 1-4-5-3, 1-4-5-2, наборы 1-3-5-4, 1-3-5-2, 1-4-5-3, 1-4-5-2 не включают пятую вершину, а значит, не образуют гамильтонова цикла.
f). Замкнем цикл - 1-2-5-3-4-1, 1-2-5-4-3-1, 1-3-4-5-2-1, 1-4-3-5-2-1.
Рис. 4.20 – Дерево гамильтоновых циклов
6) Проверить является ли граф, изображенный на рис. 4.21, эйлеровым, полуэйлеровым или не эйлеровым, в первых двух случаях построить эйлеров цикл или эйлеров путь соответственно.
Рис. 4.21
Решение:
По теореме Эйлера проверим четность степеней вершин графа (посчитаем количество вершин, смежных с данной):
Все степени вершин являются четными (таблица 4.9), значит, граф является эйлеровым. Отыщем эйлеров цикл в графе по алгоритму Флёри, за начало пути возьмем вершину 1.
9) Убираем ребро 5-7 и вершину 5, вернулись в исходную вершину 1.
10) Эйлеров цикл: 1-2-3-4-6-5-4-2-5-7-1 – граф – эйлеров.
Упражнения
1) Для графа построить матрицу смежности:
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2) Для графа построить матрицу достижимости
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3) Для графа построить матрицу инциденций
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
4) Для графов, приведенных на рис. 1-9 выполнить задания:
a). С помощью алгоритма Дейкстры-Прима отыскать минимальное остовное дерево графа.
b). С помощью алгоритма Дейкстры построить дерево кратчайших путей графа.
c). С помощью алгоритма Беллмана построить дерево кратчайших путей графа.
d). Отыскать все гамильтоновы пути в графе, если такие есть.
e). Проверить, является ли граф эйлеровым, полуэйлеровым или не эйлеровым, отыскать эйлеров цикл и эйлеров путь, если такие есть.
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
Вопросы для самоконтроля и повторения
1. Что такое граф? Ориентированный граф?
2. Перечислите основные понятия, связанные с графами
3. Перечислите способы задания графов
4. Что такое матрица смежности, инцидентности, достижимости графа?
5. Какой граф называется связным?
6. Перечислите основные операции над графами.
7. Что такое эйлеров граф? Гамильтонов граф?
8. Перечислите способы построения дерева кратчайших путей графа.
5. Теория кодирования
5.1. Основные понятия теории кодирования
Код – правило, описывающее соответствие знаков или их сочетаний одного алфавита знакам или их сочетаниям другого алфавита; знаки вторичного алфавита, используемые для представления знаков или их сочетаний первичного алфавита.
Кодирование – перевод информации, представленной посредством первичного алфавита, в последовательность кодов.
Декодирование – операция, обратная кодированию, т.е. восстановление информации в первичном алфавите по полученной последовательности кодов.
Алфавитное кодирование – это представление информации в стандартной форме, при которой элементарным синтаксическим единицам языка сообщений (буквам алфавита) последовательно сопоставляются кодовые комбинации символов из некоторого заданного алфавита.
Пусть задан алфавит сообщений А ={a1, a2,…an} состоящий из вечного числа букв – конечное множество. Конечная последовательность букв из А: a = ai1, a i2,…a ik называется словом в алфавите А, а число k - длиной слова a; если k = 0, то слово называют пустым и обозначают Ù.
Множество всех непустых слов конечной длины в алфавите А обозначим А*.
Если S Î A* (S – подмножество множества А*), то слова из S являются сообщениями, а объект, порождающий слова из S – источником сообщений. Источником сообщений может быть человек, автомат и т.д.
Пусть, кроме алфавита А, задан еще алфавит В = {b1, b2,… bm}. Зададим отображение f, которое каждому слову a Î S ставит в соответствие слово b Î В*, где В* — множество всех непустых слов конечной длины в алфавите В.
Слово b будем называть кодом сообщения a, а процесс перехода от слова a к слову b – кодированием.
5.2. Проблема взаимной однозначности
Одним из основных вопросов в кодировании является проблема взаимной однозначности, т.е. возможность по коду b сообщения a однозначно восстановить сообщение a.
Если b = b'b", то b' называется началом, или префиксом, слова b, b" — окончанием, или постфиксом, слова b. Если b' ¹ Ù, то b' называется собственным началом. Если b"¹ Ù, то b" называется собственным окончанием слова b. Схема алфавитного кодирования обладает свойством префикса, если ни один элементарный код не является префиксом другого элементарного кода. Если схема S алфавитного кодирования обладает свойством префикса, то алфавитное кодирование взаимно однозначно.
Условие префиксности не является необходимым, т.е. алфавитное кодирование может быть взаимно-однозначным, но не обладать свойством префиксности.
Слово binbin-1.. bi1 будем называть обратным к слову b = b1b2… bin и обозначать b-1. Схему кодирования, полученную из схемы кодирования S заменой каждого элементарного кода bi на bi-1, будем называть обратной к схеме S и обозначать S-1. Тогда: если схема S или схема S-1 обладает свойством префикса, то тогда алфавитное кодирование, определяемое схемой S(S-1), будет взаимно однозначным.
Общий критерий взаимной однозначности.
Нетривиальное разложение: представим слово b в виде:
b = b'b1b2… binb",
где слово b' не может оканчиваться на элементарный код, а b" не может начинаться с элементарного кода. Причем одно из слов b', b", b1b2… bin может быть пробелом - Ù. Для определения однозначности алгоритма кодирования необходимо выполнить действия в соответствии с алгоритмом:
1). Для каждого элементарного кода выписываем все нетривиальные разложения.
2). Выписываем множество M1, состоящее из слов b', являющихся началом нетривиальных разложений.
3). Выписываем множество M2, состоящее из слов b", являющихся окончаниями нетривиальных разложений.
4). Выписываем множество М = М1 Ç М2 È {Ù}, т.е. множество слов, являющихся как началом, так и окончанием нетривиального разложения и пробел.
5). Выписываем все разложения, связанные с множеством M, т.е.
b = b'b1b2… binb",
где b', b" Î М, причем n может быть равно 0 (заменяется Ù).
6). По полученным разложениям строится ориентированный граф, следующим образом: вершины графа отождествляются с элементами множества М, пара вершин b' и b" соединяются ребрами только в том случае, если существует разложение b'b1b2… binb", ребру приписывается значение b1b2… bin.
7). По полученному графу легко проверить, обладает ли схема кодирования однозначностью.
Теорема А.А. Маркова: алфавитное кодирование со схемой S не обладает свойством взаимной однозначности тогда и только тогда, когда граф содержит ориентированный цикл, проходящий через вершину Ù.
5.3. Коды Хемминга
Коды Хемминга – наиболее известные и, вероятно, первые из самоконтролирующихся и самокорректирующихся кодов. Построены они применительно к двоичной системе счисления. Будем считать, что в канале связи может произойти не более одной ошибки.
Число дополнительных разрядов для построения кодов Хемминга нужно выбрать так, чтобы их хватило для кодирования перечисленных l +1 случаев. Следовательно, необходимо, чтобы выполнялись условия:
2k >= l + 1, 2m <= 2l / l + 1.
Число l называется длиной кода Хемминга, m – число информационных символов, k – число контрольных символов – наименьшее целое число, удовлетворяющее условию 2k >= k + m + 1.
Алгоритм построения кода Хемминга для кода a1a2…am:
1) Определим длину кода Хемминга:
m – число информационных символов,
2k >= k + m +1 – число контрольных символов,
l = m + k – длина кода Хемминга.
2) Представим каждое число i из множества L = {1, 2, … l} в виде k-разрядного числа t = Vk-1Vk-2..V0 . Результат запишем в виде таблицы:
Таблица 5.1
Vk-1
…
V1
V0
…
…
…
…
…
…
…
…
m
3) Разобьем множество L на подмножества следующим образом:
L 0 = {i Î L 0: V0 = 1}
L 1 = {i Î L 1: V1 = 1}
L 2 = {i Î L 2: V2 = 1}
L 3 = {i Î L 3: V3 = 1}
….
Lk-1 = {i Î Lk-1: Vk-1 = 1}
4) Первые элементы (их ровно k) являются степенью числа 2, они определяют номера контрольных разрядов кода Хемминга:
b1 b2 b4 b8…
5) Остальные разряды являются информационными, заполняются исходного сообщения по порядку:
b3 = a1, b5 = a2, b6 = a3, …, bl = am.
6) Контрольные разряды заполняются следующим образом:
b1 = Å bj, bj Î L 0, j ¹ 1,
b2 = Å bj, bj Î L 1, j ¹ 2,
b4 = Å bj, bj Î L 2, j ¹ 4,
b8 = Å bj, bj Î L 3, j ¹ 8.
Обнаружение ошибки в кодах Хемминга
Если при передаче по каналу связи получили сообщение b¢, и известно что при передаче произошла одна ошибка в неизвестном разряде, то можно найти этот разряд, обозначим его t. Для его нахождения представим t в виде двоичного числа: t = V¢k-1V¢k-2.. V¢0.
Найдем эти числа V¢ по формулам:
V¢0 = Å b¢j, b¢j Î L 0,
V¢1 = Å b¢ j, b¢ j Î L 1,
V¢2 = Å b¢ j, b¢ j Î L 2,
……………………..
V¢k-1 = Å b¢j, b¢j Î L 3.
Выберем из таблицы номер разряда, который соответствует этим значениям, именно в этом разряде и произошла ошибка.
Примеры решения задач
1) Выяснить, является ли код однозначно декодируемым?
С(S) = {b1, b1b2, b3b1}
Решение
Код S не является префиксным, кроме того и код S-1 = {b1, b2b1, b1b3} не является префиксным. Однако по коду можно однозначно восстановить исходное слово. Алгоритм следующий:
a). В кодовом слове находим все буквы b2 и выделяем пары b1b2,
b). В кодовом слове находим все буквы b3 и выделяем пары b3b1,
c). Заменяют найденные пары символами исходного алфавита, и определяются оставшиеся буквы b1.
2) Алфавитное кодирование задано схемой S в виде таблицы
Таблица 5.2
a1
a2
a3
a4
a5
b1b2
b1b3b2
b2 b3
b1b2 b1b3
b2 b1b2 b2 b3
C помощью общего критерия взаимной однозначности определить, является ли схема однозначной.
Решение
a) Для каждого элементарного кода выписываем все нетривиальные разложения:
d) Выписываем множество М = М1 Ç М2 È {Ù}, т.е. множество слов, являющихся как началом, так и окончанием нетривиального разложения и пробел.
M = {b2, b1b3, Ù}
e) Выписываем все разложения, связанные с множеством M, т.е.
b = b'b1b2… binb", где b', b" Î М, причем n может быть равно 0 (заменяется Ù).
b2 = (b1b3)Ù(b2)
b4 (b1b2)(b1b3) = Ù b1 b1b3
b5 = (b2)(b1b2)(b2 b3) =(b2) b1b3Ù
f) По полученным разложениям строится ориентированный граф, следующим образом: вершины графа отождествляются с элементами множества М, пара вершин b' и b" соединяются ребрами только в том случае, если существует разложение b'b1b2… binb", ребру приписывается значение b1b2… bin.
Рис. 5.1
g) По полученному графу легко проверить, обладает ли схема кодирования однозначностью. Т.к. в графе есть цикл, проходящий через Ù. то взаимно-однозначного кодирования нет.
h) Найдем слово. декодируемое неоднозначно: начнем выписывать последовательно слова. присвоенные ребрам и вершинам. начиная с пробела и заканчивая пробелом:
b1b2 b1b3 b2 b1b2 b2b3
b1 = (b1b2)(b1b3b2)(b1b2)(b2b3) ® a1 = a1a2a1a3
b2 = (b1b2b1b3)(b2b1b2b2b3) ® a2 = a4a5
3) Пусть задано сообщение a = 1011011 = a1a2a3a4a5a6a7. Для этого сообщения необходимо построить код Хемминга.
Решение
a). Определим длину кода Хемминга:
m = 7, 2k >= k + 10, k = 4, l = 11.
b). Представим каждое число i из множества L = {1, 2, … l} в виде k-разрядного числа t = Vk-1Vk-2..V0 . Результат запишем в виде таблицы 5.3.
с). Разобьем множество L на подмножества следующим образом:
L0 = {1, 3, 5, 7, 9, 11}
L1 = {2, 3, 6, 7, 10, 11}
L2 = {4, 5, 6, 7}
L3 = {8, 9, 10, 11}
Таблица 5.3
V3
V2
V1
V0
d). Первые элементы (их ровно k) являются степенью числа 2, они определяют номера контрольных разрядов кода Хемминга:
b1 b2 b4 b8
e). Остальные разряды являются информационными, заполняются исходного сообщения по порядку:
Автоматом называется дискретный преобразователь информации, способный принимать различные состояния, переходить под воздействием входных сигналов из одного состояния в другое и выдавать выходные сигналы. Если множество состояний автомата, а так же множества входных и выходных сигналов конечны, то автомат называется конечным автоматом.
Математической моделью реального конечного автомата является абстрактный автомат, который имеет один входной канал и один выходной канал.
Для задания конечного автомата S необходимо задавать совокупность из пяти объектов: S(A, X, Y, d, l),
где
A = {a0, a1, a2,..., an} – множество внутренних состояний автомата,
X = {x1, x2,…, xm} – множество входных сигналов (входной алфавит),
хi – буква входного алфавита,
Y = {y1, y2,…, yk} – множество выходных сигналов (выходной алфавит),
d - функция переходов, определяющая состояние автомата a(t+1), в котором автомат будет находиться в момент времени (t+1), в зависимости от состояния автомата a(t) и входного сигнала x(t) в момент времени t, т.е. a(t+1) = d [a(t), x(t)],
l - функция выходов, определяющая значение выходного сигнала y(t) в зависимости от состояния автомата a(t) и входного сигнала x(t) в момент времени t, т.е. y(t) = l[a(t), x(t)].
Применяемые на практике автоматы принято разделять на два класса: автоматы Мили и автоматы Мура, названные так по имени американских ученых, которые впервые начали их изучать.
Закон функционирования автоматов Мили описывается следующей системой уравнений:
a(t + 1) = d[a(t), x(t)],
y(t) = l[a(t), x(t)],
t = 0,1,2,3…
Работа автоматов Мура задается следующими уравнениями:
a(t + 1) = d[a(t), x(t)] ,
y(t) = l[a(t)]
6.2. Способы задания конечного автомата
Чтобы задать конечный автомат S, необходимо описать все элементы множества S = {A, X, Y, d, l} , т.е. необходимо описать входной, выходной алфавиты и алфавит состояний, а также функции переходов d и выходов l. При этом среди множества A = {a0, a1, …, an} необходимо выделить начальное состояния a0, в котором автомат находится в момент времени t = 0. Существует несколько способов задания работы автомата, но наиболее часто используются табличный, графический, задание с помощью булевых функций.
1). Табличный способ. При этом способе автомат Мили описывается двумя таблицами: таблицей переходов и таблицей выходов.
Таблица переходов Таблица выходов
xj\aj
a0
…
an
x1
d(a0,x1)
…
d(an,x1)
…
…
…
…
xm
d(a0,xm)
…
d(an, xm)
xj\aj
a0
…
an
x1
l(a0, x1)
…
l(an, x1)
…
…
…
…
xm
l( a0, xm)
…
l(an, xm)
Строки этих таблиц соответствуют входным сигналам x(t), а столбцы – состояниям. На пересечении столбца ai и строки xj в таблице переходов ставится состояние as = d[ai, xj], в которое автомат перейдет из состояния ai под воздействием сигнала xj; а в таблице выходов – соответствующий этому переходу выходной сигнал yg = l[ai, xj].
Таблица 6.1
Совмещенная таблица переходов и выходов автомата Мили:
xj\ai
a0
…
an
x1
d(a0, x1)/ l(a0, x1)
…
d(an, x1)/ l(an, x1)
…
…
…
…
xm
d(a0, xm)/ l(a0, xm)
…
d(an, xm)/ l(an, xm)
Задание таблиц переходов и выходов полностью описывает работу конечного автомата, поскольку задаются не только сами функции переходов и выходов, но и также все три алфавита: входной, выходной и алфавит состояний.
2). Графический способ задания автомата(задание автомата с помощью графа) – этот способ основан на использовании ориентированных связных графов. Вершины графов соответствуют состояниям автомата, а дуги – переходам между ними. Две вершины графа ai и as соединяются дугой, направленной от ai к as, если в автомате имеется переход из ai в as, т.е. as = d(ai, xj). В автомате Мили дуга отмечается входным сигналом xj, вызвавшим переход, и выходным сигналом yg, который возникает при переходе. Внутри кружочка, обозначающего вершину графа, записывается состояние.
3). Задание с помощью булевых функций – если автомат задан табличной функцией или диаграммой Мура, то возможно задание автомата с помощью булевых функций. Алгоритм задания следующий:
a. Находим числа k, r, s, удовлетворяющие условиям:
2k-1 < m < 2k
2r-1 < n < 2r
2s-1 < p < 2s
где m = |X|, n = |A|, p = |Y| - число символов множеств.
При этом видно, что k, r, s равны числу разрядов, в двоичном представлении чисел m, n, p.
b. Кодируем входные и выходные символы исходного автомата:
Каждому ai Î А взаимно-однозначно ставим в соответствие двоичную последовательность длины r – двоичный код a (а) = a1a2..ar. Аналогично и для каждого x и y: b (x) = b1b2..bk, g (y) = g1g2…gs.
c. Составляем следующую таблицу:
Таблица 6.2
Код входного символа
Код текущего состояния
Код следующего состояния
Код выходного символа
b1
b2
…
bk
a1
a2
…
ar
d1
d2
…
dr
l1
l2
…
ls
b1
b2
…
bk
a1
a2
…
ar
a1’
a2’
…
ar’
g1
g2
…
gs
Эта таблица содержит k + r + r + s столбцов и 2k+1 строк.
d. Заполнение последних столбцов в таблице: для каждой пары (xi, aj) по таблице автомата находим d(x, a) = a’ и l (x, a) = y. Затем находим код a (а) = a1’ a2’..ar’ и g(y) = g1g2…gs.
Примеры решения задач
1). По таблицам Милли и Мура найти выходное слово при входном слове x1x2x2x2x1
Таблица 6.3
Автомат Мили
Автомат Мура
xj\ai
a0
a1
a2
a3
yg
y2
y1
y1
y3
y2
x1
a1/y1
a2/y3
a3/y2
a0/y1
xj/ xj
a0
a1
a2
a3
a4
x2
a0/y2
a0/y1
a3/y1
a2/y3
x1
a2
a1
a3
a4
a2
x2
a3
a4
a4
a0
a1
Для автомата Милли:
a). Изначально автомат находится в состоянии a0. При поступлении на вход первого символа x1 автомат перейдет в состояние a1 и на выходе будет символ y1.
b). При поступлении на вход второго символа x2 автомат находится уже в состоянии a1, состояние изменится на a0, а на выходе получим y1, и т.д.
c). На выходе получим слово y1y1y2y2y1.
Для автомата Мура:
a). Изначально автомат находится в состоянии a0. При поступлении на вход первого символа x1 автомат перейдет в состояние a2 и на выходе будет символ y2.
b). При поступлении на вход второго символа x2 автомат находится уже в состоянии a2, состояние изменится на a4, а на выходе получим y1, и т.д.
c). На выходе получим слово y2y1y2y1y2.
2). Для приведенных в примере 1) таблиц Милли и Мура построить графы для задания автоматов.
Для автомата Милли:
a). Нарисуем четыре вершины графа, каждая из которых соответствует одному из состояний автомата.
b). Соединим две вершины, если есть переход между соответствующими состояниями. Над ребрами напишем через дробь входной и выходной сигнал.
Рис. 6.1
Для автомата Мура:
a). Нарисуем пять вершин графа, каждая из которых соответствует одному из состояний автомата. Через дробь к состоянию припишем соответствующее значение выходного сигнала.
b). Соединим две вершины, если есть переход между соответствующими состояниями. Над ребрами напишем входной сигнал.
Рис. 6.2
3). Представить в виде конечного автомата элемент задержки.
Решение
Элемент задержки представляет собой устройство, имеющее один вход и один выход, причем, значение выходного сигнала в момент времени t совпадает со значением сигнала в предыдущий момент времени. Схематично элемент задержки изобразим следующим образом:
Рис. 6.3
Предположим, что входной, и, следовательно, выходной алфавит есть: X{0,1}, Y{0,1}. Кроме того, А{0,1} – под состоянием элемента задержки в момент времени t понимается содержание элемента памяти в данный момент. Таким образом, а(t) = X(t – 1), Y(t) = а(t) = X(t – 1).
Зададим элемент задержки таблицей, где х1 = 0, х2 = 1, а1 = 0, а2 = 1.
d (x1; a1) = d (0; 0) = 0 l (x1; a1) = l (0; 0) = 0
d (x1; a2) = d (0; 1) = 0 l (x1; a2) = l (0; 1) = 1
d (x2; a1) = d (1; 0) = 1 l (x2; a1) = l (1; 0) = 0
d (x2; a2) = d (1; 1) = 1 l (x2; a2) = l (1; 1) = 1
Таблица 6.4
x\a
d = 0, l = 0
d = 0, l = 1
d = 1, l = 0
d = 1, l = 1
Для представления этого автомата системой булевых функций используем таблицу автомата: находим числа k, r, s, удовлетворяющие условиям:
2k-1 < m < 2k,
2r-1 < n < 2r,
2s-1 < p < 2s,
где m = 2, n = 2, p = 2 - число символов множеств.
При этом видно, что k, r, s равны числу разрядов, в двоичном представлении чисел m, n, p: k = 1, r = 1, s = 1, k + r + r + s = 4, т.о. таблица истинности содержит четыре строки.
Таблица 6.5
x
y
d
l
4). Представить в виде конечного автомата двоичный сумматор последовательного действия.
Решение
Данный сумматор представляет собой устройство, осуществляющее сложение двух чисел в двоичной системе исчисления. На входы сумматора подаются числа х1 и х2, начиная с младших разрядов. На выходе формируется последовательность, соответствующая записи числа х1 + х2 в двоичной системе исчисления.
Рис. 6.4
Входной и выходной алфавит заданы однозначно: Х = {00, 01, 10, 11}, Y = {0, 1}. Множество состояний определяется значением переноса при сложении соответствующих разрядов чисел х1 и х2. Если при сложении некоторых разрядов образовался перенос, то будем считать, что сумматор перешел в состояние a1. При отсутствии переноса будем считать, что сумматор находится в состоянии a0.
Сумматор задается таблицей (если состояние а0, то при комбинациях 00, 01, 10 – сумма будет 0 или 1, при 11 – сумма равна 10, есть перенос – состояние меняется на а1; если состояние а1 – то подразумеваем, что прошлым действием был перенос и 1 держим «в уме», теперь при сложении 00 будет на выходе 1 (с учетом 1 «в уме»), следующее состояние а0 – переноса не было, при сложении 01 или 10, то с учетом единицы в уме получаем 10, наблюдаем перенос и состояние устанавливаем в а1, на выходе 0, при сложении 11, то с учетом единицы в уме получаем 11, наблюдаем перенос и состояние устанавливаем в а1, на выходе 1):
Таблица 6.6
х\а
a0
a1
текущее состояние
a0; 0
a0; 1
следующее состояние; выход
a0; 1
a1; 0
a0; 1
a1; 0
a1; 0
a1; 1
Упражнения
1). По таблице Милли найти выходное слово при входном слове X
1/1
3/0
2/0
2/1
2/1
2/0
3/0
3/1
1.1 X = 10011011001
1.2 X = 01000111101
1.3 X = 01011010101
1.4 X = 01000001100
1.5 X = 11100111101
2). По таблице Милли найти выходное слово при входном слове X