目次
ステートマシンとは
ステートマシンは、変化を制御する条件が満たされる(変化の引き金にあるイベントが発生する)と、ある状態から別の状態に遷移する(状態遷移)、イベント駆動型のシステムを表現したものです。 動的なシステムにおける複雑なロジックをモデル化するために活用します。ステートマシンを使って、人の感情モデルを作ってみましょう。
プルチックの感情の輪
1980 年にロバート・プルチックは、感情の輪を提案しました。8 つの基本感情(喜び、信頼、恐れ、驚き、悲しみ、嫌悪、怒り、期待)、16 の強弱派生、8 つの応用感情から成り立ちます。

Python でステートマシン(transitions)
python のtransitionsは、ステートマシン実装用のライブラリです。
プルチックの感情の輪で定義される 8 つの基本感情を状態定義し、人の表層的な変化が観測された時に、人の感情(状態)がどのように遷移するのかモデル化してみましょう。
例 1: A さんが"trust"の感情だった時に、A さんが笑顔になった。A さんは、“joy"の感情になるだろうか。
例 2: B さんが"sadness"の感情だった時に、B さんが笑顔になった。B さんは、“joy"の感情になるだろうか。
プルチックによれば、対になっている感情同士(“joy"と"sadness”)は、簡単には移行しないようです。
例 1 は遷移可能、例 2 は遷移不可能として、以下に実装してみたいと思います。
from transitions import Machine
class StateMachine(object):
# 状態定義
# joy: 喜び
# trust: 信頼
# fear: 恐れ
# surprise: 驚き
# sadness: 悲しみ
# disgust: 嫌悪
# anger: 怒り
# anticipation: 期待
states = ['joy', 'trust', 'fear', 'surprise', 'sadness', 'disgust', 'anger', 'anticipation']
# ステートマシン定義
# trigger:遷移の引き金になるイベント
# source:トリガーイベントを受ける状態
# dest:トリガーイベントを受けた後の状態
# before:遷移前に実施されるコールバック
# after:遷移後に実施されるコールバック
def __init__(self, initial):
self.machine = Machine(model=self, states=StateMachine.states, initial=initial, auto_transitions=False)
self.machine.add_transition(trigger='smile_found', source='trust', dest='joy', before='to_joy')
self.machine.add_transition(trigger='smile_found', source='antifipation', dest='joy', before='to_joy')
#以下、遷移時のアクション
def to_joy(self):
print("*** to_joy ***")
a = StateMachine('trust')
print("Aさんの感情は、" + str(a.state))
try:
a.smile_found()
print("笑顔のAさんの感情は、" + str(a.state))
except:
print("笑顔のAさんの感情は、変わりません")
b = StateMachine('sadness')
print("Bさんの感情は、" + str(b.state))
try:
b.smile_found()
print("笑顔のBさんの感情は、" + str(b.state))
except:
print("笑顔のAさんの感情は、変わりません")