ÜBERBLICKWie mit modifizierten DFS-Algorithmus
Ich versuche, herauszufinden, zyklische gerichteten Graphen zu durchqueren, wie gerichtet zyklischen Graphen mit irgendeiner Art von DFS iterativen Algorithmus zu durchlaufen. Hier ist eine kleine MCVE Version von dem, was ich zur Zeit umgesetzt wurde (es funktioniert nicht mit Zyklen beschäftigen):
class Node(object):
def __init__(self, name):
self.name = name
def start(self):
print '{}_start'.format(self)
def middle(self):
print '{}_middle'.format(self)
def end(self):
print '{}_end'.format(self)
def __str__(self):
return "{0}".format(self.name)
class NodeRepeat(Node):
def __init__(self, name, num_repeats=1):
super(NodeRepeat, self).__init__(name)
self.num_repeats = num_repeats
def dfs(graph, start):
"""Traverse graph from start node using DFS with reversed childs"""
visited = {}
stack = [(start, "")]
while stack:
# To convert dfs -> bfs
# a) rename stack to queue
# b) pop becomes pop(0)
node, parent = stack.pop()
if parent is None:
if visited[node] < 3:
node.end()
visited[node] = 3
elif node not in visited:
if visited.get(parent) == 2:
parent.middle()
elif visited.get(parent) == 1:
visited[parent] = 2
node.start()
visited[node] = 1
stack.append((node, None))
# Maybe you want a different order, if it's so, don't use reversed
childs = reversed(graph.get(node, []))
for child in childs:
if child not in visited:
stack.append((child, node))
if __name__ == "__main__":
Sequence1 = Node('Sequence1')
MtxPushPop1 = Node('MtxPushPop1')
Rotate1 = Node('Rotate1')
Repeat1 = NodeRepeat('Repeat1', num_repeats=2)
Sequence2 = Node('Sequence2')
MtxPushPop2 = Node('MtxPushPop2')
Translate = Node('Translate')
Rotate2 = Node('Rotate2')
Rotate3 = Node('Rotate3')
Scale = Node('Scale')
Repeat2 = NodeRepeat('Repeat2', num_repeats=3)
Mesh = Node('Mesh')
cyclic_graph = {
Sequence1: [MtxPushPop1, Rotate1],
MtxPushPop1: [Sequence2],
Rotate1: [Repeat1],
Sequence2: [MtxPushPop2, Translate],
Repeat1: [Sequence1],
MtxPushPop2: [Rotate2],
Translate: [Rotate3],
Rotate2: [Scale],
Rotate3: [Repeat2],
Scale: [Mesh],
Repeat2: [Sequence2]
}
dfs(cyclic_graph, Sequence1)
print '-'*80
a = Node('a')
b = Node('b')
dfs({
a : [b],
b : [a]
}, a)
Der obige Code ist ein paar Fälle zu testen, wäre die erste eine Art von Darstellung des unten Graph :
das zweite ist der einfachste Fall einer Kurve, die ein "unendlich" loop {a->b, b->a}
ANFORDERUNGEN, die
- Es wird nicht so etwas wie „unendliche Zyklen“, lassen Sie uns existieren sagen, wenn man „unendlichen Zyklus“ gefunden wird, wird es eine maximale Schwelle (global var), um anzuzeigen, wenn sie um diejenigen Looping zu stoppen " pseudo-unendliche Zyklen“
- Alle Graphknoten sind in der Lage Zyklen zu schaffen, aber es wird einen speziellen Knoten
Repeat
genannt existieren, wo Sie, wie viele Iterationen Schleife um den Zyklus anzeigen kann - die oben MCVE ich geschrieben habe, ist ein iterativer Version des Traversalalgorithmus, der nicht weiß, wie man mit zyklischen Graphen umgehen kann. Idealerweise würde die Lösung auch iterativ sein, aber wenn es eine viel bessere rekursive Lösung gibt, wäre das großartig.
- Die Datenstruktur, über die wir hier sprechen, sollte nicht "gerichtete azyklische Graphen" genannt werden, weil in diesem Fall jeder Knoten hat seine Kinder bestellt, und in Graphen Knotenverbindungen haben keine Reihenfolge.
- Alles kann mit irgendetwas im Editor verbunden werden. Sie können eine beliebige Blockkombination ausführen, und die einzige Einschränkung ist der Ausführungszähler, der überläuft, wenn Sie eine unendliche Schleife oder zu viele Iterationen ausführen.
- Der Algorithmus wird Anfang/Mitte/nach Knoten Methode Ausführung ähnlich als das obige Snippet
FRAGE
Könnte jemand bieten irgendeine Art von Lösung zu erhalten, die weiß, wie unendlich/endlich Zyklen zu durchqueren?
LITERATUR
Falls die Frage zu diesem Zeitpunkt noch nicht klar ist, können Sie diese mehr über dieses Problem auf diesen article lesen können, wird die ganze Idee, den Traversierungsalgorithmus sein mit einem ähnlichen Werkzeug wie das gezeigt zu implementieren in diesem Artikel.
Hier ist ein Screenshot die ganze Kraft dieser Art von Datenstruktur zeigt, bis ich herausfinden wollen, wie & Lauf zu durchqueren:
Mit welcher Rendering-Engine arbeiten Sie? Sieht ganz gut aus. – EvilTak
@EvilTak Stimme zu, das ist großartig! Diese Rendering-Engine ist überhaupt nicht meine, ich beabsichtige, ein ähnliches Tool wie die, auf die ich in meinem Post verwiesen habe, zu erstellen! Hier können Sie einige der [erstaunlichen Prods] (http://www.pouet.net/groups.php?which=3483&order=type) ansehen, die der Autor eines solchen Tools erstellen konnte. Natürlich, achten Sie auf die Größe dieser ausführbaren Dateien, nicht mehr als 4kb und 8kb, viel Spaß haben ;-) – BPL
Also wenn ich Ihr Problem richtig verstehe, versuchen Sie, einen Algorithmus zu erstellen, der nach etwas in einem gerichteten sucht zyklischer Graph, der einen Tiefen-zuerst-Algorithmus verwendet. Sie würden auch eine iterative Lösung gegenüber einer rekursiven bevorzugen. Ist das korrekt? – SarcasticSully