Pull to refresh

Comments 19

Да, видел эту библиотеку.

Не пытался сделать "убийцу" какого-то популярного решения, однако могу отметить ключевые различия:

- Transitions имеет императивный интерфейс (Создать fsm, добавить переход и тд)
- В transitions fsm создаётся каждый раз при создании объекта, т.е. by-desing возможна ситуация, когда у двух объектов одного и того же класса будут разные fsm. в моей реализации за счёт протокола дескриптора этого удалось избежать

При всем уважении, всерьез относиться к библиотеке, которая в туториале предлагает создать три состояния и переходить по ним циклом — просто смешно. Это вообще ни разу не конечный автомат.

Я уж молчу про to_«state», но этот кошмар хотя бы отключаемый.

Конечные автоматы полезны не как уровень абстракции, а как математически доказанная гарантия невозможности оказаться в неконсистентном состоянии. Не все «наборы состояний с переходами» — являются валидной FSM, и именно валидность имеет смысл проверять перед использованием (в компилируемых языках — на стадии компиляции, а питоне придется экспортировать метод validate или типа того, и бросать эксепшены при попытке использования до его вызова).

Сигнатура функции transition неверная. В традиционных имплементациях переходы осуществляются ивентами, причем FSM должна уметь адекватно принимать любой ивент и, опционально, выбирать конечное состояние в зависимости от бизнес-логики в колбэке.

Ваш код оперирует статусами и по сути ничем не отличается от изменения статуса с проверками. Правильные сигнатуры:

def transition(self, event: Collection[Enum]) → TaskStatus

@status.on_transition
def on_transition(source: TaskStatus, event: Collection[Enum]) → TaskStatus

В вашем понимании "Верная" это то же, что и "Традиционная"?

Я считаю, что в данном случае верной реализации нет, т.к. fsm это абстракция

An FSM is defined by a list of its states, its initial state, and the inputs that trigger each transition.

— https://en.wikipedia.org/wiki/Finite-state_machine

Вы можете считать как угодно, мне всё равно, я думал, вы хотите чему-то научиться и заодно понять, как правильно на самом деле.

Вижу 2 разных подхода:

  1. в статье из-за декларативности пользователь вынужден именовать каждый transition, но обработка входов пока не ясно как, наверное будет "как обычно", например if InputVoltage > 14

  2. в вашем случае пользователь вынужден именовать каждый event, но обработка transition не закфиксирована (можно присвоить любое состояние, какое захочется). Интересно, возможно ли совместить?

в статье из-за декларативности пользователь вынужден именовать каждый transition

В статье по сути нет понятия «transition», и прибивание гвоздями конечного состояния к пользовательскому вызову просто убивает саму идею FSM, превращая её в набор статусов с ad-hoc проверками. Типа поля в БД с триггером-валидатором. Это не FSM.

обработка transition не закфиксирована (можно присвоить любое состояние, какое захочется)

Нет конечно, не какое захочется, а тоже только оговоренное правилами. Я написал об этом выше.

Вроде, в разделе "математика", а ни одной формулы. Грустно...

Кстати, в чём отличие "математики" от "алгоритмов"? слова-то разные, и вроде не синонимы...

(вопрос риторический)

Если вам интересна математика конечных автоматов, и позволяет образование — крайне рекомендую книжку Michael Sipser, Introduction to the Theory of Computation.

Её, к сожалению, не переводили на русский (насколько я знаю), но она абсолютно бесподобна в смысле «понять, как устроены конечные автоматы и перестать путать «флаги с ограниченным набором значений» и «состояния конечного автомата».

Спасибо, забрал (2-е издание). Курс с заданиями, эталон книги науки, на дискретной математике. Специализована для инженеров по вычислительной математике (компиляторы, разработчики алгоритмов, ...). Прикладникам читать до Часть 3. Теория сложности. (Дальше - теоретическая математика, если ей не заниматься - будет сложно и в практике не пригодится).

В ответку из моей селекции по теме.

Это разнобойчик, здесь конечные автоматы строят над разными физико-математических пространствами: от электронных дискретных устройств - до моделей на системах дифуров.

По последним особенно рекомендую Сю Д., Мейер А. Современная теория автоматического управления и ее применение. 1972. - вещь!

Книги по направлению Конечные автоматы

Дискретка

Гилл А. Введение в теорию конечных автоматов - 1966.pdf
Арбиб М.А. (ред.) Алгебраическая теория автоматов, языков и полугрупп. 1975.djvu
Коршунов Ю.М. Математические основы кибернетики. 1987.djvu
Мелихов А.Н. Ориентированные графы и конечные автоматы - 1971.djvu
Мелихов А.Н., Берштейн Л.С., Курейчик В.М. Применение графов для проектирования дискретных устройств - 1974.djv
Портер У. Современные основания общей теории систем - 1971.djvu
Эббинхауз Г.-Д., Якобс К., Ман Ф.-К., Хермес Г. - Машины Тьюринга и рекурсивные фукции - 1972.djvu

Физика

Сю Д., Мейер А. Современная теория автоматического управления и ее применение. 1972.djvu

ТАУ/САУ

Солодовников В.В. (ред.) Теория автоматического регулирования. Книга 3. Часть 2. Техническая кибернетика. Теория нестационарных, нелинейных и самонастраивающихся систем автоматического регулирования - 1969.pdf

Бердоносов В.Д. Теория систем и системный анализ - 2003.pdf
Заде Л., Дезоер Ч. Теория линейных систем (Метод пространства состояний).pdf
Месарович М., Такахара Я. Общая теория систем математические основы - 1978.djvu
Месарович М., Такахара Я. Общая теория систем математические основы - 1978.pdf
Мороз А.И. Курс теории систем - 1987.djvu
Швыдкий B.C. и др. Элементы теории систем и численные методы моделирования процессов тепломассопереноса - 1999.djvu

спасибо за литературу

Классная статья, спасибо!

Нормальный, прозрачный код, приятно читать. Как упражнение тоже огонь. 🔥

И никто не написал, что у светофора вообще-то 4 состояния (красный + жёлтый при переходе из красного)? 😀

Так далеко не во всех странах.

А ещё есть светофоры на перекрёстках..

А как же нерабочее состояние?

Для интерпретации любого языка используется автомат описания его. Например, в вычислить выражение арифметическое за один просмотр его

Тоже давно в геймдеве. И никогда не понимал фразу "конечный автомат" и всегда называл "машиной состояний". Автомат - это ведь когда что то происходит автоматически. Подаётся патрон в патронник, после вылета предыдущего, отключение электричества, при превышении нагрузки. И есть просто выключатель нагрузки, не автоматический. Когда ты сам можешь в любой момент сменить состояние. Ну я смирился с народным названием, но диссонанс все равно есть.

Sign up to leave a comment.

Articles