您不必顯式構建圖形。在概念上,您可以將問題表示爲圖形,其中節點是狀態,邊是狀態之間的轉換。深度優先搜索是一直跟隨邊緣,直到達到最終狀態,然後再移動到另一邊。所以它看起來是這樣的(僞):
def search(state):
if is_end_state(state):
# search down this branch finished, do something
return something
for move in possible_moves_from(state):
search(apply_move(state, move))
你最終會隱含構建圖形,通過遞歸調用和堆棧狀態,當您去。
請注意,如果您有循環(例如,您可以向左移動,然後向右移動回到完全相同的狀態),那麼您將不得不跟蹤已經訪問過的狀態,否則將永遠循環。事情是這樣的:
def search(state, seen_states):
if state in seen_states:
# already visited, don't visit again
return
seen_states.add(state)
# same as before:
if is_end_state(state):
return something
for move in possible_moves_from(state):
search(apply_move(state, move), seen_states)
在如何實現這個方面,我建議你seen_states
是HashSet<State>
,你讓你的State
哈希的。
因此,基本上這隻會搜索一條路徑,然後倒帶,直到找到解決方案?我如何判斷當前狀態中是否存在可能的狀態之一?我的意思是,如果我將棋子移位得足夠多,我會得到重複的狀態,並且會永久循環。 – Brejuro
@Brejuro:查看更新。你只需要跟蹤已經看到的狀態,如果你已經看到它,就不要去那裏。通過保持一套。 – Claudiu
感謝您的幫助,將它作爲圖形進行建模是否合理?就像我在添加節點和邊緣一樣?我計劃也實現其他搜索算法,所以我不確定使用圖形實現是否有用。 – Brejuro