परिमित राज्य मशीनों के उदाहरण [बंद]


25

मैं परिमित राज्य मशीनों के अच्छे उदाहरणों की तलाश कर रहा हूं; भाषा विशेष रूप से महत्वपूर्ण नहीं है, सिर्फ अच्छे उदाहरण हैं।

कोड कार्यान्वयन उपयोगी (सामान्यीकृत छद्म कोड) हैं, लेकिन यह एफएसएम के विभिन्न उपयोगों को इकट्ठा करने के लिए भी बहुत उपयोगी है।

उदाहरणों के लिए कंप्यूटर पर आधारित होने की आवश्यकता नहीं है, उदाहरण के लिए माइक डनलवे के रेल नेटवर्क उदाहरण, बहुत उपयोगी है।


12
नियमित अभिव्यक्ति परिमित राज्य मशीनें हैं।
चिरसायकॉक

5
मुझे समझ में नहीं आता है कि इस प्रश्न को 'रचनात्मक नहीं' के रूप में चिह्नित किया गया है क्योंकि यह लगभग 2 साल हो गया है क्योंकि मैंने पहली बार एक जवाब प्रस्तुत किया था कि यह बंद है मैं तर्क देता हूं कि यह वास्तव में बहुत रचनात्मक और विषय था।
एक्वा

2
@ अक्वा - यह वास्तव में स्टैक के साथ एक समस्या का अधिक है। क्रॉगरमर्स, यह जनादेश है सवालों के जवाब देने के लिए, बहुत ही विशिष्ट प्रश्न, जिनके पास एक उत्तर है। हालांकि, इस तरह के प्रश्न जो मूल्यवान हैं, उन्हें सामान्य रूप से स्टैक साइटों की परिभाषा के आधार पर "रचनात्मक" (IMNSHO में शब्द की एक बहुत खराब परिभाषा) नहीं माना जाता है। वास्तव में प्रोग्रामर के लिए वास्तव में उपयोगी होने के लिए, इसे इस विशेष नियम के लिए कम उत्साह का पालन करना चाहिए, लेकिन मैं पुराने, थका हुआ और अन्यथा लगा हुआ हूं, "बेवकूफ को ठीक करने की कोशिश में अपेक्षित प्रयास" करने के लिए।
ओसोडो

1
प्रभावी रूप से वास्तविक समस्या यह है कि स्टैक साइट्स हैं, स्पष्ट रूप से, बहुत ही उच्च गुणवत्ता वाले संसाधनों में से एक, जो अच्छी तरह से ज्ञात हैं, और सहयोगी हैं, और एक अच्छा, पठनीय प्रारूप है। ऐसा प्रतीत होता है कि स्टैक पर यह कमी, वास्तव में साइट प्रारूप की आवश्यकता की ओर
इशारा

3
मैं अभी भी लोगों को इस प्रश्न को फिर से खोलने के लिए प्रेरित करूंगा, क्योंकि अधिक उदाहरण, महान होगा। सबसे दुखद बात यह है कि अगर नए उत्तर नहीं जोड़े जाते, तो सवाल खुला रह जाता।
ओसोडो

जवाबों:


28

