Правила  •  FAQ  •  Поиск  •  Пользователи  •  Группы
Профиль  •  Войти и проверить личные сообщения  •  Вход  •  Регистрация 
 
 
Реализация конечного недетерминированного автомата
 
Начать новую тему   Ответить на тему    Список форумов FREESTUDENTS -> Архив
 
Автор Сообщение
Snake!



Репутация: 0    Сообщения: 1941
Стаж: 3 года 4 месяца
Сообщение19.11.2005 4:44 Реализация конечного недетерминированного автомата Ответить с цитатой

У меня недавно появилась необходимость в реализации сабжа. Есть ли у кого-нибудь соображения по поводу написания КНА?
Вообще я думал для каждого состояния сделать свой класс и каким-либо образом по ним бегать. Скорее всего нужен будет ещё один класс перехода. Но это пока только общие мысли.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alexey



Репутация: 0    Сообщения: 9
Стаж: 2 года
Сообщение27.11.2005 2:13 Ответить с цитатой

Тебе необходимо именно сымитировать работу недетерминированного конечного автомата или
построить автомат выполняющий аналогичные задачи (в теории их вычислительная мощность одинакова).

Если ставится первая задача то здесь все достаточно просто при каждой неоднозначности разветляем
процесс и если в каком то из процессов строка обрабатываемая автоматом принята ... (автомат перешел
в завершающее состояние) то эта строка допускается данным автоматом. Этот способ не самый оптимальный
так как работает очень долго.

Намного проще реализовать вторую задачу, в частности преобразовать недетерминированный автомат
в детерминированный и сымитировать работу уже детерминированного автомата.
Алгоритм преобразования немного =) грамозок:
Если у нас есть начальные состояния {1,2,...n} необходимо сгенирировать состояния нового
(детерминированного) автомата, их будет столько сколько подмножеств у множества начальных состояний
Например если изначальный автомат имеет состояния {1,2,3} то получатся следущие состояния:
{1}
{2}
{3}
{1,2}
{2,3}
{1,3}
{1,2,3}
Далее составляем множество всех достижимых по некоторому символу состояний, тоесть
если из состояния 1 по символу A можно попасть в 2 и 3 то получаем
P(1,A) -> {2,3}
и т.д для всех вершин и входных символов.
Стартовым состоянием нового автомата будет стартовое состояние исходного автомата,
допускающим все состояния содержащие допускающие сосотояние исходного автомата.
Если исходный автомат содержит состояния {1,2,3} 1-стартовое, 3-допускающие
то для нового автомата стартовым будет состояние {1},
допускающими {3},{2,3},{1,3},{1,2,3}

Далле выполняем следующий алгоритм:

Для каждого состояния {S1,S2,....Sn} создаваемого автомата
{
Для каждого символа входного алфавита ( С )
{
R={};
Для каждого элемента Si
R=R обьединись с P (Si,C);
Добавить в новый автомат правило {S1,...Sn},C -> R;
}
}

Минимизируем полученный автомат и моделируем его работу.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение AIM Address Yahoo Messenger MSN Messenger
Snake!



Репутация: 0    Сообщения: 1941
Стаж: 3 года 4 месяца
Сообщение27.11.2005 2:57 Ответить с цитатой

Ого!В шоке! Даже не ожидал, что кто-то так развёрнуто ответит.
Спасибо огромное!

Добавлено спустя 3 минуты 14 секунд:

Хм... получается, что в первом способе возвраты назад не допускаются! А должны.
Нужен-то именно он.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alexey



Репутация: 0    Сообщения: 9
Стаж: 2 года
Сообщение27.11.2005 5:49 Ответить с цитатой

Можно реализовать рекрусивной функцией
такого рода

просмотр
{
если символов входной ленты не осталось :
1) если автомат в завершающем состоянии ... строка принята
2) иначе строка не принята

если есть неоднозначность
__сначала иди по первому варианту, затем по второму и т.д
____если какой нибуть из вариантов пернул что строка принята
_____завершаем работу строка принята...
если нет переходи в ледующие состояние по данному символу
}

есть замечательнкая книжечна В.М Мозговова
Алгоритмы, Языки, Автоматы. Компиляторы.
там это все на С# уже написано ctrl+c,ctrl+v

Вернуться к началу
Посмотреть профиль Отправить личное сообщение AIM Address Yahoo Messenger MSN Messenger
Snake!



Репутация: 0    Сообщения: 1941
Стаж: 3 года 4 месяца
Сообщение27.11.2005 23:18 Ответить с цитатой

Alexey
Ну я примерно так изначально и думал =)

А ctrl-c, ctrl-v не получится, т.к. надо с исп. абстрактных классов писать прогу. Это обязательное условие.

Кстати, а ты вообще из ГУАПа?

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alexey



Репутация: 0    Сообщения: 9
Стаж: 2 года
Сообщение28.11.2005 8:20 Ответить с цитатой

Да ..., но раньше я сюда не заходил ... чуть другая специализация была (учился на 2016 счас перевелся на 3515) если бы меня на второй год не оставили Смайлик учился б с тобой на одним потоке ...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение AIM Address Yahoo Messenger MSN Messenger
Snake!



Репутация: 0    Сообщения: 1941
Стаж: 3 года 4 месяца
Сообщение28.11.2005 9:35 Ответить с цитатой

Alexey
Ты бы был ща в 4366 =)

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Pauls



Репутация: 0    Сообщения: 2
Стаж: 1 год
Сообщение01.12.2006 23:07 Ответить с цитатой

Snake! писал(а):
Вообще я думал для каждого состояния сделать свой класс и каким-либо образом по ним бегать. Скорее всего нужен будет ещё один класс перехода. Но это пока только общие мысли.


думается мне что задачка решается с помощъю матрицы переходов и функции которая собственно этот переход и осуществляет Ж)
...не плодите сущности сверх необходимого

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов FREESTUDENTS -> Архив Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы


На главную •  RSS-лента •  PDA-версия
 
Powered by phpBB © 2001, 2007 phpBB Group
Hosted by INFOBOX