Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 验证FSM中每个状态从“开始”状态到“结束”状态的可达性_Python_Algorithm_Graph_Graph Theory_Graph Algorithm - Fatal编程技术网

Python 验证FSM中每个状态从“开始”状态到“结束”状态的可达性

Python 验证FSM中每个状态从“开始”状态到“结束”状态的可达性,python,algorithm,graph,graph-theory,graph-algorithm,Python,Algorithm,Graph,Graph Theory,Graph Algorithm,我从一个具有N个状态的有限状态机开始,即状态图上的N个顶点。 其中一种状态是“开始”状态,另一种状态是“结束”状态 我想做的是- 检查是否可以从“开始”状态访问其他N-2状态 检查“结束”状态是否可以从N-2个状态中的每个状态访问 实现这一目标的最佳算法是什么? 另外,是否有任何Python模块可以像一个函数调用那样以最小的工作量完成此验证?您可以从开始状态使用任何travesal DFS/BFS/…并将访问的状态标记为可访问状态。对于coreachability问题,只需反转边并从末尾开始。如

我从一个具有N个状态的有限状态机开始,即状态图上的N个顶点。 其中一种状态是“开始”状态,另一种状态是“结束”状态

我想做的是-

检查是否可以从“开始”状态访问其他N-2状态 检查“结束”状态是否可以从N-2个状态中的每个状态访问 实现这一目标的最佳算法是什么?
另外,是否有任何Python模块可以像一个函数调用那样以最小的工作量完成此验证?

您可以从开始状态使用任何travesal DFS/BFS/…并将访问的状态标记为可访问状态。对于coreachability问题,只需反转边并从末尾开始。

如果您正在寻找一个简单的解决方案,您可以使用。这将为您提供一个NxN数组,告诉您对于任意两种状态P和Q,Q是否可以从P到达。它取3,如果N不太大,这应该是好的

该算法可以用五行python编写。这里trans是一个列表列表,如果从s直接转换到t,trans[s][t]为真,否则为假。s和t应该是整数。它在适当的位置修改这个数组;返回时,如果存在从s到t的路径,则trans[s][t]为真:

最后一行可能是用|=写的,但我认为不太清楚

该算法也可用于计算所有最短路径数组,通常被引用为该问题的解决方案。为此,我们从一个转换数组开始,其中trans[i][j]是在没有直接转换的情况下从i到j无穷大转换的成本,并将最后一行替换为:

        trans[i][j] = min(trans[i][j], trans[i][k] + trans[k][j])
对于FSM,您通常会将所有成本设置为1或无穷大,然后您将得到任意s和t从s到t的最短路径的长度

在互联网上,在算法和图论的标准教科书中,你可以找到算法的正式证明,所以我只做一个提纲:


为了简化键入,我将假设节点由0…N-1范围内的整数表示。我们称之为路径s→p0→…→圆周率→我发现了这个Python模块,它给了我极大的帮助。 networkx.shortest_path就是我使用的函数

粘贴在对我有效的解决方案下面

import networkx as nx

G = nx.DiGraph()
G.add_nodes_from(["Start", "a", "b", "c", "End"])
G.add_edges_from([("Start", "a"), ("Start", "c"), ("a", "b"), ("b", "a"), ("c", "End")])

total_num_nodes = G.number_of_nodes()

if len(nx.shortest_path(G, source="Start")) < total_num_nodes:
    print "\nThis FSM has inaccessible states"
else:
    print "\nAll nodes reachable from 'Start'"

H = G.reverse()
if len(nx.shortest_path(H, source="End")) < total_num_nodes:
    print "\nThis FSM has dead-end states"
else:
    print "\nAll nodes have a path to reach the 'End' state"

嘿,谢谢你的回复。昨天我发现了一个名为Networkx的模块,它为这个算法提供了一个直接的api。感谢您的回复。你说了之后,图形的反转看起来很明显,但昨天我没有想到。@user189-没有。BFS和DFS完全没有想到!那么,它可能是BFS\o/
import networkx as nx

G = nx.DiGraph()
G.add_nodes_from(["Start", "a", "b", "c", "End"])
G.add_edges_from([("Start", "a"), ("Start", "c"), ("a", "b"), ("b", "a"), ("c", "End")])

total_num_nodes = G.number_of_nodes()

if len(nx.shortest_path(G, source="Start")) < total_num_nodes:
    print "\nThis FSM has inaccessible states"
else:
    print "\nAll nodes reachable from 'Start'"

H = G.reverse()
if len(nx.shortest_path(H, source="End")) < total_num_nodes:
    print "\nThis FSM has dead-end states"
else:
    print "\nAll nodes have a path to reach the 'End' state"