- •1 Описание формальной модели алгоритма на основе рекурсивных функций
- •2 Описание аналитической модели алгоритма в виде элементарных машин тьюринга и композиции мт
- •3 Разработка аналитической и программной модели алгоритма для распознающей машины тьюринга
- •4 Разработка аналитической модели алгоритма с использованием нормальных алгоритмов маркова
- •01X110d
4 Разработка аналитической модели алгоритма с использованием нормальных алгоритмов маркова
Марковская подстановка – это операция над словами, заключающаяся в следующем:
в исходном слове γ ищется самое левое вхождение слова λ, если оно существует, λ заменяется β на в слове γ;
полученное слово γ является результатом применения Марковской подстановки к слову γ;
если λ слово не входит в слово γ, то говорят, что данная Марковская подстановка не применима к слову γ [3].
Задание: реализовать алгоритм над алфавитом , который выдает 1, если исходное слово содержит комбинациюbaccd, и 0 - в противном случае.
Реализация приведена на рисунке 4.1.
Рисунок 4.1 – Правила НАМ
Примеры работы алгоритма представлены на рисунке 4.2 , если слово содержит искомую комбинацию символов. На рисунке 4.3 – не содержит.
abab01baccd110d
abab01x110d
bab01x110d
bb01x110d
b01x110d
01X110d
01x110
0x110
0x10
0x0
x0
x
1
Рисунок 4.2 – Пример работы алгоритма
abad01
bad01
bd01
d01
01
1
0
Рисунок 4.3 – Пример работы алгоритма
ВЫВОДЫ
В ходе выполнения курсовой работы были закреплены навыки работы с рекурсивными функциями, машинами Тьюринга и нормальными алгоритмами Маркова.
Особенно детально были изучены различные одноленточные машины Тьюринга. Также получены навыки построения графика временной сложности алгоритма.
В данной работе разработан программный продукт, демонстрирующий работу распознающей машины Тьюринга для языка L = {wwRwR│w {0,1}*}.
Результатом работы машины является символ “1” или “0”, в зависимости от слова, который записывается после входного слова.
Для данной машины Тьюринга был построен график временной сложности для входных слов длиной от 1 до 13.
ПЕРЕЧЕНЬ ССЫЛОК
1. Введение в теорию алгоритмов [Электронный ресурс]. – Электронные текстовые данные. - Режим доступа: http://th-algoritmov.narod.ru/1.htm
2. Алферова З. В. Теория алгоритмов. – М.: Издательство «Статистика», 1973. – 164 с.
3. Марков А.А. Теория алгорифмов./ А.А. Марков, Н.М. Нагорный - М.: Наука, 1984. -217 с.: ил.
ПРИЛОЖЕНИЕ А
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ, МОЛОДЕЖИ И СПОРТА УКРАИНЫ
ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
К КУРСОВОЙ РАБОТЕ
НА ТЕМУ: «Построение аналитических моделей алгоритмов и
оценка их сложности»
ПО КУРСУ: «Дискретные структуры»
Выдано:
студенту группы ПС-10А
Подтынному С.Д.
Руководитель:
Коломойцева И.А.
____________________
Донецк – 2011
1 Основанием для разработки является задание на курсовую работу, выданное кафедрой прикладной математики и информатики.
2 Целью разработки является создание программной модели машины Тьюринга, распознающей язык L = { wwRwR │w {0,1}* }, расчет и экспериментальная проверка расчета временной сложности МТ.
3 Требования к программе:
–при проверке слова на принадлежность языку необходимо запретить ввод с клавиатуры символов не из входного алфавита заданного языка;
–при проверке слова на принадлежность языку выводить на экран каждый шаг работы машины Тьюринга;
–сохранять протокол работы машины Тьюринга в текстовом файле;
–при построении графика временной сложности работы машины Тьюринга значения для графика получить практически, с помощью созданной программной модели машины Тьюринга; для генерации слов длиной n использовать метод полного перебора.
4 Требования к программной документации:
- пояснительная записка;
- руководство пользователя.
5 Этапы разработки
№ этапа |
Наименование этапа |
Срок выполнения |
1 |
Выдача задания, составление ТЗ и его утверждение. |
2 недели |
2 |
Техническое проектирование. Построение формальных моделей алгоритмов. |
2-4 недели |
3 |
Рабочее проектирование. Определение структур данных для представления МТ, построение алгоритмов. |
4-5 недели |
4 |
Написание программы. |
5-9 недели |
5 |
Отладка программы. |
9-12 недели |
6 |
Написание пояснительной записки. |
9-13 недели |
7 |
Защита курсовой работы. |
13-14 недели |
Приложение Б
Руководство пользователя
Б.1 Назначение программы
Программа предназначена для демонстрации работы одноленточной машины Тьюринга на примере языка L = { wwRwR │w {0,1}* }. Пользователь может проверить введенное им слово на принадлежность языку, сохранить результаты работы в текстовый файл, построить и сохранить график сложности алгоритма для слова выбранной длины.
Б.2 Исполнение программы
Так как программа выполнена на языке C#, то для ее запуска обязательно наличие Microsoft .NET Framework версии, не ниже 4.0. Запуск приложения осуществляется через файл TuringMachine.exe.
При запуске приложения открывается основное окно работы программы, приведенное на рисунке Б.1 , где пользователь может с помощью соответствующих кнопок выполнять интересующие его действия.
Изначально на ленте записано пустое слово. Для смены слова, пользователь должен ввести его в графу “Слово” и ввести начальное состояние, после чего нажать на кнопку “Ввести”. Ввод состояния был внедрен для большей гибкости программы, чтобы пользователь мог начать работу с любого другого состояния.
Файл листинга программы сохраняется автоматически при завершении обработки слова в текущую директорию программы под названием listing.txt.
В нем содержится информация об изменениях слова при выполнении определенных операций над ним.
Для запуска работы машины Тьюринга предназначена кнопка “Старт”, которая начинает автоматически выполнять команды над текущим словом. Работу машины можно приостановить нажав на кнопку “Пауза\Продолжить”. Левее кнопок располагается бегунок, манипулируя которым пользователь может изменять скорость работы машины. Также предусмотрена кнопка “Шаг”, при нажатии на которую, машина выполняет одну команду и выводит текущее состояние, команду на экран.
Ниже располагается поле для ввода длины слова и кнопка “Построить график”, по нажатию на которую начинает строиться график временной сложности данного алгоритма.
Рисунок Б.1 – Главное окно программы
Приложение В
Протоколы работы машины Тьюринга, построенные программно
Протокол 1 (слово принадлежит языку):
Исходное слово - 100101
->100101 | Команда: q01 -> q01R | Состояние: q0
1->00101 | Команда: q00 -> q00R | Состояние: q0
10->0101 | Команда: q00 -> q00R | Состояние: q0
100->101 | Команда: q01 -> q01R | Состояние: q0
1001->01 | Команда: q00 -> q00R | Состояние: q0
10010->1 | Команда: q01 -> q01R | Состояние: q0
100101 | Команда: q0~ -> q1*L | Состояние: q0
10010->1*| Команда: q11 -> q2bL | Состояние: q1
1001->0b* | Команда: q20 -> q3aL | Состояние: q2
100->1ab* | Команда: q31 -> q4bR | Состояние: q3
100b->ab* | Команда: q4a -> q4aR | Состояние: q4
100ba->b* | Команда: q4b -> q4bR | Состояние: q4
100bab->* | Команда: q4* -> q4*R | Состояние: q4
100bab* | Команда: q4~ -> q1dL | Состояние: q4
100bab->*d | Команда: q1* -> q1*L | Состояние: q1
100ba->b*d | Команда: q1b -> q1bL | Состояние: q1
100b->ab*d | Команда: q1a -> q1aL | Состояние: q1
100->bab*d | Команда: q1b -> q1bL | Состояние: q1
10->0bab*d | Команда: q10 -> q2aL | Состояние: q1
1->0abab*d | Команда: q20 -> q3aL | Состояние: q2
->1aabab*d | Команда: q31 -> q4bR | Состояние: q3
b->aabab*d | Команда: q4a -> q4aR | Состояние: q4
ba->abab*d | Команда: q4a -> q4aR | Состояние: q4
baa->bab*d | Команда: q4b -> q4bR | Состояние: q4
baab->ab*d | Команда: q4a -> q4aR | Состояние: q4
baaba->b*d | Команда: q4b -> q4bR | Состояние: q4
baabab->*d | Команда: q4* -> q4*R | Состояние: q4
baabab*->d | Команда: q4d -> q4dR | Состояние: q4
baabab*d | Команда: q4~ -> q1dL | Состояние: q4
baabab*->dd | Команда: q1d -> q1dL | Состояние: q1
baabab->*dd | Команда: q1* -> q1*L | Состояние: q1
baaba->b*dd | Команда: q1b -> q1bL | Состояние: q1
baab->ab*dd | Команда: q1a -> q1aL | Состояние: q1
baa->bab*dd | Команда: q1b -> q1bL | Состояние: q1
ba->abab*dd | Команда: q1a -> q1aL | Состояние: q1
b->aabab*dd | Команда: q1a -> q1aL | Состояние: q1
->baabab*dd | Команда: q1b -> q1bL | Состояние: q1
baabab*dd | Команда: q1~ -> q9~R | Состояние: q1
->baabab*dd | Команда: q9b -> q9bR | Состояние: q9
b->aabab*dd | Команда: q9a -> q9aR | Состояние: q9
ba->abab*dd | Команда: q9a -> q9aR | Состояние: q9
baa->bab*dd | Команда: q9b -> q9bR | Состояние: q9
baab->ab*dd | Команда: q9a -> q9aR | Состояние: q9
baaba->b*dd | Команда: q9b -> q9bR | Состояние: q9
baabab->*dd | Команда: q9* -> q9*R | Состояние: q9
baabab*->dd | Команда: q9d -> q10mL | Состояние: q9
baabab->*md | Команда: q10* -> q10*L | Состояние: q10
baaba->b*md | Команда: q10b -> q9oR | Состояние: q10
baabao->*md | Команда: q9* -> q9*R | Состояние: q9
baabao*->md | Команда: q9m -> q9mR | Состояние: q9
baabao*m->d | Команда: q9d -> q10mL | Состояние: q9
baabao*->mm | Команда: q10m -> q10mL | Состояние: q10
baabao->*mm | Команда: q10* -> q10*L | Состояние: q10
baaba->o*mm | Команда: q10o -> q10oL | Состояние: q10
baab->ao*mm | Команда: q10a -> q9pR | Состояние: q10
baabp->o*mm | Команда: q9o -> q9oR | Состояние: q9
baabpo->*mm | Команда: q9* -> q9*R | Состояние: q9
baabpo*->mm | Команда: q9m -> q9mR | Состояние: q9
baabpo*m->m | Команда: q9m -> q9mR | Состояние: q9
baabpo*mm | Команда: q9~ -> q11~L | Состояние: q9
baabpo*m->m | Команда: q11m -> q12dL | Состояние: q11
baabpo*->md | Команда: q12m -> q12mL | Состояние: q12
baabpo->*md | Команда: q12* -> q12*L | Состояние: q12
baabp->o*md | Команда: q12o -> q12oL | Состояние: q12
baab->po*md | Команда: q12p -> q12pL | Состояние: q12
baa->bpo*md | Команда: q12b -> q11nR | Состояние: q12
baan->po*md | Команда: q11p -> q11pR | Состояние: q11
baanp->o*md | Команда: q11o -> q11oR | Состояние: q11
baanpo->*md | Команда: q11* -> q11*R | Состояние: q11
baanpo*->md | Команда: q11m -> q12dL | Состояние: q11
baanpo->*dd | Команда: q12* -> q12*L | Состояние: q12
baanp->o*dd | Команда: q12o -> q12oL | Состояние: q12
baan->po*dd | Команда: q12p -> q12pL | Состояние: q12
baa->npo*dd | Команда: q12n -> q12nL | Состояние: q12
ba->anpo*dd | Команда: q12a -> q11hR | Состояние: q12
bah->npo*dd | Команда: q11n -> q11nR | Состояние: q11
bahn->po*dd | Команда: q11p -> q11pR | Состояние: q11
bahnp->o*dd | Команда: q11o -> q11oR | Состояние: q11
bahnpo->*dd | Команда: q11* -> q11*R | Состояние: q11
bahnpo*->dd | Команда: q11d -> q11dR | Состояние: q11
bahnpo*d->d | Команда: q11d -> q11dR | Состояние: q11
bahnpo*dd | Команда: q11~ -> q13~L | Состояние: q11
bahnpo*d->d | Команда: q13d -> q13dL | Состояние: q13
bahnpo*->dd | Команда: q13d -> q13dL | Состояние: q13
bahnpo->*dd | Команда: q13* -> q13*L | Состояние: q13
bahnp->o*dd | Команда: q13o -> q191R | Состояние: q13
bahnp1->*dd | Команда: q19* -> q19*L | Состояние: q19
bahnp->1*dd | Команда: q191 -> q191L | Состояние: q19
bahn->p1*dd | Команда: q19p -> q19pL | Состояние: q19
bah->np1*dd | Команда: q19n -> q201R | Состояние: q19
bah1->p1*dd | Команда: q20p -> q20pR | Состояние: q20
bah1p->1*dd | Команда: q201 -> q201R | Состояние: q20
bah1p1->*dd | Команда: q20* -> q13*L | Состояние: q20
bah1p->1*dd | Команда: q131 -> q131L | Состояние: q13
bah1->p1*dd | Команда: q13p -> q140R | Состояние: q13
bah10->1*dd | Команда: q141 -> q141L | Состояние: q14
bah1->01*dd | Команда: q140 -> q140L | Состояние: q14
bah->101*dd | Команда: q141 -> q141L | Состояние: q14
ba->h101*dd | Команда: q14h -> q150R | Состояние: q14
ba0->101*dd | Команда: q151 -> q151R | Состояние: q15
ba01->01*dd | Команда: q150 -> q150R | Состояние: q15
ba010->1*dd | Команда: q151 -> q151R | Состояние: q15
ba0101->*dd | Команда: q15* -> q13*L | Состояние: q15
ba010->1*dd | Команда: q131 -> q131L | Состояние: q13
ba01->01*dd | Команда: q130 -> q130L | Состояние: q13
ba0->101*dd | Команда: q131 -> q131L | Состояние: q13
ba->0101*dd | Команда: q130 -> q130L | Состояние: q13
b->a0101*dd | Команда: q13a -> q9aR | Состояние: q13
ba->0101*dd | Команда: q90 -> q90R | Состояние: q9
ba0->101*dd | Команда: q91 -> q91R | Состояние: q9
ba01->01*dd | Команда: q90 -> q90R | Состояние: q9
ba010->1*dd | Команда: q91 -> q91R | Состояние: q9
ba0101->*dd | Команда: q9* -> q9*R | Состояние: q9
ba0101*->dd | Команда: q9d -> q10mL | Состояние: q9
ba0101->*md | Команда: q10* -> q10*L | Состояние: q10
ba010->1*md | Команда: q101 -> q9nR | Состояние: q10
ba010n->*md | Команда: q9* -> q9*R | Состояние: q9
ba010n*->md | Команда: q9m -> q9mR | Состояние: q9
ba010n*m->d | Команда: q9d -> q10mL | Состояние: q9
ba010n*->mm | Команда: q10m -> q10mL | Состояние: q10
ba010n->*mm | Команда: q10* -> q10*L | Состояние: q10
ba010->n*mm | Команда: q10n -> q10nL | Состояние: q10
ba01->0n*mm | Команда: q100 -> q9hR | Состояние: q10
ba01h->n*mm | Команда: q9n -> q9nR | Состояние: q9
ba01hn->*mm | Команда: q9* -> q9*R | Состояние: q9
ba01hn*->mm | Команда: q9m -> q9mR | Состояние: q9
ba01hn*m->m | Команда: q9m -> q9mR | Состояние: q9
ba01hn*mm | Команда: q9~ -> q11~L | Состояние: q9
ba01hn*m->m | Команда: q11m -> q12dL | Состояние: q11
ba01hn*->md | Команда: q12m -> q12mL | Состояние: q12
ba01hn->*md | Команда: q12* -> q12*L | Состояние: q12
ba01h->n*md | Команда: q12n -> q12nL | Состояние: q12
ba01->hn*md | Команда: q12h -> q12hL | Состояние: q12
ba0->1hn*md | Команда: q121 -> q161R | Состояние: q12
ba01->hn*md | Команда: q16h -> q16hL | Состояние: q16
ba0->1hn*md | Команда: q161 -> q21vL | Состояние: q16
ba->0vhn*md | Команда: q210 -> q210L | Состояние: q21
b->a0vhn*md | Команда: q21a -> q21aL | Состояние: q21
->ba0vhn*md | Команда: q21b -> q21bL | Состояние: q21
ba0vhn*md | Команда: q21~ -> q22~R | Состояние: q21
->ba0vhn*md | Команда: q22b -> q23vR | Состояние: q22
v->a0vhn*md | Команда: q23a -> q23aR | Состояние: q23
va->0vhn*md | Команда: q230 -> q230R | Состояние: q23
va0->vhn*md | Команда: q23v -> q23vR | Состояние: q23
va0v->hn*md | Команда: q23h -> q16hL | Состояние: q23
va0->vhn*md | Команда: q16v -> q16vL | Состояние: q16
va->0vhn*md | Команда: q160 -> q17uL | Состояние: q16
v->auvhn*md | Команда: q17a -> q17aL | Состояние: q17
->vauvhn*md | Команда: q17v -> q17vL | Состояние: q17
vauvhn*md | Команда: q17~ -> q24~R | Состояние: q17
->vauvhn*md | Команда: q24v -> q24vR | Состояние: q24
v->auvhn*md | Команда: q24a -> q25uR | Состояние: q24
vu->uvhn*md | Команда: q25u -> q25uR | Состояние: q25
vuu->vhn*md | Команда: q25v -> q25vR | Состояние: q25
vuuv->hn*md | Команда: q25h -> q16hL | Состояние: q25
vuu->vhn*md | Команда: q16v -> q16vL | Состояние: q16
vu->uvhn*md | Команда: q16u -> q16uL | Состояние: q16
v->uuvhn*md | Команда: q16u -> q16uL | Состояние: q16
->vuuvhn*md | Команда: q16v -> q16vL | Состояние: q16
vuuvhn*md | Команда: q16~ -> q18~R | Состояние: q16
->vuuvhn*md | Команда: q18v -> q18vR | Состояние: q18
v->uuvhn*md | Команда: q18u -> q18uR | Состояние: q18
vu->uvhn*md | Команда: q18u -> q18uR | Состояние: q18
vuu->vhn*md | Команда: q18v -> q18vR | Состояние: q18
vuuv->hn*md | Команда: q18h -> q18hR | Состояние: q18
vuuvh->n*md | Команда: q18n -> q18nR | Состояние: q18
vuuvhn->*md | Команда: q18* -> q18*R | Состояние: q18
vuuvhn*->md | Команда: q18m -> q18mR | Состояние: q18
vuuvhn*m->d | Команда: q18d -> q18dR | Состояние: q18
vuuvhn*md | Команда: q18~ -> q26~L | Состояние: q18
vuuvhn*m->d | Команда: q26d -> q26~L | Состояние: q26
vuuvhn*->m | Команда: q26m -> q26~L | Состояние: q26
vuuvhn->* | Команда: q26* -> q31*R | Состояние: q26
vuuvhn* | Команда: q31~ -> q311L | Состояние: q31
vuuvhn->*1 | Команда: q31* -> q30*L | Состояние: q31
vuuvh->n*1 | Команда: q30n -> q301L | Состояние: q30
vuuv->h1*1 | Команда: q30h -> q300L | Состояние: q30
vuu->v01*1 | Команда: q30v -> q301L | Состояние: q30
vu->u101*1 | Команда: q30u -> q300L | Состояние: q30
v->u0101*1 | Команда: q30u -> q300L | Состояние: q30
->v00101*1 | Команда: q30v -> q301L | Состояние: q30
100101*1 | Команда: q30~ -> qz~R | Состояние: q30
Протокол 2 (слово не принадлежит языку)
Исходное слово - 010
->010 | Команда: q00 -> q00R | Состояние: q0
0->10 | Команда: q01 -> q01R | Состояние: q0
01->0 | Команда: q00 -> q00R | Состояние: q0
010 | Команда: q0~ -> q1*L | Состояние: q0
01->0* | Команда: q10 -> q2aL | Состояние: q1
0->1a* | Команда: q21 -> q3bL | Состояние: q2
->0ba* | Команда: q30 -> q4aR | Состояние: q3
a->ba* | Команда: q4b -> q4bR | Состояние: q4
ab->a* | Команда: q4a -> q4aR | Состояние: q4
aba->* | Команда: q4* -> q4*R | Состояние: q4
aba* | Команда: q4~ -> q1dL | Состояние: q4
aba->*d | Команда: q1* -> q1*L | Состояние: q1
ab->a*d | Команда: q1a -> q1aL | Состояние: q1
a->ba*d | Команда: q1b -> q1bL | Состояние: q1
->aba*d | Команда: q1a -> q1aL | Состояние: q1
aba*d | Команда: q1~ -> q9~R | Состояние: q1
->aba*d | Команда: q9a -> q9aR | Состояние: q9
a->ba*d | Команда: q9b -> q9bR | Состояние: q9
ab->a*d | Команда: q9a -> q9aR | Состояние: q9
aba->*d | Команда: q9* -> q9*R | Состояние: q9
aba*->d | Команда: q9d -> q10mL | Состояние: q9
aba->*m | Команда: q10* -> q10*L | Состояние: q10
ab->a*m | Команда: q10a -> q9pR | Состояние: q10
abp->*m | Команда: q9* -> q9*R | Состояние: q9
abp*->m | Команда: q9m -> q9mR | Состояние: q9
abp*m | Команда: q9~ -> q11~L | Состояние: q9
abp*->m | Команда: q11m -> q12dL | Состояние: q11
abp->*d | Команда: q12* -> q12*L | Состояние: q12
ab->p*d | Команда: q12p -> q12pL | Состояние: q12
a->bp*d | Команда: q12b -> q11nR | Состояние: q12
an->p*d | Команда: q11p -> q11pR | Состояние: q11
anp->*d | Команда: q11* -> q11*R | Состояние: q11
anp*->d | Команда: q11d -> q11dR | Состояние: q11
anp*d | Команда: q11~ -> q13~L | Состояние: q11
anp*->d | Команда: q13d -> q13dL | Состояние: q13
anp->*d | Команда: q13* -> q13*L | Состояние: q13
an->p*d | Команда: q13p -> q140R | Состояние: q13
an0->*d | Команда: q14* -> q14*L | Состояние: q14
an->0*d | Команда: q140 -> q140L | Состояние: q14
a->n0*d | Команда: q14n -> q27nR | Состояние: q14
an->0*d | Команда: q270 -> q270R | Состояние: q27
an0->*d | Команда: q27* -> q27*R | Состояние: q27
an0*->d | Команда: q27d -> q27dR | Состояние: q27
an0*d | Команда: q27~ -> q28~L | Состояние: q27
an0*->d | Команда: q28d -> q28~L | Состояние: q28
an0->* | Команда: q28* -> q29*R | Состояние: q28
an0* | Команда: q29~ -> q310L | Состояние: q29
an0->*0 | Команда: q31* -> q30*L | Состояние: q31
an->0*0 | Команда: q300 -> q300L | Состояние: q30
a->n0*0 | Команда: q30n -> q301L | Состояние: q30
->a10*0 | Команда: q30a -> q300L | Состояние: q30
010*0 | Команда: q30~ -> qz~R | Состояние: q30
Приложение Д
Исходный код программы
//Основная форма.Содержит: машина Тьюринга, построение маленького эскиза графика
// Form1.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Threading;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.IO;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace TuringMachine
{
delegate void TheDelegate();
delegate int IntDelegate();
delegate void ParamDelegate(double a);
public partial class Form1 : Form
{
private int location = 0; //положение УУ на МТ
private int steps= 0; // Количество проходов УУ по элементу слова
private static String shortState; //кортоткая форма номера состония (Например,q0)
private String state; //Полное состояние МТ (Например, q00R)
int currWordLength = 0; //Длина текущего слова
private int index = 0; // Индекс элемента в массиве max
public static int[] max = new int[20]; //Массив, содержащий в себе пару "длина слова-максимальное количество тактов"
private int RandomWordLength = 0; //Вводимая пользователем длина слова, для построения графика
String[] keyv = new String[2]; //Массив команд вида: q00->q00R
private bool flag = true; //Признак: работает МТ в текущий момент или нет.
private bool second_flag = true; // Признак: проводить ли рендеринг движения УУ или нет.
private static int WordLength; //Длина введенного пользователем слова
private static Label[] ribbon = new Label[200]; //Лента МТ
StreamWriter strwr = new StreamWriter(@"./listing.txt"); // Поток-писатель для выведения листинга в файл
private String curstate; //Текущее состояние МТ
private SortedList<String, String> mtstates = new SortedList<String, String>(); //Контейнер для всех состояний МТ
Thread okras; // Второй поток для параллельного рендеринга
public Form1()
{
InitializeComponent();
int i; trackBar1.Value = 250; chart1.Series[0].Name = "";
chart1.Series[0].Color = Color.Red;
textBox1.Text = File.ReadAllText(@"D:/МТ_Моя.txt");
for (int j = 0; j < textBox1.Lines.Length; j++)
{
if (textBox1.Lines[j].Equals(""))
continue;
keyv[0] = Splited(textBox1.Lines[j])[0];
keyv[1] = Splited(textBox1.Lines[j])[2];
mtstates.Add(keyv[0], keyv[1]);
}
for (int j = 0; j < 20; j++)
max[j] = new int();
state = Splited(textBox1.Lines[0])[2];
for (i = 0; i < 50; i++)
{
ribbon[i] = new Label();
ribbon[i].Text = "~";
ribbon[i].Size = label1.Size;
ribbon[i].Location = new Point(0 + (i) * ribbon[i].Width, 0);
ribbon[i].Font = label1.Font;
ribbon[i].BackColor = Color.White;
ribbon[i].BorderStyle = BorderStyle.FixedSingle;
panel1.Controls.Add(ribbon[i]);
}
}
private void button2_Click(object sender, EventArgs e)
{
button2.Enabled = false;
okras = new Thread(new ThreadStart(Paint_Label));
okras.Start();
}
public void State()
{
textBox3.Text = curstate;
}
public void Button2Enabled()
{
button2.Enabled = true; ;
}
public void Replace()
{
ribbon[location + 10].Text = state[state.Length - 2].ToString();
}
public void ShowState()
{
textBox4.Text = curstate + ribbon[location + 10].Text + "->" + state;
}
public int TrackBar()
{
return trackBar1.Value;
}
public void Paint_Label()
{
TheDelegate deli = new TheDelegate(State);
TheDelegate enbl = new TheDelegate(Button2Enabled);
while (true)
{
shortState = state.Remove(state.Length - 2, 2);
if (shortState.Equals("qz"))
{
if (second_flag == true)
{
MessageBox.Show("Машина Тьюринга завершила свою работу.", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
steps = 0;
shortState = "q0";
curstate = "qz";
Invoke(deli);
ribbon[location + 10].BackColor = Color.SkyBlue;
ribbon[location + 9].BackColor = Color.White;
}
Invoke(enbl);
return;
}
try
{
Steps(mtstates[String.Concat(shortState + ribbon[location + 10].Text)], shortState, second_flag);
}
catch (Exception e)
{
MessageBox.Show(String.Concat(shortState + ribbon[location + 10].Text) + " отсутствует в словаре", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
Invoke(enbl);
okras.Abort();
break;
}
}
}
public String ToFile()
{
return String.Concat(shortState + ribbon[location + 10].Text) + " -> " + mtstates[String.Concat(shortState + ribbon[location + 10].Text)];
}
void PrintDataToFile()
{
String str = "";
for (int k = 0; k < 50; k++)
{
if (!ribbon[k].Text.Equals("~"))
{
if (currWordLength - 10 == location)
str = str + "->" + ribbon[currWordLength].Text;
else
str = str + ribbon[currWordLength].Text;
}
currWordLength++;
}
strwr.WriteLine(str + " | Команда: " + ToFile() +" | Состояние: "+ shortState + "\n");
strwr.WriteLine("");
strwr.Flush();
currWordLength = 0;
}
public void Steps(String state, String shortState, bool graph)
{
if (graph == true)
{
PrintDataToFile();
}
TheDelegate deli = new TheDelegate(State);
TheDelegate deli_zamena = new TheDelegate(Replace);
TheDelegate deli_show = new TheDelegate(ShowState);
IntDelegate deli_track = new IntDelegate(TrackBar);
this.state = state;
switch (state[state.Length - 1])
{
case 'L':
curstate = shortState;
if (graph == true)
{
ribbon[location + 10].BackColor = Color.SkyBlue;
Invoke(deli_show);
ribbon[location + 9].BackColor = Color.White;
Invoke(deli);
Thread.Sleep(Convert.ToInt32(Invoke(deli_track)));
ribbon[location + 10].BackColor = Color.White;
ribbon[location + 9].BackColor = Color.White;
}
Invoke(deli_zamena);
location--;
steps++;
break;
case 'R':
curstate = shortState;
if (graph == true)
{
ribbon[location + 10].BackColor = Color.SkyBlue;
Invoke(deli_show);
ribbon[location + 9].BackColor = Color.White;
Invoke(deli);
}
Invoke(deli_zamena);
location++; steps++;
if (graph == true)
Thread.Sleep(Convert.ToInt32(Invoke(deli_track))); break;
}
}
private void заполнитьToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.InitialDirectory = "D:\\";
dialog.Filter = "Text documents (*.txt*)|*.txt*";
dialog.RestoreDirectory = true;
if (dialog.ShowDialog() == DialogResult.OK)
{
try
{
dialog.OpenFile();
textBox1.Text = File.ReadAllText(dialog.FileName);
for (int j = 0; j < textBox1.Lines.Length; j++)
{
if (textBox1.Lines[j].Equals(""))
continue;
keyv[0] = Splited(textBox1.Lines[j])[0];
keyv[1] = Splited(textBox1.Lines[j])[2];
mtstates.Add(keyv[0], keyv[1]);
}
state = Splited(textBox1.Lines[0])[2];
}
catch (ArgumentException ec)
{
MessageBox.Show(ec.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); textBox4.Text = "";
}
}
}
public String[] Splited(String str)
{
String delimeter = "->";
String[] first = new String[3];
first = str.Split(delimeter.ToCharArray());
return first;
}
private void button3_Click(object sender, EventArgs e)
{
if (textBox3.Text.Equals("") || textBox2.Text.Equals(""))
{ MessageBox.Show("Машина Тьюринга не запущена!"); return; }
if (textBox3.Text.Equals("qz"))
{ MessageBox.Show("Машина Тьюринга завершила свою работу!"); return; }
if (flag == true)
{
if (okras == null)
{
MessageBox.Show("Работа машины не начата.");
return;
}
if (okras.IsAlive == true)
{
okras.Suspend();
flag = false;
}
else
MessageBox.Show("Работа машины завершена.");
}
else
{
okras.Resume();
flag = true;
}
}
private void button4_Click(object sender, EventArgs e)
{
max[0] = 12; index = 0; button2.Enabled = true;
strwr.WriteLine("Листинг машины Тьюринга:");
strwr.WriteLine("");
strwr.WriteLine("Исходное слово - " + textBox2.Text);
strwr.WriteLine("");
if (textBox3.TextLength == 0)
{ MessageBox.Show("Введите состояние.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
string pattern = "\\bq((\\d\\d)|(\\d))\\b";
Regex rgx = new Regex(pattern);
Match isMatch = rgx.Match(textBox3.Text);
if (isMatch.Value == "")
{
MessageBox.Show("Состояние введено неверно.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return;
}
for (int j = 0; j < 50; j++)
ribbon[j].Text = "~"; location = 0;
String template = textBox2.Text;
WordLength = textBox2.TextLength;
state = textBox3.Text + state.Remove(0, state.Length - 2);
int i = 0;
while (i < textBox2.TextLength)
{
ribbon[i + 10].Text = Convert.ToString(template[i]);
i++;
}
}
private void button5_Click(object sender, EventArgs e)
{
TheDelegate deli = new TheDelegate(State);
TheDelegate enbl = new TheDelegate(Button2Enabled);
shortState = state.Remove(state.Length - 2, 2);
if (shortState.Equals("qz"))
{
MessageBox.Show("Машина Тьюринга завершила свою работу.", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
curstate = "qz";
Invoke(deli);
Invoke(enbl);
ribbon[location + 10].BackColor = Color.SkyBlue;
ribbon[location + 9].BackColor = Color.White;
return;
}
try
{
StepByStep(mtstates[String.Concat(shortState + ribbon[location + 10].Text)], shortState);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
textBox4.Text = ""; Invoke(enbl);
}
}
public void StepByStep(String state, String shortState)
{
TheDelegate deli = new TheDelegate(State);
TheDelegate deli_zamena = new TheDelegate(Replace);
TheDelegate deli_show = new TheDelegate(ShowState);
this.state = state;
PrintDataToFile();
switch (state[state.Length - 1])
{
case 'L':
curstate = shortState;
ribbon[location + 10].BackColor = Color.SkyBlue;
Invoke(deli_show);
Invoke(deli_zamena);
ribbon[location + 9].BackColor = Color.White;
ribbon[location + 11].BackColor = Color.White;
Invoke(deli);
location--; steps++;
break;
case 'R':
curstate = shortState;
ribbon[location + 10].BackColor = Color.SkyBlue;
Invoke(deli_show);
Invoke(deli_zamena);
ribbon[location + 9].BackColor = Color.White;
ribbon[location + 11].BackColor = Color.White;
Invoke(deli);
location++; steps++;
break;
}
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
{
string str = e.KeyChar.ToString();
if (System.Text.RegularExpressions.Regex.IsMatch(str, @"[^0-1\b]$"))
{
e.Handled = true;
}
}
}
private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
{
string str = e.KeyChar.ToString();
if (System.Text.RegularExpressions.Regex.IsMatch(str, @"[^\bq\d]$"))
{
e.Handled = true;
}
}
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
toolTip1.SetToolTip(trackBar1, "Скорость работы МТ. Текущая скорость - " + trackBar1.Value.ToString() + " мс");
}
WordGenerator wh;
private void button1_Click(object sender, EventArgs e)
{
max[0] = 12;
state = "q00R"; index = 0;
if (textBox5.TextLength == 0)
{ MessageBox.Show("Введите длину слова (в пределах разумного).", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
Int32 r = Convert.ToInt32(textBox5.Text); WordLength = r;
wh = new WordGenerator(0, r, "01");
ParamDelegate pamd = new ParamDelegate(ProgressBarRender);
double progress = 0.0;
double progr = 100.00 / r;
progressBar1.Value = 0;
while (true)
{
for (int i = 0; i < 50; i++)
{
ribbon[i].Text = "~";
}
curstate = "q0";
int p = 0;
try
{
String temp = wh.NextWord(ref p);
if (!temp.Equals(""))
{
if (temp.Length > RandomWordLength)
{
index++; pamd(progress);
progress = progress + progr;
}
for (int i = 0; i < temp.Length; i++)
{
ribbon[i + 10].Text = temp[i].ToString();
}
second_flag = false;
state = "q00R";
pamd(progress);
Paint_Label();
if (steps > max[index])
max[index] = steps;
steps = 0;
second_flag = true;
RandomWordLength = temp.Length;
}
}
catch (Exception ec)
{ RandomWordLength = 0; ; GraphicRender(); return; }
for (int i = 0; i < 50; i++)
{
ribbon[i].Text = "~";
}
}
}
private void button6_Click(object sender, EventArgs e)
{
for (int i = 0; i < index+1; i++)
{
MessageBox.Show(max[i].ToString());
}
}
public void ProgressBarRender(double a)
{
progressBar1.Value = Convert.ToInt32(Math.Round(a));
}
public void GraphicRender(){
chart1.Series.Clear();
Series mainGrapgh = new Series();
mainGrapgh.ChartType = SeriesChartType.Line;
chart1.Series.Add(mainGrapgh);
chart1.Series[0].Color = Color.Red;
mainGrapgh.Name = "ГС";
Point[] points = new Point[index + 1];
for (int i = 0; i < index + 1; i++)
{
points[i] = new Point(i, chart1.Size.Height + max[i]);
chart1.Series[0].Points.AddXY(i,max[i]);
if (i % 3 == 0)
{
chart1.Series[0].Points[i].MarkerColor = Color.ForestGreen;
chart1.Series[0].Points[i].MarkerStyle = MarkerStyle.Circle;
chart1.Series[0].Points[i].MarkerSize = 3;
}
chart1.Series[0].Points[i].Label = max[i].ToString();
}
}
private void chart1_Click(object sender, EventArgs e)
{
График graph = new График();
graph.Show();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
strwr.Close();
Environment.Exit(0);
}
private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
{
{
string str = e.KeyChar.ToString();
if (System.Text.RegularExpressions.Regex.IsMatch(str, @"[^\b\d]$"))
{
e.Handled = true;
}
}
}
}
}
//Дополнительная форма. Содержит: построение большого графика
//График.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms.DataVisualization.Charting;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TuringMachine
{
public partial class График : Form
{
public График()
{
InitializeComponent();
RenderGraph(ref Form1.max);
}
void RenderGraph(ref Int32[] max)
{
int i = 0;
chart1.Series.Clear();
Series mainGrapgh = new Series();
Series highGrapgh = new Series();
Series lowGraph = new Series();
Series lowGraph2 = new Series();
mainGrapgh.ChartType = SeriesChartType.Line;
highGrapgh.ChartType = SeriesChartType.Point;
lowGraph.ChartType = SeriesChartType.Point;
lowGraph2.ChartType = SeriesChartType.Point;
chart1.Series.Add(mainGrapgh);
chart1.Series.Add(highGrapgh);
chart1.Series.Add(lowGraph);
chart1.Series.Add(lowGraph2);
highGrapgh.Name = "2(n^2)+16n +15"; highGrapgh.Color = Color.Gray;
mainGrapgh.Name = "T(n)"; mainGrapgh.Color = Color.Red;
lowGraph.Name = "0,5(n^2)+2n+13"; lowGraph.Color = Color.SkyBlue;
lowGraph2.Name = "0,5(n^2)+5n+6"; lowGraph2.Color = Color.Gold;
while (max[i] != 0) i++;
chart1.Refresh();
Point[] points = new Point[i];
int lowgraph2 = 1; int lowgraph = 0;
int highgraph = 0; int lowPoint = 0; int low2Point = 0;
for (int j = 0; j < i; j++)
{
points[j] = new Point(j,max[j]);
chart1.Series[0].Points.AddXY(j, max[j]);
chart1.Series[0].Points[j].Label = max[j].ToString();
chart1.Series[0].Points[j].MarkerColor = Color.ForestGreen;
chart1.Series[0].Points[j].MarkerSize = 10;
chart1.Series[0].Points[j].MarkerStyle = MarkerStyle.Circle;
if (j % 3 == 0)
{
chart1.Series[1].Points.AddXY(j, 2 * Math.Pow(j, 2)+16*j+12);
chart1.Series[1].Points[highgraph].MarkerColor = Color.Gray;
chart1.Series[1].Points[highgraph].MarkerSize = 7;
chart1.Series[1].Points[highgraph].MarkerStyle = MarkerStyle.Circle;
highgraph++;
}
if (lowgraph < j)
{
chart1.Series[2].Points.AddXY(j, 0.5* Math.Pow(j, 2) + 2 * j + 13);
chart1.Series[2].Points[lowPoint].MarkerColor = Color.SkyBlue;
chart1.Series[2].Points[lowPoint].MarkerSize = 7;
chart1.Series[2].Points[lowPoint].MarkerStyle = MarkerStyle.Circle;
lowPoint++;lowgraph = lowgraph + 3;
}
if (lowgraph2 < j)
{
chart1.Series[3].Points.AddXY(j, 0.5 * Math.Pow(j, 2) + 5 * j + 6);
chart1.Series[3].Points[low2Point].MarkerColor = Color.Gold;
chart1.Series[3].Points[low2Point].MarkerSize = 7;
chart1.Series[3].Points[low2Point].MarkerStyle = MarkerStyle.Circle;
low2Point++;
lowgraph2 = lowgraph2 + 3;
}
}
}
private void сохранитьКакToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog dialog = new SaveFileDialog();
dialog.InitialDirectory = "D:\\";
dialog.Filter = "Image (*.jpg*)|*.jpg*";
dialog.RestoreDirectory = true;
if (dialog.ShowDialog() == DialogResult.OK)
{
try
{
chart1.SaveImage(dialog.FileName, ChartImageFormat.Jpeg);
}
catch (ArgumentException ec)
{
MessageBox.Show(ec.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);;
}
}
}
}
}
//Дополнительный клас. Содержит: генератор всех слов языка
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TuringMachine
{
class WordGenerator
{
/// <summary>
/// Минимальная длина слова
/// </summary>
private int minlength;
/// <summary>
/// Текущая длина слова
/// </summary>
public int curlength;
/// <summary>
/// Максимальная длина слова
/// </summary>
private int maxlength;
/// <summary>
/// Алфавит в котором необходимо генерировать слова
/// </summary>
private string alphabet;
/// <summary>
/// Признак возможности генерации слова
/// </summary>
public bool CanGenerate = true;
/// <summary>
/// Сгенерированная комбинация
/// </summary>
List<int> X;
/// <summary>
/// Пустой конструктор
/// </summary>
public WordGenerator()
{
}
/// <summary>
/// Конструктор объекта для генерации
/// </summary>
/// <param name="minlength">Минимальная длина</param>
/// <param name="maxlength">Максимальная длина</param>
/// <param name="alphabet">Алфавит для генерации слов</param>
public WordGenerator(int minlength,int maxlength, string alphabet)
{
if (minlength >= 0 & maxlength >= minlength)
{
this.minlength = this.curlength = minlength;
this.maxlength = maxlength;
}
CanGenerate = true;
this.alphabet = alphabet;
X = new List<int>(minlength);
for (int i = 0; i < minlength; i++)
X.Add(0);
}
/// <summary>
/// Генерация новой комбинации
/// </summary>
private void Next()
{
int i = 0;
while (i < X.Count && i >= 0 && X[i] == alphabet.Length - 1)
{
X[i] = 0;
i++;
}
if (i < X.Count && i >= 0)
{
X[i]++;
CanGenerate = true;
}
else
CanGenerate = false;
}
public string NextWord(ref int variant)
{
string Word = "";
Console.WriteLine(curlength+" "+maxlength);
if (curlength <= maxlength)
{
if (CanGenerate)
{
List<char> str = new List<char>(X.Count);
for (int i = 0; i < X.Count; i++)
str.Add(alphabet[X[i]]);
Word = new String(str.ToArray());
variant++;
Next();
}
else
{
curlength++;
X = new List<int>(curlength);
for (int i = 0; i < curlength; i++)
X.Add(0);
CanGenerate = true;
}
}
else
{
return null;
}
return Word;
}
}
}
Приложение Е
Экранные формы
В данном разделе приведены экранные формы разработанной программы.
Рисунок Е.1 – Окно построения графика в виде мини-эскиза
Рисунок Е.2 – Процесс обработки слова машиной
Рисунок Е.3 – Обработанное слово
Рисунок Е.4 – Сохранение графика временной сложности