एक सुरक्षित (घटना ट्रिगर)

  • स्टेट्स : मल्टीपल "लॉक्ड" स्टेट्स, एक "अनलॉक" स्टेट
  • संक्रमण : सही संयोजन / कुंजियाँ आपको प्रारंभिक बंद राज्यों से लॉक किए गए राज्यों के करीब ले जाती हैं, जब तक कि आप अंत में अनलॉक नहीं हो जाते। गलत संयोजन / कुंजियाँ आपको प्रारंभिक बंद स्थिति में वापस लाती हैं (कभी-कभी निष्क्रिय के रूप में जाना जाता है ।

ट्रैफ़िक लाइट (समय ट्रिगर किया गया | सेंसर [घटना] ट्रिगर)

  • स्टेट्स : RED, YELLOW, GREEN (सबसे सरल उदाहरण)
  • बदलाव : एक टाइमर के बाद RED को GREEN, GREEN को YELLOW, और YELLOW को RED में बदलें। विभिन्न (अधिक जटिल) राज्यों में संवेदन कारों पर भी ट्रिगर किया जा सकता है।

वेंडिंग मशीन (घटना ट्रिगर, तिजोरी का एक बदलाव )

  • स्टेट्स : IDLE, 5_CENTS, 10_CENTS, 15_CENTS, 20_CENTS, 25_CENTS, आदि, VEND, CHANGE
  • परिवर्तन : सिक्के, बिलों की प्रविष्टि पर राज्य में परिवर्तन, VEND में खरीद की सही मात्रा (या अधिक) पर परिवर्तन, फिर CHANGE या IDLE में संक्रमण (आपकी वेंडिंग मशीन कितनी नैतिक है इसके आधार पर)

अगर मैं कर सकता था तो +1 और अधिक। पिछले एक को छोड़कर सब कुछ अच्छा लग रहा है। यह, IDLE, VEND और CHANGE होना चाहिए। मान सशर्त हैं और उन्हें IDLE और खुद के बीच संक्रमण के रूप में दर्शाया जाना चाहिए। आप यह भी चाहते हैं कि एक राज्य यह दर्शाता है कि एक आइटम का चयन किया गया है।
इवान प्लाइस

@EvanPlaice: केवल उस घटना का चयन नहीं करेगा जो IDLE से VEND में परिवर्तन को ट्रिगर करती है? जब तक आप वेंडिंग से पहले चयन की पुष्टि करने की एक विधि की कल्पना नहीं कर रहे हैं।
मिसको

इन दोनों के लिए आरेख का कोई मौका?
ओसोडो

ये एफएसएम विकिपीडिया पृष्ठ में दिए गए उदाहरणों के समान हैं , जिसमें लिफ्ट भी शामिल हैं: "सरल उदाहरण वेंडिंग मशीनें हैं , जो सिक्कों के उचित संयोजन को जमा करने पर उत्पादों को फैलाती हैं, लिफ्ट , जिनके स्टॉप का क्रम फर्श द्वारा निर्धारित किया जाता है। सवारों द्वारा, ट्रैफिक लाइट्स , जो कारों के इंतजार में सीक्वेंस बदल देती हैं, और कॉम्बिनेशन लॉक्स , जिन्हें उचित क्रम में संयोजन संख्याओं के इनपुट की आवश्यकता होती है। "
icc97

1
@ icc97 FSM उदाहरण रोज़मर्रा की जिंदगी में बहुत ही सामान्य और आम हैं। संयोग से, स्टैक एक्सचेंज पोस्ट विकिपीडिया पृष्ठ पर उदाहरण जानकारी के समावेश को पूर्व-तारीख करता है :)
एक्वा

14

बॉर्डर गेटवे प्रोटोकॉल उदाहरण

बीजीपी एक प्रोटोकॉल है जो इंटरनेट पर कोर रूटिंग निर्णयों का समर्थन करता है। यह एक दिए गए नोड से मेजबानों की पुन: उपलब्धता को निर्धारित करने के लिए एक तालिका रखता है, और इंटरनेट को वास्तव में विकेंद्रीकृत कर दिया है।

नेटवर्क में, प्रत्येक बीजीपी नोड एक सहकर्मी है, और छह राज्यों में से एक आइडल , कनेक्ट , एक्टिव , ओपनसेंट , ओपनकॉन्फर्म और स्थापित में से एक के साथ, एक परिमित राज्य मशीन का उपयोग करता है । नेटवर्क में प्रत्येक सहकर्मी कनेक्शन इन राज्यों में से एक को बनाए रखता है।

BGP प्रोटोकॉल उन संदेशों को निर्धारित करता है जो अपने राज्य को बदलने के लिए साथियों को भेजे जाते हैं।

BPG स्टेटचैट।

बीजीपी राज्यचर्चा

बेकार

