Top Banner
やわらかマッドサイエンティスツの プログラミング入門 はじめてのソフトウェア工学 状態遷移図の巻 USP友の会 会長・上田隆一 2011109USP友の会勉強会
31

USP友の会勉強会、状態遷移図の巻

Nov 02, 2014

Download

Technology

Ryuichi Ueda

間違いがあったら教えてください。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: USP友の会勉強会、状態遷移図の巻

やわらかマッドサイエンティスツのプログラミング入門 

はじめてのソフトウェア工学 状態遷移図の巻

USP友の会 会長・上田隆一

2011年10月9日USP友の会勉強会

Page 2: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 2

今日のおみやげ

• 状態を意識せよ

以上。

Page 3: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 3

自己紹介

• facebook: Ryuichi UEDA

• twitter: @ryuichiueda

• あとは、以下に経歴が晒してあります・・・– http://www.slideshare.net/ryuichiueda/linuxusp– 恥ずかしい

Page 4: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 4

状態とは Wikipediaより

状態(じょうたい、英: state)とは、その事物が見てどのようであるか判断できるもの。

状態に名前をつける(定義する)ことで、世の中が今どのようになっているかを言葉で識別可能になる。

現実世界

言葉(記号)の世界 生きている 死んでいる

Page 5: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 5

状態とプログラム

• 何の関係があるの??→オオアリ– コンピュータ(計算機)の動き方に関係

• オートマトン

– 知らないで言語を覚えると迷走• (実際にはそんなことは絶対ないが)こっちが先!

– ということで、特定の言語は出てきません。

• きれいなプログラムを書いている人は、状態の概念をなんとなく体得しているはず。

Page 6: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 6

プログラムを簡単にする鍵:マルコフ性

• 状態をうまく定義すると、過去にあったことが将来起こることに無関係になる。

– 式で書くと st+1 = f (st, at)s: 状態、a: 入力(外部刺激)、f: 遷移ルール

• 例:– 古典物理では、世界のスナップショットと物理法則で

次の瞬間の世界が決まる。• 振り子の運動

– 計算機のメモリ配置は、ひとつ前のクロックのメモリ配置と入力で決定される。

• そもそも、過去のメモリ配置など計算機は記憶していない。

Page 7: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 7

例1:単振り子の例

状態 角度と角速度の数値

パラメータ(不変量) 腕の長さ、質量、重力加速度…

角速度ω

角度θ

ωt+1 = ωt – Δt g/l sinθt

θt+1 = ωtΔt + θt

ある時刻tからΔt後の時刻t+1に状態がどうなっているか

Page 8: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 8

ダメな例 角度しか考えない 右の絵を見て、次にどうなるか

予想がつくだろうか?

ちょっと前の角度を確認すれば角速度が求まり、次の状態が分かる。 まどろっこしい

• プログラムする対象をよく知らないとマルコフ性が保てない。

角度θ

Page 9: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 9

例2:計算機の動きにもマルコフ性• メモリのイチゼロが数GHzという高速周期で変わる(遷移する)

– この場合のメモリ:CPUのレジスタやHDDもすべて含む

– メモリの一部はプログラム

• 普段は自動的に遷移、たまに入力が入って条件分岐

• 遷移すると人間が喜ぶ1010010101011010101011010101010101

0110101010110010101010101010101011

1010101011001101010101010010101010

1010101001101010010101011001010101

0101010110110101010101010101010101

0110101010101010101010110101010101

キーボード

ネットワーク

金属バット

Page 10: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 10

ここまでのまとめ

• 実世界も計算機の世界も、以下の要素で成り立っていると考えてよい– 状態 s、外部刺激(入力) a、プログラム f、観測者の目

– この見方を身に付ければ大抵のことは解釈可能

• 状態の定義が適切なら、過去の状態を無視できる。– 今の状態と入力で次の状態が決まる

– 状態遷移図は、この理屈によって成立

Page 11: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 11

状態を意識したプログラミング• やること

– 状態を定義(起こりうることを数パターンにまとめる)

– 各状態で起こる入力を定義(これも数パターンにまとめる)

– 状態と入力の対から、次の状態に線を引く

– ちゃんと遷移するようにコードを書く

図:最も簡単な自動ドアのモデル

