2017-11-07 12 views
1

回避策として、私のWindows 10システムにpygraphvizをインストールできませんでした。FSMの状態と遷移を別のグラフに保存しようとしています。例:Python Transitions:FSMの可能なすべての遷移をグラフにマップする方法

from transitions import Machine 
from graphviz import Digraph 

class Matter(object): 
    pass 

# The states 
states=['hungry', 'satisfied', 'full', 'sick'] 

# And some transitions between states. 
transitions = [ 
    { 'trigger': 'eat', 'source': 'hungry', 'dest': 'satisfied' }, 
    { 'trigger': 'eat', 'source': 'satisfied', 'dest': 'full' }, 
    { 'trigger': 'eat', 'source': 'full', 'dest': 'sick' }, 
    { 'trigger': 'rest', 'source': ['satisfied', 'full', 'sick'], 'dest': 
     'hungry' }] 


# Initialize 
machine = Matter() 
fsm = Machine(machine, states=states, transitions=transitions, initial=states[0]) 
dot = Digraph(comment='FSM') 

src = machine.state 

for event in transitions: 
    machine.trigger(event['trigger']) 
    dst = machine.state 
    dot.edge(src,dst,event['trigger']) 
    src = dst 

print (dot) 

ここで、myグラフには、すべての可能な遷移は含まれておらず、連続遷移のみが含まれています。

出力:

digraph { 
    hungry -> satisfied [label=eat] 
    satisfied -> full [label=eat] 
    full -> sick [label=eat] 
    sick -> hungry [label=rest] 
} 

あなたが複数の状態遷移をグラフに存在していない見ることができるように。すべてのトランジションをトリガしてグラフに格納する方法はありますか、またはこれをすべて動作させるためのカスタムコードを記述する必要がありますか。

答えて

1

transitionsは、イベントの移行を構成します。 Eventには、いくつかのトランジションが含まれていて、再度辞書に編成されています。あなたが望むことを達成するには、イベントを取得するために、まずイベント辞書(キーはトリガーの名前と値はEventです)を反復処理します。次に、Event.transitions(キーは元の状態であり、値は該当するTransitionオブジェクトのリストです)を繰り返して、トランジションのリストを取得します。次に、このリストを繰り返して、各遷移のソースと宛先を取得します。あなたが好きな場合は、ラベルとして、トリガー名を使用することができます。

from transitions import Machine 
from graphviz import Digraph 


class Matter(object): 
    pass 


# The states 
states = ['hungry', 'satisfied', 'full', 'sick'] 

# And some transitions between states. 
transitions = [{'trigger': 'eat', 'source': 'hungry', 'dest': 'satisfied'}, 
       {'trigger': 'eat', 'source': 'satisfied', 'dest': 'full'}, 
       {'trigger': 'eat', 'source': 'full', 'dest': 'sick'}, 
       {'trigger': 'rest', 'source': ['satisfied', 'full', 'sick'], 
       'dest': 'hungry'}] 


# Initialize 
machine = Matter() 
fsm = Machine(machine, states=states, transitions=transitions, initial=states[0], 
       auto_transitions=False) 
dot = Digraph(comment='FSM') 

for label, event in fsm.events.items(): 
    for event_transitions in event.transitions.values(): 
     for transition in event_transitions: 
      dot.edge(transition.source, transition.dest, label) 
print(dot) 

出力:

// FSM 
digraph { 
    hungry -> satisfied [label=eat] 
    satisfied -> full [label=eat] 
    full -> sick [label=eat] 
    satisfied -> hungry [label=rest] 
    full -> hungry [label=rest] 
    sick -> hungry [label=rest] 
} 

を私はまた、あなたのMachineauto_transitions=Falseを追加しました。この方法では、transitionsは自動遷移(to_<state_name>)を生成しないため、グラフが乱雑になります。もちろん、auto_transitions=Trueで修正するか、またはtransitionsdiagrams extensionで行われたように、グラフから自動トランジションをフィルタリングすることができます。

関連する問題