पहला राज्य आइडल । इस स्थिति में, बीजीपी संसाधनों को इनिशियलाइज़ करता है, और इनबाउंड कनेक्शन के प्रयासों को मना करता है, और सहकर्मी को कनेक्शन देता है।

जुडिये

दूसरा राज्य कनेक्ट । इस स्थिति में, राउटर पूरा होने के लिए कनेक्शन की प्रतीक्षा करता है और सफल होने पर ओपनसेंट स्थिति में बदलाव करता है । असफल होने पर, यह कनेक्टरीट्री टाइमर को रीसेट करता है और समाप्ति पर सक्रिय स्थिति में संक्रमण करता है।

सक्रिय

में सक्रिय राज्य, रूटर से शून्य और रिटर्न के लिए ConnectRetry टाइमर को रीसेट करता है कनेक्ट राज्य।

OpenSent

में OpenSent राज्य, रूटर एक खुला संदेश और बदले में एक के लिए प्रतीक्षा करता है भेजता है। रखने योग्य संदेशों का आदान-प्रदान किया जाता है और सफल प्राप्ति पर, राउटर को स्थापित स्थिति में रखा जाता है ।

कायम करना

में स्थापित राज्य, रूटर भेज सकते हैं / प्राप्त करते हैं: KeepAlive; अद्यतन करें; और अपने सहकर्मी से / को संदेश सूचित करें।

बीजीपी के बारे में अधिक जानकारी विकिपीडिया पर है


@tcrosley - यह विकिपीडिया से है, इसलिए वास्तव में क्रेडिट के लायक नहीं है।
ओसोडो

1
ठीक है, एक चित्र को शामिल करने के लिए +1 । :)
tcrosley

मैंने बीजीपी को चार्ट के लेबल को ठीक करने की कोशिश की, लेकिन यह मुझे नहीं जाने देगा - पर्याप्त वर्ण नहीं :)
माइक डनलवेई

इसे आकर्षित करने के लिए एक बेहतर तरीका होना चाहिए।
नौकरी

1
@ जोब - थोड़ी देर की प्रतिक्रिया, क्षमा करें, लेकिन मैं अब सोचता हूं कि यह बहुत गूढ़ है, उदाहरण के लिए, सेफ, वेंडिंग मशीन, आदि मेरे विचार से अधिक उपयोगी हैं।
ओसोडो

7

वे सभी प्रकार की चीजों के मॉडलिंग के लिए उपयोगी हैं। उदाहरण के लिए, एक चुनावी चक्र को राज्यों (सामान्य सरकार) - चुनाव नामक लाइनों के साथ मॉडल किया जा सकता है -> (जल्दी चुनाव प्रचार) - संवेदनशीलता भंग -> (भारी प्रचार) - चुनाव -> (मतगणना )। फिर या तो (वोट काउंटिंग) - कोई बहुमत -> (गठबंधन वार्ता) - असहमति तक पहुँच गया -> (सामान्य सरकार) या (वोट काउंटिंग) --स्मृति -> (सामान्य सरकार)। मैंने एक राजनीतिक सबगेम वाले गेम में इस योजना पर एक संस्करण लागू किया है।

वे खेल के अन्य पहलुओं में भी उपयोग किए जाते हैं: AI अक्सर राज्य-आधारित होता है; मेनू और स्तरों के बीच संक्रमण, और मृत्यु या स्तर पूरा होने पर संक्रमण अक्सर FSM द्वारा अच्छी तरह से मॉडलिंग किए जाते हैं।


++ अच्छा उदाहरण।
माइक डनलवे

1
डीएफएम का अच्छा उदाहरण (निर्धारक परिमित राज्य मशीन) क्योंकि पथ।
इवान प्लाइस

4

Jquery-csv प्लग-इन में CSV पार्सर का उपयोग किया जाता है

यह एक बुनियादी चॉम्स्की टाइप III व्याकरण पार्सर है।

