あるポイントAからあるポイントDまでのパスを見つけるために再帰を使用しています。パスを見つけるためにグラフを横断しています。
まあ言ってみれば:
グラフ={'A':['route1'、'route2']、'B':['route1'、'route2'、'route3'、'route4']、'C':['route3'、'route4 ']、' D':[' route4']}
アクセス可能:
A-> route1、route2
B->ルート2、ルート3、ルート4
C-> route3、route4
A-> Dからのこのパスには、2つの解決策があります。
route1-> route2-> route4
route1-> route2-> route3-> route4
ポイントBとポイントAにはルート1とルート2の両方があるため、無限ループがあるため、ノードにアクセスするたびにチェックを追加します(0または1の値)。
ただし、チェックすると、1つの解決策しか返されません:route1-> route2-> route4であり、他の可能な解決策はありません。
実際のコーディングは次のとおりです。ルートはリアクションに置き換えられます。
def find_all_paths(graph,start, end, addReaction, passed = {}, reaction = [] ,path=[]):
passOver = passed
path = path + [start]
reaction = reaction + [addReaction]
if start == end:
return [reaction]
if not graph.has_key(start):
return []
paths=[]
reactions=[]
for x in range (len(graph[start])):
for y in range (len(graph)):
for z in range (len(graph.values()[y])):
if (graph[start][x] == graph.values()[y][z]):
if passOver.values()[y][z] < 161 :
passOver.values()[y][z] = passOver.values()[y][z] + 1
if (graph.keys()[y] not in path):
newpaths = find_all_paths(graph, (graph.keys()[y]), end, graph.values()[y][z], passOver , reaction, path)
for newpath in newpaths:
reactions.append(newpath)
return reactions
メソッド呼び出しは次のとおりです。dic_passOverは、ノードにアクセスしたかどうかを追跡する辞書です。
solution = (find_all_paths( graph, "M_glc_DASH_D_c', 'M_pyr_c', 'begin', dic_passOver ))
私の問題は、一度ルートにアクセスするとアクセスできなくなるため、他の可能な解決策が不可能であるということのようです。これを説明するために、161に最大量の再帰を追加しました。ここで、特定のコードに対して可能なすべてのルートが見つかります。
if passOver.values()[y][z] < 161 :
passOver.values()[y][z] = passOver.values()[y][z] + 1
ただし、これは非常に非効率的であるように思われ、私のデータのほとんどは、数千のインデックスを持つグラフになります。さらに、すべてのルートを見つけるために許可されたノード訪問の量がわかりません。161という数字は手動で計算されました。