閉まっている状態

開いている状態

センサ反応センサ反応

センサ無反応

センサ無反応

↑機械を作って、この絵の通りモータを制御してやればとりあえず動く。

Page 12: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 12

これは禁止

• フローチャートを書く– 行為に注目→状態がよく分からない

• 上から下まで読まないと分からない– 脳に負荷がかかる。

• 最悪:スイカ割りプログラミング– ・・・して、・・・して、・・・すると、

スイカが割れるはずだ。• 複雑なUIを持つものは、まず予想通りにならない

– 類似:料理の本• 鍋の状態がよく分からないので

上手く行く気がしない(単なる八つ当たり)

センサを確かめる

ドアを開く

反応あり

YES

NO

センサを確かめる

反応ありYES

NO

スタート

ダァを閉める

ゴール図:最も簡単な自動ドアのモデル

Page 13: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 13

さあ始めよう

• 何を???どうやって???– ここまで風呂敷広げると、着地するのは無理

• 以下のお題を準備したのでヤる– 自動ドア

–正規表現

– csvの処理

–大変難しい問題

Page 14: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 14

書き方

• 何でもよいが、以下を守る。– 状態を書き、そこから矢印を引っ張る。

• 矢印が場合分け。入力などで分岐。(「など」が曲者)

• 場合分けが全ての事を網羅

• 状態の定義が場合分けに対して適切

• 場合によっては終端状態を置く– 受理・不受理

状態1

状態2

状態3

xの場合

xでない場合

yの場合

yでもzでもないzの場合 ダメ

OK

Page 15: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 15

リアパッド(スイッチ、衝突防止)

課題0:自動ドア変化形

• 日本にはあまりありませんが、扉になっている一方通行タイプの自動ドアがあります。このタイプのドアの状態遷移図を書いてみましょう。– 余談:水道橋にあった。

– 出展:M. Sipser著:計算理論の基礎,共立出版.

フロントパッド

(スイッチ)

図:自動ドアを上から見たところ

Page 16: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 16

答え

閉まっている状態

開いている状態

前前後後

反応なし

前後反応なし後

• 以下を網羅する。– 状態の場合分け:2通り

– 入力の場合分け:4通り

Page 17: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 17

課題1:正規表現を使って練習• 正規表現

– ここでは、grepで使うものを取り上げます。• こんなやつですね

– ^ab*c$

• わからなくても言葉で説明するので大丈夫

• 正規表現は、文字列に関する状態遷移を文字で表現したもの– 状態遷移図に落とせる

– grepに入る文字列が入力

Page 18: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 18

状態遷移図を書いてみる

q1

a

q2b

それ以外

q3c

それ以外 それ以外

改行

ダメな状態

マッチした状態

Page 19: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 19

やること

• 次の正規表現を状態遷移図にしてみる。– ^[^、。] [^ 、 。]*な、[^ 、 。] [^ 、 。]*は、[^ 、 。] [^ 、 。]*だ。$

– 正規表現になじみのない人向け• 一文字以上文字が続き、つぎに「な、」が来て、

その後、一文字以上文字が続き、「は、」が来て、その後、一文字以上文字が続き、「だ。」で終わる。ただし、「。」は最後だけ。「、」も二箇所だけ。

– できたら、以下もトライ• urlのフィルタ

• e-mailのフィルタ(←完璧は無理)

Page 20: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 20

ダメ

q1

な q2

「。」 「。」

q3

は q4

「。」 「。」

、 q5

だ q6

「。」 「。」

。 q7改行

Page 21: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 21

課題2:状態遷移図+仕事

• excelが入出力するcsvをスペース区切りに直す• excelのcsv(・・・実は定かではありませんが、これを定義としましょう。)

– カンマ区切りのデータ• 例) a,b,c -> 「a」と「b」と「c」

– カンマがデータに入る場合、データを""で囲む• 例)"a","b,c","d" : 「a」と「b,c」と「d」

– 改行が入るときも""で囲む

– "を入れたいときは""と書く(データを""で囲んだ上で)

Page 22: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 22

この変換ができればOKとしましょう

• ...というのは本当はよくない態度です。

a,b,c1,2,3"""","""""","""""""""""a""","""b","c""""あい",う,え,,

a b c1 2 3" "" """"a" "b c"あ\nい\n う え_ _ _