एक regex टोकन का उपयोग चार-चार-चार आधार पर डेटा का मूल्यांकन करने के लिए किया जाता है। जब एक नियंत्रण चार का सामना करना पड़ता है, तो कोड को प्रारंभिक स्थिति के आधार पर आगे के मूल्यांकन के लिए एक स्विच स्टेटमेंट में पास किया जाता है। गैर-नियंत्रण वर्णों को समूहीकृत और कॉपी किया जाता है, जिन्हें स्ट्रिंग कॉपी संचालन की संख्या को कम करने की आवश्यकता होती है।

टोकनधारक:

var tokenizer = /("|,|\n|\r|[^",\r\n]+)/;

मैचों का पहला सेट नियंत्रण वर्ण हैं: मूल्य सीमांकक (") मूल्य विभाजक (,) और प्रविष्टि विभाजक (नईलाइन के सभी रूपांतर)। अंतिम मैच गैर-नियंत्रण चार समूहीकरण को संभालता है।

पार्सर को संतुष्ट करने के 10 नियम हैं:

  • नियम # 1 - प्रति पंक्ति एक प्रविष्टि, प्रत्येक पंक्ति एक नई रेखा के साथ समाप्त होती है
  • नियम # 2 - फ़ाइल के अंत में अनुगामी नईलाइन छोड़ी गई
  • नियम # 3 - पहली पंक्ति में हेडर डेटा होता है
  • नियम # 4 - रिक्त स्थान को डेटा माना जाता है और प्रविष्टियों में अनुगामी अल्पविराम नहीं होना चाहिए
  • नियम # 5 - डबल-कोट्स द्वारा लाइनों को सीमांकित किया जा सकता है या नहीं किया जा सकता है
  • नियम # 6 - लाइन-ब्रेक, डबल-कोट्स और कॉमा से युक्त फ़ील्ड्स को डबल-कोट्स में संलग्न किया जाना चाहिए
  • नियम # 7 - यदि डबल-कोट्स का उपयोग खेतों को घेरने के लिए किया जाता है, तो एक मैदान के अंदर दिखने वाले दोहरे-उद्धरण को दूसरे दोहरे उद्धरण के साथ पूर्ववर्ती होने से बचना चाहिए
  • संशोधन # 1 - एक निर्विवाद क्षेत्र या हो सकता है
  • संशोधन # 2 - एक उद्धृत क्षेत्र हो सकता है या नहीं
  • संशोधन # 3 - प्रविष्टि में अंतिम फ़ील्ड में शून्य मान हो सकता है या नहीं भी हो सकता है

नोट: शीर्ष 7 नियम IETF RFC 4180 से सीधे प्राप्त होते हैं । अंतिम 3 को आधुनिक स्प्रेडशीट ऐप्स (एक्सेल, Google स्प्रैडशीट) द्वारा पेश किए गए किनारे के मामलों को कवर करने के लिए जोड़ा गया था जो डिफ़ॉल्ट रूप से सभी मानों को सीमांकित (यानी उद्धरण) नहीं करते हैं। मैंने RFC में परिवर्तनों को वापस करने में योगदान करने की कोशिश की, लेकिन अभी तक मेरी जांच का जवाब नहीं मिला है।

हवा के साथ पर्याप्त, यहाँ आरेख है:

CSV पार्सर परिमित राज्य मशीन

राज्य अमेरिका:

  1. एक प्रविष्टि और / या एक मूल्य के लिए प्रारंभिक स्थिति
  2. एक शुरुआती उद्धरण का सामना किया गया है
  3. एक दूसरे उद्धरण का सामना किया गया है
  4. एक गैर-उद्धृत मूल्य का सामना किया गया है

संक्रमण:

  • ए। दोनों उद्धृत मूल्यों (1), निर्विवाद मान (3), अशक्त मान (0), अशक्त प्रविष्टियाँ (0), और नई प्रविष्टियाँ (0)
  • ख। एक दूसरे उद्धरण चार के लिए जाँच (2)
  • सी। एक बची हुई बोली (1), मूल्य का अंत (0), और प्रविष्टि का अंत (0)
  • घ। मान का अंत (0), और प्रविष्टि का अंत (0)

नोट: यह वास्तव में एक राज्य को याद कर रहा है। राज्य '1' से चिह्नित 'c' -> 'b' से एक रेखा होनी चाहिए क्योंकि एक बचा हुआ दूसरा सीमांकक का मतलब है कि पहला सीमांकक अभी भी खुला है। वास्तव में, संभवतः इसे एक और संक्रमण के रूप में प्रतिनिधित्व करना बेहतर होगा। इन्हें बनाना एक कला है, इसका कोई एक सही तरीका नहीं है।

नोट: यह एक निकास राज्य भी याद कर रहा है, लेकिन वैध डेटा पर पार्सर हमेशा संक्रमण 'ए' पर समाप्त होता है और राज्यों में से कोई भी संभव नहीं है क्योंकि पार्स के लिए कुछ भी नहीं बचा है।

राज्यों और परिवर्तनों के बीच का अंतर:

एक अवस्था परिमित है, जिसका अर्थ है कि केवल एक बात का अनुमान लगाया जा सकता है।

एक संक्रमण राज्यों के बीच प्रवाह का प्रतिनिधित्व करता है तो इसका मतलब कई चीजें हो सकती हैं।

मूल रूप से, राज्य-> संक्रमण संबंध 1 -> * है (यानी एक-से-कई)। राज्य 'यह क्या है' को परिभाषित करता है और संक्रमण 'यह कैसे संभाला जाता है' को परिभाषित करता है।

नोट: चिंता मत करो अगर राज्यों / बदलावों का अनुप्रयोग सहज महसूस नहीं करता है, तो यह सहज नहीं है। इससे पहले कि मैं आखिरकार इस अवधारणा को थामने के लिए किसी से अधिक होशियार हो गया, किसी और के साथ हो गया।

छद्म संहिता:

csv = // csv input string

// init all state & data
state = 0
value = ""
entry = []
output = []

endOfValue() {
  entry.push(value)
  value = ""
}

endOfEntry() {
  endOfValue()
  output.push(entry)
  entry = []
}

tokenizer = /("|,|\n|\r|[^",\r\n]+)/gm

