ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

状態遷移図・状態遷移表の書き方(基本編)

2018-05-18 09:32:04 | 開発ネタ
新人さん向け




■状態遷移表とは

Wikipediaには、大きく2種類出ている。

(A)縦軸(または横軸)は現在の状態を示し、横軸(または縦軸)はイベントを示す。交差する箇所の各マスには、そのイベントが起きたときに次に遷移すべき状態を記述する(そして遷移に伴う動作があれば記述する)。
(B)縦軸(または横軸)は現在の状態を示し、横軸(または縦軸)は次の状態を示す。交差する箇所の各マスは、その遷移を発生させるイベントを記述する。グラフ理論における隣接行列を拡張したものと言える。

つまりS1→S2へ状態遷移するときにイベントEが起きるとすると
(A)縦軸 S1 横軸 E 交点 S2
(B)縦軸 S1  横軸 S2 交点 E
で表したもの。集計の仕方の違いなので(A) (B)は、変換可能

そして、(A)は、交点に書くものは2種類あることになる
   (1)遷移に伴う動作(=実行プロセス)があれば記述する
   (2)次に遷移すべき状態を記述する
以下、この(1)、(2)の見つけ方について例を使って説明する

(ごめん、ネットが使えない状態でブログ書いていて、今Wikipediaで確認したら、Wikipediaは(1)と(2)の
 順番が逆だった。以下の文を修正するのはめんどくさいので、Wikipediaとは逆の順番で(1)、(2)を振っている)





■例

 たとえば、こんな文があったとする
  まっすぐ行って、交差点を右、そして200m行ったら、今度は左、駅が見えるから駅に着いたらおろしてね。
  でも、料金が1500円になったら、そこでおろして

この場合、状態
   1.現在地通過
   2.交差点通過
   3.交差点から200m先通過

イベント(状態が変わる可能性が起こったOR何かしないといけない)
   あ。交差点につく
   い。交差点から200m行く
   う。駅に着く
   え。料金1500円になる


これの状態遷移表は、こんなかんじ

(1)その時に行う処理を書く場合

            現在地通過    交差点通過       交差点から200m通過 
交差点につく      右にまがる
交差点から200m            左に曲がる
駅に着く                             おろす
料金1500円     おろす      おろす         おろす


(2)次のステータスを書く場合
            現在地通過    交差点通過       交差点から200m通過 
交差点につく      交差点通過
交差点から200m            交差点から200m通過
駅に着く                             終了
料金1500円     終了       終了          終了







■状態遷移表の書き方

●(1)を作成する

(イ)状態を格納する変数を見つける

(ロ)「(イ)の変数」に値をセットしているところを探す。そのとりえる値が状態
   →Cだと#define、Javaだと、static final等(あとenumとか)で定数をとっている場合が多い
    それを探すほうがいいかも

(ハ)ifやswitchで「(イ)の変数」をもとに 分岐しているところを探す。
   そのIF文またはSWITCH文で、「(イ)の変数:以外の条件等を聞いているとき、
   それはイベントとして考える

  例:
   switch(sts)
   {
   case  現在地通過:
     if (( GPSによる現在地の緯度 == 交差点の緯度) && ( GPSによる現在地の経度 == 交差点の経度))
     {
        右に曲がる
        セーブ移動距離=現在までの移動距離
     }
     break;
   case  交差点通過:
     if((現在までの移動距離-セーブ移動距離) == 200 m)
     {
        左に曲がる
        セーブ移動距離=0
     }
     break;
   case  交差点から200m通過:
     if (( GPSによる現在地の緯度 == 駅の緯度) && ( GPSによる現在地の経度 == 駅の経度))
     {
        終了(降りる)
     }
     break;
   }
    

(二)(イ)の変数の値で(ハ)が成立するとき、することを、表の(イ)、(ハ)の交点に書く

  例:上記の表(1)

    現在地通過 & 交差点につく(GPSうんちゃらの部分)→右に曲がるになっている


●(1)から(2)を作る

(ホ)交点の関数が、「(イ)の変数」を書き換えていたら、書き換えた値を交点に書く
   書き換えていなかったら、表の縦軸の値を書く

 例:右に曲がる関数

 void 右に曲がる(int sts)
 {
   if (sts != 現在地通過 )
{
       エラーメッセージ(”まがるな”);
return;
    }

    // ここにくるのは、現在地通過だけ
    まがる処理(右)
    sts = 交差点通過
 }

→「sts = 交差点通過」で「イの変数」(=sts)が変わるので、「交差点通過」を書く






■状態遷移表から状態遷移図を書く

●(2)の状態遷移表があるとき

(へ)(2)の状態をノードとして書く

(ト)横軸の状態が起点、交点が終点で→を書く。
   その→のところの「イベント」が「ガード条件」




 文字にすると、余計わかりにくくなったので、今度暇なときに図を入れる



この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ロボットセミナーをやり、個... | トップ | ソフトウェアPLCとか、PLCの... »
最新の画像もっと見る

開発ネタ」カテゴリの最新記事