-1

だから私は 8 パズルの A* 検索を行っていますが、うまくいくように見えますが、問題は、解決策が見つかると優先順位マップを通過し続け、すべての可能性を出力することです。条件を満たしたときに停止して出力する方法はありますか?

: doseq を for ループで遅延させ、それらを評価しないようにするのが最善の方法だと思います。これを行う方法はありますか?

ここに私のコードがあります:

(defn a-star

   ([board history]

     (if (at-end? board) (print-board board)


           (let [options (filter #(possible-move? % board) *moves*)
                move (into (pm/priority-map) (for [move options] [move (global-man-dis (move-tile board move))]))]


              (doseq [pair move :let [next-move (key pair)]] 


                  (print-board (move-tile board next-move))
                  (println)
                  (a-star (move-tile board next-move) next-move (conj history board))

              )
          )
    ))



  ([board prev-move history]

     (if (or (at-end? board) (history-check history board)) (print-board board)


      (let [options (get-queue board (dont-go-back prev-move))
            move (into (pm/priority-map) (for [move options] [move (global-man-dis (move-tile board move))]))]

        (doseq [pair move :let [next-move (key pair)]] 


             (print-board (move-tile board next-move))
             (println)
             (a-star (move-tile board next-move) next-move (conj history board))

         )
       )
     )))



(defn -main [& args]
  (println "insert a list all numbers no spaces or letters")
  (def board (mapv (fn [^Character c] (Character/digit c 10)) (read-line)))
  ;(def testt [0 8 4 7 2 1 3 5 6])
  ;(def testt [1 2 3 5 4 6 8 0 7])
  (a-star board [])
  )
4

2 に答える 2

1

一般的な方法の 1 つはif、最後の再帰呼び出しの前後にステートメントを配置することです。何かのようなもの:

(if-not (finished? move)
   (a-star ... ))

ps: 書式設定の重要でない点が 1 つあります。一部の clojure プログラマーは、すべての連続する終了文字が同じ行にある方が読みやすいと感じています)が、これは純粋に個人的な好みです。

于 2013-09-24T22:07:23.767 に答える