// using the match extension of string.replace. string.exec can also be used in a similar manner
csv.replace(tokenizer, function (match) {
  switch(state) {
    case 0:
      if(opening delimiter)
        state = 1
        break
      if(new-line)
        endOfEntry()
        state = 0
        break
      if(un-delimited data)
        value += match
        state = 3
        break
    case 1:
      if(second delimiter encountered)
        state = 2
        break
      if(non-control char data)
        value += match
        state = 1
        break
    case 2:
      if(escaped delimiter)
        state = 1
        break
      if(separator)
        endOfValue()
        state = 0
        break
      if(newline)
        endOfEntry()
        state = 0
        break
    case 3:
      if(separator)
        endOfValue()
        state = 0
        break
      if(newline)
        endOfEntry()
        state = 0
        break
  }
}

नोट: यह सार है, व्यवहार में विचार करने के लिए और भी बहुत कुछ है। उदाहरण के लिए, त्रुटि की जाँच, शून्य मान, एक अनुगामी रिक्त रेखा (अर्थात जो मान्य है), आदि।

इस मामले में, राज्य चीजों की स्थिति है जब रेगेक्स मैच ब्लॉक एक पुनरावृत्ति को पूरा करता है। संक्रमण को स्टेटमेंट स्टेटमेंट के रूप में दर्शाया गया है।

मनुष्य के रूप में, हम उच्च स्तर सार लेकिन एक FSM के साथ काम करने में निम्न स्तर के संचालन को सरल बनाने की प्रवृति होती है निम्न स्तर के संचालन के साथ काम। जबकि राज्यों और संक्रमणों को व्यक्तिगत रूप से काम करना बहुत आसान है, एक बार में पूरे पूरे कल्पना करना स्वाभाविक है। मुझे यह पता चला कि जब तक संक्रमण बाहर न खेले, मैं अंत तक बार-बार निष्पादन के अलग-अलग रास्तों का पालन करना आसान समझता हूं। यह बुनियादी गणित सीखने की तरह है, आप उच्च स्तर से कोड का मूल्यांकन करने में सक्षम नहीं होंगे जब तक कि निम्न स्तर का विवरण स्वचालित नहीं हो जाता।

एक तरफ: यदि आप वास्तविक कार्यान्वयन को देखते हैं, तो बहुत सारे विवरण गायब हैं। सबसे पहले, सभी असंभव पथ विशिष्ट अपवादों को फेंक देंगे। उन्हें हिट करना असंभव होना चाहिए, लेकिन अगर कुछ भी टूटता है तो वे टेस्ट रनर में अपवाद को ट्रिगर करेंगे। दूसरा, 'कानूनी' CSV डेटा स्ट्रिंग में जो अनुमति दी जाती है, उसके लिए पार्सर नियम बहुत ढीले होते हैं, इसलिए बहुत सारे विशिष्ट किनारे मामलों को संभालने के लिए आवश्यक कोड। उस तथ्य के बावजूद, यह एफएसएम को बग फिक्स, एक्सटेंशन और फाइन ट्यूनिंग के सभी से पहले मॉक करने की प्रक्रिया थी।

अधिकांश डिजाइनों के साथ, यह कार्यान्वयन का सटीक प्रतिनिधित्व नहीं है, लेकिन यह महत्वपूर्ण भागों को रेखांकित करता है। व्यवहार में, वास्तव में इस डिज़ाइन से प्राप्त 3 अलग-अलग पार्सर फ़ंक्शन हैं: एक सीएसवी-विशिष्ट लाइन स्प्लिटर, एक सिंगल-लाइन पार्सर और एक पूर्ण मल्टी-लाइन पार्सर। वे सभी समान तरीके से काम करते हैं, वे जिस तरह से न्यूलाइन चार्ट को संभालते हैं, उसमें भिन्नता है।


1
रुको! बहुत अच्छा योगदान।
ओसोडो

@Slomojo धन्यवाद, मुझे साझा करने में खुशी हो रही है। मैं सीएस के लिए स्कूल नहीं गया था इसलिए मुझे यह सामान खुद ही सीखना पड़ा। इन ऑनलाइन जैसे उच्च-स्तरीय सीएस विषयों को कवर करते हुए वास्तविक दुनिया के अनुप्रयोगों को खोजना वास्तव में मुश्किल है। मैं आखिरकार पार्सर एल्गोरिथ्म को ठीक विस्तार से दस्तावेज करने की योजना बना रहा हूं ताकि भविष्य में मेरे जैसे दूसरों के लिए उपयोगी हो सके। यह एक अच्छी शुरुआत है।
इवान प्लाइस

मैं स्वयं भी पढ़ाया हुआ हूं, लेकिन मैंने 30 साल पहले शुरुआत की थी, इसलिए अब तक मैंने सीएस पाठ्यक्रम को कवर कर लिया है :) मैंने आपके और मेरे जैसे लोगों के लिए यह प्रश्न पोस्ट किया है। मुझे लगता है कि बहुत कम स्तर के सिद्धांत को वापस सीखना काफी आसान था, बस इसलिए कि कम व्याकुलता थी, और धातु के करीब काम करने के अधिक अवसर थे, हालांकि वास्तव में कोई इंटरनेट नहीं था, और हम सभी गुफाओं में रहते थे।
ओसोडो

