Es gibt durchaus ein paar Probleme mit Ihrem Code:
- , wenn Sie die Staaten zu einem
set
der besuchten Staaten hinzufügen möchten, haben sie tuple
sein, wie list
nicht
- don ist hashable‘ t fügen Sie die einzelnen Elemente aus dem Zustand der
deque
, nur der Staat als Ganzes
- Wenn dies ein BFS sein soll, müssen Sie
deque.popleft
verwenden, so dass es wie eine FIFO-Warteschlange verhält; unter Verwendung pop
haben Sie eine LIFO-Warteschlange oder Stapel, d. h. ein DFS (Tiefe erste Suche)
while not frontier <= len(frontier)
macht keinen Sinn; wahrscheinlich Sie while len(frontier) > 0
oder nur while frontier
goalTest
ist nur ein Referenzzustand, so sollten Sie nur vergleichen: if state == goalTest
neighbors
keine Methode state
ist (die nur eine Liste oder Tupel ist), sondern sollte eine Funktion sein, so rufen Sie es wie neighbors(state)
anstelle von state.neighbors()
neighbor not in frontier or explored
nicht überprüft, ob neighbor
in keiner dieser Listen ist, aber (neighbor not in frontier) or explored
; auch, keine Notwendigkeit zu prüfen, ob es in frontier
ist, wenn Sie es explored
hinzufügen sofort
- statt
return "FAILURE"
, sollten Sie nur return False
oder return None
Hier ist eine feste (aber nicht gründlich getestet) Version:
initialState = tuple(initialState.split(','))
goalTest = ('0','1','2','3','4','5','6','7','8')
def bfs(initialState, goalTest):
frontier = collections.deque([initialState])
explored = set()
while frontier:
state = frontier.popleft()
print(repr(state), len(frontier), len(explored))
if state == goalTest:
return state
for neighbor in neighbors(state):
if neighbor not in explored:
frontier.append(neighbor)
explored.add(neighbor)
return False
def neighbors(state):
...
Implementierung neighbors
ist als Übung für den Leser übrig. Wenn dies ist, as you say, ein , dann soll 0
der "leere" Platz im Puzzle sein. Überprüfe einfach, welche der anderen Teile daneben sind (Tipp: Division und Modulo sind deine Freunde) und tausche diese Teile aus und gib dann eine Liste dieser getauschten Zustände zurück.
Beachten Sie auch, dass BFS möglicherweise nicht der beste Algorithmus für dieses Problem ist, da es viel von Staaten gibt, und uninformierte Suche, wie BFS, kann sehr, sehr lange dauern. Bessere informierte Suche, wie z. B. A*, verwenden z. die Anzahl der falsch platzierten Kacheln als Heuristik.
Der Fehler ist selbsterklärend, 'goalTest' ist eine Liste und Sie versuchen, ein Argument wie eine Funktion zu übergeben; und fixiere deinen Einzug –
ok ich bin ein Web Frontend Entwickler und ein Newbee in Python. Ich habe gerade einen KI-Kurs begonnen und dies ist nur eine Einheit für den Programmiervortrag. So laufe ich jedes Mal in Probleme, wenn ich nicht wirklich verstanden habe, was los ist. Ich hoffe auf Hilfe. Vielleicht kann ich es besser verstehen, wenn ich einen lauffähigen sccipt habe. Und die Grenze ist, weil "nicht Grenze:" nicht funktioniert hat. Und ich versuche zu verstehen, dass der Nachbar auch denkt. –
Sie sollten hinzufügen, wie genau Ihre Eingabe aussieht und was die "Nachbarn" eines bestimmten Staates sind, dann können wir Ihnen vielleicht helfen. –