Page 23: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 23

やること

• 状態遷移図を書く

• 書いた上で、どうすれば出力が得られるか思考

• その後、私がコーディングします。– 自信なし。

Page 24: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 24

状態遷移図を書く

改行

カンマダブルクォート

改行,カンマ

ダブルクォート

ダブルクォート

他 ダブルクォート

ダブルクォート 他

改行,カンマ

ダメ

ダメ

Page 25: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 25

仕事をさせる

改行

カンマダブルクォート

改行,カンマ

ダブルクォート

ダブルクォート

他 ダブルクォート

ダブルクォート 他

改行,カンマ

ダメ

ダメ

出力

出力

バッファ

出力

バッファ

エラー

エラー何もしない

バッファ

バッファ

何もしない

何もしないバッファ

出力

01

2

3

4

Page 26: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 26

コーディング(書くだけ)

1 #!/usr/bin/python 2 #encoding: utf-8 3 #状態遷移図を見て何も考えずに打ったコード 4 #written by 脊髄 in 上田 5 6 import os,sys 7 8 buffer = "" 9 def printBuffer(ret): 10 global buffer 11 if ret: print buffer.encode("utf_8") 12 else: print buffer.encode("utf_8"), 13 buffer = "" 14 15 def stateTrans(ch,state): 16 global buffer 17 if state == 0: 18 if ch == "\n": print "_" 19 elif ch == ",": print "_", 20 elif ch == '"': state = 2 21 else: 22 buffer += ch 23 state = 1

Page 27: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 27

24 elif state == 1: 25 if ch == "\n": 26 printBuffer(True) 27 state = 0 28 elif ch == ",": 29 printBuffer(False) 30 state = 0 31 elif ch == '"': sys.exit(1) 32 else: buffer += ch 33 elif state == 2: 34 if ch == "\n": 35 buffer += "\\n" 36 state = 3 37 elif ch == '"': state = 4 38 else: buffer += ch 39 elif state == 3: 40 if ch == '"': state = 4 41 elif ch == "\n": buffer += "\\n" 42 else: buffer += ch 43 elif state == 4: 44 if ch == '"': 45 state = 2 46 buffer += ch 47 elif ch == "\n": 48 printBuffer(True) 49 state = 0 50 elif ch == ",": 51 printBuffer(False) 52 state = 0 53 else: sys.exit(1) 54 55 return state 56 57 if __name__ == "__main__": 58 state = 0 59 for line in sys.stdin: 60 line = line.decode("utf_8") 61 for ch in line: 62 state = stateTrans(ch,state)

Page 28: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 28

課題3:鉄道経路検索

• 以下のようにサービスの質を細かくしていくと、状態の定義はどうなっていくか?– 待ち時間なし、駅内の移動時間なしとして駅から駅へ移動する最短時間を求める。

– ホーム間の移動時間を考慮

– 時刻表に基いて待ち時間を考慮

– 移動者の年齢を考慮してホーム間の移動時間を調整

– ・・・

• 難しいので答えは用意していません。一緒に悩みましょう。

Page 29: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 29

まとめ

• 状態について考えた

• 課題を行った– 自動ドア → ごく簡単な組み込み

–正規表現 → きれいな理論の世界の状態遷移

– csv解析 → 状態遷移+仕事

– 経路検索の問題 → 実際のシステム

Page 30: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 30

発展

• やっていないこと– 「どう状態を定義すればよいのか」の正解

• 王道なし、パターンはありそう。

– プログラミング言語• なにか作りたくなったら、覚えましょう。

– フォーマルな書き方• 次回へ

Page 31: USP友の会勉強会、状態遷移図の巻

Oct. 9, 2011 USP友の会勉強会 31

もっと勉強したい人にお勧め• 理論

– Sipser 著, 渡辺・太田 約: 計算理論の基礎 ―1.オートマトンと言語,共立出版, 2008.

• 書き方– Fowler 著, 羽生田 約, UML モデリングのエッセンス 第三版, 翔泳社, 2005.

• 業務– 飯泉, 大槻: ずっと受けたかったソフトウェア設計の授業 ―構造化・モジュール化・仕様化の原理, 翔泳社, 2011.