3

जावा में सरल एफएसएम

int i=0;

while (i<5) {
 switch(i) {
   case 0:
     System.out.println("State 0");
     i=1;
     break;
   case 1:
     System.out.println("State 1");
     i=6;
     break;
   default:
     System.out.println("Error - should not get here");
     break;      
  }

} 

तुम वहाँ जाओ। ठीक है, यह शानदार नहीं है, लेकिन यह विचार दिखाता है।

टेलीकॉम उत्पादों में आपको अक्सर एफएसएम मिलते हैं क्योंकि वे अन्यथा जटिल स्थिति के लिए एक सरल समाधान प्रदान करते हैं।


3
वे शाब्दिक विश्लेषण में संकलक निर्माण का एक महत्वपूर्ण हिस्सा भी हैं।
jmq

@jmquigley, क्या आप कृपया एक उत्तर जोड़ सकते हैं?
ओसोडो

1
मैंने आपके लिए कुछ लिंक के साथ एक अलग उत्तर जोड़ा।
jmq

3

मैंने पाया है कि लिफ्ट / एलेवेटर के बारे में सोचना एक परिमित राज्य मशीन का एक अच्छा उदाहरण है। इसे लागू करने के तरीके में बहुत कम आवश्यकता होती है, लेकिन इसे लागू करने के लिए तुच्छ स्थिति से बहुत दूर है।

