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

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

Embed Size (px)

DESCRIPTION

間違いがあったら教えてください。

Citation preview

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.