功能前向检查实施

时间:2016-04-04 00:11:02

标签: algorithm functional-programming scheme racket

我想在方案中以功能方式实现forward checking search algorithm。前向检查搜索是深度优先搜索,其在图的每个节点处选择变量,尝试该变量的域中的所有值并递归调用自身直到变量域为空或找到解。在伪代码中,算法是

bool ForwardChecking ()
   if no free variable then
      return true
   choose a free variable var
   for all values in the domain of var
      assign value to var
      update the domains of the free variables
      if no domain is empty or inconsistent then
        if (ForwardChecking ()) then
          return true
   return false

在我的特定问题中,我有一个向量,其中一些元素具有表示元素可以采用的可能值的seteq,而其他元素具有整数。例如,6x6向量是

#(1 (seteq 2 4 6) 5 (seteq 2 3 6) (seteq 2 3 4 6) (seteq 3 4)
 (seteq 2 3 4) (seteq 2 4 6) (seteq 2 3 6) (seteq 2 3 6) 1 (seteq 3 4 5) 
 6 (seteq 1 2 5) (seteq 1 2 3) 4 (seteq 2 3 5) (seteq 1 3 5)
(seteq 2 3 5) (seteq 1 2 5) 4 (seteq 1 2 3) (seteq 2 3 5) 6
(seteq 2 4 5) 3 (seteq 1 2 6) (seteq 1 6) (seteq 4 6) (seteq 1 4)
(seteq 4)(seteq 1 4 6) (seteq 1 6) 5 (seteq 3 4 6) 2)

我的目标是使用前向检查计算出seteq进入向量元素的整数。

我在计划中实现算法的不完全尝试如下 (find-min-pos是一个函数,用于查找具有最小整数数的向量的所有元素的位置; vector-update是一个函数,用于将其中一个元素设置为其seteq中的一个整数)

(define (forward-checking vec)
   ; get list of position of elements of vec with smallest number of 
   ; seteq elements
   (define min-free-pos (find-min-pos vec))
   (cond
     ; if no free variable return true
     [(empty? min-free-pos) #t]
     ; pick a random element of min-free-pos
     [else
        (define free-elem-pos (list-ref min-free-pos (random (length min-free-pos))))
        ; find the vector element
        (define free-elem (board-ref board free-elem-pos))
        ; loop through all values that free-elem contains
        ; this is a seteq
        (for ([i (in-set free-elem)])
          (define vec2 (vector-update vec free-elem-pos i))
          ; the following is incorrect
          (if vec2
              if forward-checking vec2)
          )
        #f]
  ))

如何完成它?是否有不同的(可能更具功能性)实施方式?

0 个答案:

没有答案