राज्य उदाहरण के लिए, भूतल पर, पहली मंजिल आदि पर, और चलती हुई जमीन से पहली मंजिल पर, या तीसरे तल पर चल रहे हैं, लेकिन वर्तमान में मंजिल 3 और 2 के बीच है, और इसी तरह।

लिफ्ट पिंजरे में और फर्श पर बटन का प्रभाव स्वयं इनपुट प्रदान करता है, जिसका प्रभाव वर्तमान स्थिति के साथ दबाए गए दोनों बटन पर निर्भर करता है।

प्रत्येक मंजिल, ऊपर और नीचे को छोड़कर, दो बटन होंगे: एक ऊपर जाने के लिए लिफ्ट का अनुरोध करने के लिए, दूसरा नीचे जाने के लिए।


2

ठीक है, यहाँ एक उदाहरण है। मान लीजिए कि आप किसी पूर्णांक को पार्स करना चाहते हैं। यह कुछ ऐसा होगा dd*जहां dपूर्णांक अंक है।

state0:
    if (!isdigit(*p)) goto error;
    p++;
    goto state1;
state1:
    if (!isdigit(*p)) goto success;
    p++;
    goto state1;

बेशक, जैसा कि @ गैरी ने कहा, आप gotoएक स्विच स्टेटमेंट और स्टेट वेरिएबल के माध्यम से उन s को डिसाइड कर सकते हैं । ध्यान दें कि इस कोड को संरचित किया जा सकता है, जो मूल नियमित अभिव्यक्ति के लिए समसामयिक है:

if (isdigit(*p)){
    p++;
    while(isdigit(*p)){
        p++;
    }
    // success
}
else {
    // error
}

बेशक आप इसे लुकअप टेबल के साथ भी कर सकते हैं।

परिमित राज्य मशीनों को कई तरीके से बनाया जा सकता है, और कई चीजों को परिमित राज्य मशीनों के उदाहरण के रूप में वर्णित किया जा सकता है। चीजों के बारे में सोचने के लिए एक अवधारणा के रूप में यह "बात" नहीं है।

रेलमार्ग नेटवर्क उदाहरण

एफएसएम का एक उदाहरण एक रेल नेटवर्क है।

स्विच की एक सीमित संख्या होती है जहां एक ट्रेन दो में से एक ट्रैक पर जा सकती है।

इन स्विचेस को जोड़ने वाली पटरियों की एक सीमित संख्या है।

किसी भी समय, एक ट्रेन एक ट्रैक पर होती है, इसे एक स्विच को पार करके दूसरे ट्रैक पर भेजा जा सकता है, जो एकल इनपुट जानकारी के आधार पर होता है।


(मैंने आपके उत्तर को संपादित कर दिया है, मुझे आशा है कि आप अनुमोदन करेंगे।)
ओसोदो

@Slomojo: यह ठीक है। अछा लगता है।
माइक डनलैवी

2

रूबी में परिमित स्टेट मशीन:

module Dec_Acts
 def do_next
    @now = @next
    case @now
    when :invite
      choose_round_partner
      @next = :wait
    when :listen
      @next = :respond
    when :respond
      evaluate_invites
      @next = :update_in
    when :wait
      @next = :update_out
    when :update_in, :update_out
      update_edges
      clear_invites
      @next = :exchange
    when :exchange
      update_colors
      clear_invites
      @next = :choose
    when :choose
      reset_variables
      choose_role
    when :done
      @next = :done
    end
  end
