并行运行N皇后问题的球拍代码

时间:2017-09-10 19:12:17

标签: concurrency parallel-processing scheme racket n-queens

我使用以下简单代码来解决n-queens问题:

#lang racket

; following returns true if queens are on diagonals:  
(define (check-diagonals bd) 
  (for/or ((r1 (length bd)))
    (for/or ((r2 (range (add1 r1) (length bd))))
      (= (abs (- r1 r2))
         (abs(- (list-ref bd r1)
                (list-ref bd r2)))))))

; set board size: 
(define N 8)
; start searching: 
(for ((brd (in-permutations (range N))))
  (when (not (check-diagonals brd))
    (displayln brd)))

它工作正常,但需要很长时间才能获得更大的N值。它使用in-permutations函数来获取排列流。我还看到它仅使用25%的CPU功率(正在使用4个核中的1个)。如何修改此代码,以便它使用来自in-permutations流的排列并行测试并使用所有4个cpu内核?谢谢你的帮助。

编辑:修改后的check-diagonals功能,如评论中所示。较旧的代码是:

(define (check-diagonals bd) 
  (define res #f)
  (for ((r1 (length bd))
        #:break res)
    (for ((r2 (range (add1 r1) (length bd)))
          #:break res)
      (when (= (abs (- r1 r2))
               (abs(- (list-ref bd r1)
                      (list-ref bd r2))))
        (set! res #t))))
  res)

0 个答案:

没有答案