ADVENT CALENDAR 2019

有限オートマトンの実装を緩く喋りたかった

By shot

これは AmusementCreators 2019 アドベントカレンダー その1 の16日目の記事です。 その2もあります。

はじめに

こんにちは、いつの間にか3度目のACACを迎えてしまったshotです。
有限オートマトンについて軽く説明した後、その実装について話していきたいと思います。
用語の時点で身構えた人も、簡単に書くつもりなので適当に読んでいただければ幸いです。

有限オートマトンとは?

定義

有限オートマトン - Wikipedia
有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化された「ふるまいのモデル」である。
有限個の「状態」のうち1つの状態をとる。ある時点では1つの状態しかとらず、それをその時点の「現在状態」と呼ぶ。
何らかのイベントや条件によってある状態から別の状態へと移行し、それを「遷移」と呼ぶ。

しんどいので例

難しそうに書かれていますが、図に表すと簡単です。例としてスイッチの有限オートマトンを考えます。
スイッチのオートマトン
状態は「ON」と「OFF」
遷移は「ON→OFF」、「OFF→ON」の矢印
その条件(イベント)は、「スイッチを押す」

ちょっといける気がしてきましたか?図が雑で見るに堪えない以外は問題ないかと思います。

実装

では早速、この有限オートマトンを実装してみましょう。
実装方法は色々ありますが、今回はImtStateMachineというピュアC#のライブラリを用いて実装してみたいと思います。
ImtStateMachineについて詳しく知りたい方はこちらのQiita記事を読むと良いと思います。というかこの記事はこちら様の二番煎じでしかない
以下、実際のプログラムです。

    using System;
    using IceMilkTea.Core; //ImtStateMachineを用いるための宣言

    public class Hoge
    {
        // 有限オートマトンのインスタンスをいれておく変数
        private ImtStateMachine<Hoge> stateMachine;

        // 状態ONを表すクラス
        private class OnState : ImtStateMachine<Hoge>.State
        {
            // スイッチON状態の時にやりたいことをここに書く
        }

        // 状態OFFを表すクラス
        private class OffState : ImtStateMachine<Hoge>.State
        {
            // スイッチOFF状態の時にやりたいことをここに書く
        }

        //コンストラクタ
        void Hoge()
        {
            // インスタンスを生成して有限オートマトンを作成
            stateMachine = new ImtStateMachine<Hoge>(this);
            // 遷移の定義
            stateMachine.AddTransition<OffState, OnState>(0); // 引数0で遷移する。つまり、0が「スイッチを押す」に相当する。
            stateMachine.AddTransition<OnState, OffState>(0);
        }
    }

状態

        // 状態ONを表すクラス
        private class OnState : ImtStateMachine<Hoge>.State
        {
            // スイッチON状態の時にやりたいことをここに書く
        }

        // 状態OFFを表すクラス
        private class OffState : ImtStateMachine<Hoge>.State
        {
            // スイッチOFF状態の時にやりたいことをここに書く
        }

これら2つの内部クラス「OnState」「OffState」が、有限オートマトンの2つの状態「ON」「OFF」にそれぞれ対応しています。

遷移・条件(イベント)

            // 遷移の定義
            stateMachine.AddTransition<OffState, OnState>(0); // 引数0で遷移する。つまり、この0が条件「スイッチを押す」に相当する。
            stateMachine.AddTransition<OnState, OffState>(0);

<現在の状態,遷移先の状態>(遷移条件)というように書いて遷移を定義できます。先ほどの有限オートマトンの「ON→OFF」、「OFF→ON」の矢印に対応します。
条件は今回は簡単のため直接数値で表していますが、列挙型で書くと直感的で楽です。

実装できた!

全然緩く喋れなかった気がしますが 有限オートマトンとそれをプログラムで書くとどうなるか、なんとなく分かっていただけたでしょうか。
実際にこのプログラムで書いた有限オートマトンを動かすには、初期状態、イベントの入力、有限オートマトンの更新など、やることが もう少しありますが、気になる方はこれらも難しくないので是非実際に動かしてみてください。ここまでお付き合いいただきありがとうございました。

SHARE THIS POST