end

यह एक वितरित प्रणाली में एक एकल गणना नोड का व्यवहार है, जो लिंक आधारित संचार योजना स्थापित करता है। ज्यादा या कम। ग्राफिक रूप में यह कुछ इस तरह दिखता है:

यहाँ छवि विवरण दर्ज करें


+1 दिलचस्प। DGMM किसको संदर्भित करता है?
इवान प्लाइस

@EvanPlaice यह मैक्सिमम-मैचिंग-आधारित न्यूनतम-भारित वर्टेक्स कवर एल्गोरिथम (DGMM) ... थोड़ा संक्षिप्त रूप से वितरित है, मुझसे यह न पूछें कि जी कहां से आता है।
ओसोडो

@slomojo "G" "सामान्यीकृत" के लिए है, अनुक्रमिक एल्गोरिथ्म जिसमें से यह व्युत्पन्न है सामान्यीकृत अधिकतम मिलान नामक तकनीक का उपयोग करता है।
फिलोसोडाद ५'१३

@philosodad मैंने उतना ही मान लिया, लेकिन मैं पोस्टिंग की धारणाओं को नापसंद करता हूं।
ओसोडो

1

शाब्दिक विश्लेषण (FSM) के कुछ सरल उदाहरणों के लिए इस लिंक को देखें:

http://ironbark.bendigo.latrobe.edu.au/subjects/SS/clect/clect03.html

आप उदाहरण के लिए "ड्रैगन बुक" भी देख सकते हैं (यह प्रकाश पढ़ने नहीं है)

http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools


0

व्यवहार में, राज्य मशीनों का अक्सर उपयोग किया जाता है:

  • डिजाइन उद्देश्य (एक कार्यक्रम में विभिन्न क्रियाओं को मॉडलिंग करना)
  • प्राकृतिक भाषा (व्याकरण) पार्सर्स
  • स्ट्रिंग पार्सिंग

एक उदाहरण एक स्टेट मशीन होगा जो यह देखने के लिए एक स्ट्रिंग को स्कैन करता है कि क्या यह सही सिंटैक्स है। उदाहरण के लिए डच ज़िप कोड को "1234 AB" के रूप में स्वरूपित किया गया है। पहले भाग में केवल संख्याएँ हो सकती हैं, दूसरा केवल अक्षर। एक स्टेट मशीन लिखी जा सकती है जो इस बात पर नज़र रखती है कि वह NUMBER स्थिति में है या LETTER राज्य में है और यदि यह गलत इनपुट का सामना करता है, तो इसे अस्वीकार कर दें।

इस स्वीकर्ता राज्य मशीन में दो अवस्थाएँ हैं: संख्यात्मक और अल्फा। राज्य मशीन संख्यात्मक राज्य में शुरू होती है, और जांच करने के लिए स्ट्रिंग के पात्रों को पढ़ना शुरू करती है। यदि किसी भी राज्य के दौरान अमान्य वर्णों का सामना किया जाता है, तो फ़ंक्शन इनपुट के रूप में अमान्य मान को गलत मानकर लौटता है।

पायथन कोड:

import string

STATE_NUMERIC = 1
STATE_ALPHA = 2

CHAR_SPACE = " "

def validate_zipcode(s):
cur_state = STATE_NUMERIC

for char in s:
    if cur_state == STATE_NUMERIC:
        if char == CHAR_SPACE:
            cur_state = STATE_ALPHA
        elif char not in string.digits:
            return False
    elif cur_state == STATE_ALPHA:
        if char not in string.letters:
            return False
return True

zipcodes = [
    "3900 AB",
    "45D6 9A",
]

for zipcode in zipcodes:
    print zipcode, validate_zipcode(zipcode)

स्रोत: (परिमित-) राज्य मशीनें व्यवहार में

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.