問題タブ [fsm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java での有限ステート マシンの設計上の問題
以下のようにFSMを実装したい
- 第 1 レベル最も基本的な状態は BASE_STATE です。すべての状態は BASE_STATE から派生します。
- 第 2 レベル、WAITING_STATE、RUNNING_STATE、END_STATE など (BASE_STATE から派生。新しい機能はありません)
- 第 3 レベル, 2 つのグループ状態 (ACTIVE と PASSIVE) があり、次のようなすべての第 2 レベル状態に 1 対 1 で一致します
ACTIVE_WAITING_STATE 、 ACTIVE_RUNNING_STATE 、 ACTIVE_END_STATE など PASSIVE_WAITING_STATE 、 PASSIVE_RUNNING_STATE 、 PASSIVE_END_STATE など
ほとんどの機能は ACTIVE 状態と PASSIVE 状態で共通ですが、いくつかの小さな機能がオーバーライドされているだけです。ここまでは問題ありません。問題は、すべての第 3 レベルのグループが共通の機能を持っていることです。つまり、たとえば、ACTIVE_xxx_STATEs と PASSIVE_xxx_STATEs という 2 つの異なる increment() 関数を実装する必要があります。すべての状態 (例: ACTIVE_WAITING_STATE 、 ACTIVE_RUNNING_STATE 、 ACTIVE_END_STATE 、および PASSIVE 状態) を書き換えずにこれを行う方法
私の質問を明確にするために、私の醜いソルン。問題は、インクリメント関数が同じで、すべての ActivexxxState (および PassiveXXXState) に対して書き直されていることです。
c++ - ステートマシン-状態、イベント、pFuncを保持する構造
ステートマシンを作成し、次のようなインターフェイスを使用したい場合:
そうすれば、私がstate1にいて、FSMがKey_UPを受信すると、プログラムは次のように出力します。
問題は、プログラマーが配列サイズを変更する必要なしに、状態と遷移情報をクラス内に格納する方法です。2D配列を使用して、通常のように状態テーブルにし、移植性を高めるために、必要に応じてベクトル型を使用してサイズを変更することで、イベントと状態の追加を処理できると考えていました。ベクトルの問題は、多くの組み込みデバイスがメモリ割り当て呼び出しを使用できないことです。2番目のオプションは、ステートマシンでコンストラクターを呼び出し、テーブルに必要なサイズを渡すことですが、新しい状態やイベントを追加する場合は、これらの値も変更する必要があります...
では、状態、イベント、関数ポインタをどのように保存すればよいのでしょうか。
design-patterns - FSM で状態を設定する
クラスベースの FSM を初めて使用していますが、初期状態を設定するためのベスト プラクティスについて少し混乱しています。
Screen
(主に) 遷移を処理するために使用するクラスにFSM を追加しました。伝統的に、私は次のようなことをします:
かなり標準的な方法だと思います。
新しい状態に関する私の問題は、画面上のすべてのオブジェクトを作成する責任があるのは誰ですか? Screen
すべてのボタンなどを作成してからMainMenuTransitionInState
クラスに渡す必要がありますか、それともMainMenuTransitionState
クラスでボタンを作成してから渡す必要がありますか、それともマークを完全に逃したのでしょうか?
ここであなたの賢明なアドバイスに感謝します。ありがとう!
c++ - on_entry内でBoost.MSMis_flag_activeを使用する方法は?
州のon_entryテンプレート関数の1つでis_flag_active()関数を使用したいと思います。
ただし、次のコンパイルエラーが発生しました。
ただし、ステートマシンの外部では、最初にステートマシンを宣言する場合、is_flag_activeを使用できます。
front_endのis_flag_を使用すると、コンパイラエラーが再び発生します(msm :: back :: state_machineにはそのような関数はありません)。
is_flag_activeをon_entryと一緒に使用する方法はありますか?または、それが不可能な場合、代替手段はありますか?
助けてくれてありがとう、Gabor
akka - Akka、スレッド ディスパッチャ、エージェントのベスト プラクティス
私はしばらくの間 Scala に手を出しており、遠くから Akka を研究してきましたが、ついに本格的に始めようとしています。FSM トレイトが私の契約を結びました。私が懸念しているのは、データが不適切に共有される方法を思いついた可能性があることと、Akka のベスト プラクティスに一致するようにイベント処理ループを誤って考えた可能性があることです。
私の問題では、着信タスク要求を、有限状態マシンでもある適切なアクターに一致させる中央コーディネーターがいます。私は当初、onTransition が状態名だけでなく状態データも提供すると想定していました。
従来のデータのカプセル化が、そのデータをリスナーに公開しない理由になると思います。しかし、私にとっては、他の人がそのデータを見るために 2 つの用途があります。
状態データには基礎となるドメイン オブジェクトが含まれており、そのプロパティを使用して、要件が与えられたジョブを処理するのに最適な候補となるアクターを決定します。ジョブの要件は動的であるため、ワーカー アクターの個別のコレクションを持つことをためらっています (ただし、なぜ一時停止する必要があるのかはわかりません)。
他の前提条件を満たすすべての個別のアクターにクエリを実行し、すべての応答に参加するというアイデアは、非効率的であるか、少なくとも Akka にとって慣用的ではないように感じます。また、UI に現在の状態を表示する必要があり、同じイベント キューを使用して状態を表示する必要がある理由がわかりません。
とにかく、FSM にエージェントを更新させることを検討していましたが、それ自体がアクターであるため、その間接的な層が私に何をもたらすのかわかりません。イベントのシーケンスについての推論がはるかに難しくなる可能性があります。
Fowler の Event Collaboration は、状態データを明示的に送信することを私に指摘していますが、状態データを自動的に更新するすべての遷移に対してこれを行う簡単な方法を望んでいました。
また、イベント カスケードの順序付けと、それを制御する必要があるかどうかについて頭を悩ませています。すべての着信外部イベントが 1 つのアクターを経由する場合でも、内部で生成されたすべてのイベントを他のすべてのアクターに対して処理してから、次の外部イベントを処理する必要があります。セントラルコーディネーターに使ってもらいたいと考えていました!! 応答を待つ必要がありますが、イベント チェーンのどこかで感嘆符を誤って 1 つ削除すると、その保証が失われるのではないかと心配しています。
この問題に対して私が検討している解決策には、共有されるすべての「内部」アクターに対して単一のスレッド化されたディスパッチャー (おそらくワークスティーリングを使用) を使用して、内部イベントに高い優先度が与えられるように優先イベントを使用することが含まれます。
私がやろうとしていることに関連するベストプラクティスはありますか、それとも間違ったことをしようとしています:)?
c# - 前の状態を含む状態パターン C#
私は C# での状態パターンの実装に不慣れです。実装方法に関する情報を提供していただけますか。
ステート パターンを使用して、C# でステート マシンをリファクタリングしています。現在、私の状態マシンには 5 つの状態が含まれており、状態を前後に移動することしかできません。つまり、状態 1 から状態 2、3、4 に移動して、最終的に状態 5 に到達する必要があります。
やるだけで前に進めます
先に進むたびに新しい状態を作成しますが、すべての状態が作成された後、および/または前に戻りたい場合は、新しい状態だけでなく、同じ状態に移動する必要があります。どうやってやるの?シンプルにする良い方法はありますか?
vhdl - 有限状態マシンのVHDLと反応時間?
これは私が定期的に遭遇する問題です-うまくいけば、誰かが私にそれについて考える正しい方法を明確にすることができます!
私は基本的に私の問題をこれに減らすことができます:私は入力p_in
、出力p_out
、クロックを備えたモジュールを持っていますclk
。in
機能は、ローになるたびにout
、1クロック周期の持続時間でハイパルスを生成する必要があるということです。この「ネガティブエッジ検出器」は、次の4つの状態を持つFSMとして実装されreset
ます。wt_in_lo
(入力がローになるのを待ちます); sample_signal
(入力でゼロへの遷移が検出されると、出力でハイ信号を生成します); wt_in_hi
(サンプル信号が発生した後、入力がハイになるのを待ちます)。
コードは以下に含まれており、isim
シミュレーターの結果は次のようになります(これは動作シミュレーションであるため、プラットフォーム固有の変換の影響はありません)。
基本的に、状態は私が期待するとおりに変化します-最初のクロックポーズ、FSMは低いと認識しているため、 ;in
に移行します。sample_signal
2番目の時計のポーズ、私たちはsample_signal
状態にあります。
- ただし、ここに私の問題があります。状態に入る
out
とすぐにが高くなることを期待していsample_signal
ます(または、少なくとも、それが私が達成しようとしていることです)。それでも、次の状態( )に入るまで、はout
ハイパルスを実行しません!wt_in_hi
そして、私は通常、これを回避してコーディングしようとします(つまりout
、同期fsm部分での設定は、おそらく悪い考えです)-そして、シンセサイザーと私自身の両方を混乱させることになります:)
つまり、簡単に言えばout
、2番目の状態に入るとすぐに(そして2番目の状態の期間中)信号を受け取る可能性はありますか?そしてそれをコーディングする適切な方法は何でしょうか?
よろしくお願いし
ます。
コード:
vhdl - VHDL は FSM 状態を「生成」します
を介して別のモジュールにリンクされた可変数のモジュールがありsignal bus : std_logic_vector(NUM-1 downto 0)
、各コンポーネントは8ビットを使用しているため、次のようになります。
インスタンスの作成とポート マッピングの実行については、
私の質問:
FSM を介して各モジュールとやり取りできるようにしたいので (他のことも行う必要があるため)、それぞれを書き出すのではなく、次のコードを「生成」できるようにしたいと考えています。手動で状態 (signal empty : std_logic_vector(NUM-1 downto 0)
各モジュールのステータス フラグはどこにありますか)
ご覧のとおり、繰り返しがたくさんあります。ただ、簡単にケースに入れられないfor-generate
のでどうすればいいですか?
erlang - イベントが発生しない場合は gen_fsm を終了します
すべての状態で指定された時間が経過してもイベントが発生しない場合はいつでも FSM を終了させたいと考えています。
init コールバックでタイムアウト値を指定することにより、FSM の作成後にイベントがない場合にのみ、このようなシナリオを実現できますが、この機能をすべての状態でも機能させたいと考えています。
簡単で迅速な解決策はありますか?
よろしくお願いします
マット