Saya mencari contoh yang baik dari mesin negara yang terbatas; Bahasa tidak terlalu penting, hanya contoh yang bagus.
Implementasi kode berguna (pseudo-code umum), tetapi juga sangat berguna untuk mengumpulkan berbagai kegunaan FSM.
Contoh tidak harus berbasis komputer, misalnya contoh jaringan kereta api Mike Dunlavey, sangat berguna.
finite-state-machine
ocodo
sumber
sumber
Jawaban:
A Safe (acara dipicu)
Traffic Light (dipicu | sensor [event] terpicu)
Mesin Penjual Otomatis (acara dipicu, variasi brankas )
sumber
Contoh Protokol Gateway Perbatasan
BGP adalah protokol yang mendukung keputusan inti routing di internet. Ini memelihara tabel untuk menentukan jangkauan host dari node yang diberikan, dan membuat internet benar-benar terdesentralisasi.
Dalam jaringan, setiap node BGP adalah peer, dan menggunakan mesin keadaan terbatas, dengan salah satu dari enam status Idle , Connect , Active , OpenSent , OpenConfirm , dan Didirikan . Setiap koneksi peer dalam jaringan memelihara salah satu dari status ini.
Protokol BGP menentukan pesan yang dikirim ke rekan-rekan untuk mengubah statusnya.
Statistik BPG.
Diam
Status siaga pertama . Dalam keadaan ini, BGP menginisialisasi sumber daya, dan menolak upaya koneksi masuk, dan memulai koneksi ke peer.
Menghubungkan
Keadaan kedua Connect . Dalam keadaan ini, router menunggu koneksi selesai dan transisi ke status OpenSent jika berhasil. Jika tidak berhasil, ini akan me-reset timer ConnectRetry dan transisi ke status aktif setelah kedaluwarsa.
Aktif
Dalam keadaan aktif , router me-reset timer ConnectRetry ke nol dan kembali ke kondisi Connect .
OpenSent
Dalam keadaan OpenSent , router mengirim pesan Open dan menunggu balasannya. Pesan Keepalive dipertukarkan dan, setelah berhasil diterima, router ditempatkan ke dalam status Didirikan .
Mapan
Dalam kondisi mapan , router dapat mengirim / menerima: Keepalive; Memperbarui; dan Pesan pemberitahuan ke / dari rekannya.
Info lebih lanjut tentang BGP ada di wikipedia
sumber
Mereka berguna untuk memodelkan semua jenis hal. Misalnya, siklus pemilu dapat dimodelkan dengan negara di sepanjang garis (pemerintahan normal) - pemilihan yang disebut -> (kampanye awal) - Parlemen dibubarkan -> (kampanye berat) - pemilihan -> (penghitungan suara ). Kemudian baik (penghitungan suara) - tidak ada mayoritas -> (negosiasi koalisi) - kesepakatan tercapai -> (pemerintahan normal) atau (penghitungan suara) - mayoritas -> (pemerintahan normal). Saya telah mengimplementasikan varian pada skema ini dalam game dengan subtitle politik.
Mereka digunakan dalam aspek-aspek lain dari permainan juga: AI sering berbasis negara; transisi antara menu dan level, dan transisi setelah kematian atau level selesai sering dimodelkan dengan baik oleh FSM.
sumber
Parser CSV yang digunakan dalam plug-in jquery-csv
Ini adalah pengurai tata bahasa Chomsky Type III dasar .
Sebuah tokenizer regex digunakan untuk mengevaluasi data berdasarkan char-by-char. Ketika char kontrol ditemukan, kode dilewatkan ke pernyataan switch untuk evaluasi lebih lanjut berdasarkan keadaan awal. Karakter non-kontrol dikelompokkan dan disalin secara bersamaan untuk mengurangi jumlah operasi penyalinan string yang diperlukan.
Tokenizer:
Set pertandingan pertama adalah karakter kontrol: pemisah nilai (") pemisah nilai (,) dan pemisah entri (semua variasi baris baru). Pertandingan terakhir menangani pengelompokan karakter non-kontrol.
Ada 10 aturan yang harus dipenuhi oleh parser:
Catatan: 7 aturan teratas berasal langsung dari IETF RFC 4180 . 3 terakhir ditambahkan untuk menutupi kasus tepi yang diperkenalkan oleh aplikasi spreadsheet modern (ex Excel, Google Spreadsheet) yang tidak membatasi (yaitu kutipan) semua nilai secara default. Saya mencoba menyumbang kembali perubahan pada RFC tetapi belum mendengar tanggapan atas pertanyaan saya.
Cukup dengan wind-up, inilah diagram:
Menyatakan:
Transisi:
Catatan: Sebenarnya tidak ada status. Harus ada garis dari 'c' -> 'b' yang ditandai dengan status '1' karena pembatas kedua yang lolos berarti pembatas pertama masih terbuka. Bahkan, mungkin akan lebih baik untuk menggambarkannya sebagai transisi lain. Menciptakan ini adalah seni, tidak ada cara yang benar.
Catatan: Ini juga kehilangan keadaan keluar tetapi pada data yang valid parser selalu berakhir pada transisi 'a' dan tidak ada negara yang mungkin karena tidak ada yang tersisa untuk diurai.
Perbedaan antara Negara dan Transisi:
Suatu negara terbatas, artinya hanya dapat disimpulkan sebagai satu hal.
Transisi mewakili aliran antar negara sehingga dapat berarti banyak hal.
Pada dasarnya, hubungan transisi state-> adalah 1 -> * (yaitu satu-ke-banyak). Negara mendefinisikan 'apa adanya' dan transisi mendefinisikan 'bagaimana penanganannya'.
Catatan: Jangan khawatir jika penerapan status / transisi tidak terasa intuitif, itu tidak intuitif. Butuh korespondensi yang luas dengan seseorang yang jauh lebih pintar daripada saya sebelum akhirnya saya memiliki konsep untuk bertahan.
Pseudo-Code:
Catatan: Ini intinya, dalam praktiknya ada banyak lagi yang perlu dipertimbangkan. Misalnya, pengecekan kesalahan, nilai null, garis akhir kosong (yaitu yang valid), dll.
Dalam hal ini, negara adalah kondisi ketika blok pencocokan regex menyelesaikan iterasi. Transisi direpresentasikan sebagai pernyataan kasus.
Sebagai manusia, kita memiliki kecenderungan untuk menyederhanakan operasi tingkat rendah ke tingkat yang lebih tinggi abstrak tetapi bekerja dengan FSM yang bekerja dengan operasi tingkat rendah. Sementara negara dan transisi sangat mudah untuk dikerjakan secara individual, secara inheren sulit untuk memvisualisasikan semuanya sekaligus. Saya merasa paling mudah untuk mengikuti jalur eksekusi individu berulang-ulang sampai saya bisa melihat bagaimana transisi berlangsung. Ini seperti belajar matematika dasar, Anda tidak akan dapat mengevaluasi kode dari tingkat yang lebih tinggi sampai detail tingkat rendah mulai menjadi otomatis.
Selain: Jika Anda melihat implementasi yang sebenarnya, ada banyak detail yang hilang. Pertama, semua jalur yang mustahil akan menghasilkan pengecualian khusus. Seharusnya tidak mungkin mengenai mereka, tetapi jika ada kerusakan mereka akan benar-benar memicu pengecualian pada pelari uji. Kedua, aturan parser untuk apa yang diizinkan dalam string data CSV 'legal' cukup longgar sehingga kode yang diperlukan untuk menangani banyak kasus tepi tertentu. Terlepas dari fakta itu, ini adalah proses yang digunakan untuk mengejek FSM sebelum semua perbaikan bug, ekstensi, dan fine tuning.
Seperti kebanyakan desain, itu bukan representasi yang tepat dari implementasi tetapi menguraikan bagian-bagian penting. Dalam praktiknya, sebenarnya ada 3 fungsi parser berbeda yang berasal dari desain ini: pemisah garis csv-spesifik, parser garis tunggal, dan parser multi-garis lengkap. Mereka semua beroperasi dengan cara yang sama, mereka berbeda dalam cara mereka menangani karakter baris baru.
sumber
FSM sederhana di Jawa
Ini dia. OK, itu tidak brilian, tapi itu menunjukkan ide.
Anda akan sering menemukan FSM dalam produk telekomunikasi karena mereka menawarkan solusi sederhana untuk situasi yang rumit.
sumber
Saya telah menemukan bahwa memikirkan / memodelkan lift (lift) adalah contoh yang baik dari mesin keadaan terbatas. Ini membutuhkan sedikit cara pengenalan, tetapi menyediakan jauh dari situasi sepele untuk diimplementasikan.
Negara-negara bagian, misalnya, di lantai dasar, di lantai pertama, dll, dan memindahkan tanah ke lantai satu, atau memindahkan lantai tiga ke lantai tetapi saat ini antara lantai 3 dan 2, dan seterusnya.
Efek tombol di sangkar lift dan di lantai itu sendiri memberikan input, efek yang tergantung pada kedua tombol yang ditekan bersama dengan keadaan saat ini.
Setiap lantai, kecuali bagian atas dan bawah, akan memiliki dua tombol: satu untuk meminta lift untuk naik, yang lain untuk turun.
sumber
OKE, ini sebuah contoh. Misalkan Anda ingin menguraikan integer. Ini akan pergi seperti di
dd*
manad
digit bilangan bulat.Tentu saja, seperti yang dikatakan @Gary, Anda dapat menyamarkannya
goto
melalui pernyataan peralihan dan variabel status. Perhatikan bahwa dapat disusun untuk kode ini, yang isomorfik dengan ekspresi reguler asli:Tentu saja Anda juga bisa melakukannya dengan tabel pencarian.
Mesin negara yang terbatas dapat dibuat dengan berbagai cara, dan banyak hal dapat digambarkan sebagai mesin negara yang terbatas. Ini bukan "benda", melainkan konsep, untuk memikirkan berbagai hal.
Contoh Jaringan Kereta Api
Salah satu contoh FSM adalah jaringan kereta api.
Ada sejumlah saklar yang terbatas di mana kereta api bisa menuju salah satu dari dua jalur.
Ada sejumlah terbatas trek yang menghubungkan sakelar-sakelar ini.
Kapan saja, sebuah kereta ada di satu lintasan, ia dapat dikirim ke lintasan lain dengan melewati sakelar, berdasarkan pada sedikit informasi input.
sumber
Mesin Hingga Hingga di Ruby:
Itulah perilaku node komputasi tunggal dalam sistem terdistribusi, menyiapkan skema komunikasi berbasis tautan. Lebih atau kurang. Dalam bentuk Grafik terlihat seperti ini:
sumber
Lihatlah tautan ini untuk beberapa contoh sederhana analisis leksikal (FSM):
http://ironbark.bendigo.latrobe.edu.au/subjects/SS/clect/clect03.html
Anda juga dapat melihat "buku naga" sebagai contoh (bukan bacaan ringan)
http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools
sumber
Dalam praktiknya, Mesin Negara sering digunakan untuk:
Salah satu contoh akan menjadi Mesin Negara yang memindai string untuk melihat apakah ia memiliki sintaks yang tepat. Kode ZIP Belanda misalnya diformat sebagai "1234 AB". Bagian pertama hanya berisi angka, huruf kedua saja. Mesin Negara dapat ditulis yang melacak apakah itu dalam keadaan NUMBER atau dalam kondisi SURAT dan jika menemukan input yang salah, tolaklah.
Mesin negara akseptor ini memiliki dua status: numerik dan alfa. Mesin keadaan dimulai dalam keadaan angka, dan mulai membaca karakter string untuk memeriksa. Jika karakter yang tidak valid ditemukan selama salah satu negara bagian, fungsi kembali dengan nilai False, menolak input sebagai tidak valid.
Kode python:
Sumber: (Hingga-) Mesin Negara dalam praktik
sumber