0

我正在考虑在方案中实现 bfs 以解决 8 难题问题,这是我到目前为止的代码(给出一些我无法调试的错误)::

;;一些用于定义结构的运算符
(定义空白'空白)
(定义深度 0)(定义路径成本 0)
(定义 nw 0)
(定义 n 1)
(定义 ne 2)
(定义 w 3)
(定义 c 4)
(定义 e 5)
(定义 sw 6)
(定义第 7 条)
(定义第 8 条)
(定义左'左)
(定义对'对)
(定义向上'向上)
(定义向下'向下)

;;创建节点的函数
(定义制作节点
  (lambda (state parent operator depth path-cost)
    (列出状态父运算符深度路径成本)))

(定义扩展程序
  (lambda (curr rest)
    (追加休息(gen-nodes curr(valid-moves(car curr)))))

(定义 gen-nodes
  (lambda (节点移动)
    (条件
      [(null?moves) '()]
      [别的
       (letrec ((gen-states
                (lambda (节点操作符移动)
                  (如果(对?移动)
                      (缺点
                       (make-node (operator (car node)) (append (car node) (car (cdr node))) operator (+ 1 (car(cdr(cdr(cdr node))))) 1)
                       (gen-states 节点(汽车移动)(cdr 移动)))
                      (make-node (operator (car node)) (append (car node) (car (cdr node))) operator (+ 1 (car(cdr(cdr(cdr node))))) 1)))))
                (gen-states 节点(汽车移动)(cdr 移动)))])))

(定义未访问的父级
  (lambda(新列表)
    (如果(对?列表)
        (if (eqv?new (car list))
            #F    
            (未访问(cdr 列表)新))
        (如果(eqv?新列表)
            #F
            #t))))

(定义未访问的其他
  (lambda(新列表)
    (如果(对?列表)
        (if (eqv?new (car (car list)))
            #F    
            (未访问(cdr 列表)新))
        (if (eqv?new (car list))
            #F
            #t))))

(定义查找空白
  (lambda (ls 参考)
    (条件
      [(eq?ref 9) null]
      [(eq? (list-ref ls ref) '空白) ref]
      [else (查找空白 ls (+ ref 1))])))


;;运算符移动空白    
(定义左
  (拉姆达(状态)
    (swap state (find-blank state 0) (- (find-blank state 0) 1))))

(定义正确
  (拉姆达(状态)
      (swap state (find-blank state 0) (+ (find-blank state 0) 1))))

(定义
  (拉姆达(状态)
    (swap state (find-blank state 0) (- (find-blank state 0) 3))))

(定义下来
  (拉姆达(状态)
    (swap state (find-blank state 0) (+ (find-blank state 0) 3))))

; 将 ref1 设置为 ref 2 的值
(定义 set-ref!
  (lambda (list ref1 value iter)
    (如果(eqv?iter 9)
        '()
        (如果(对?列表)
            (缺点
             (如果(eq?ref1 iter)
                 价值
                 (list-ref list iter))
             (set-ref!list ref1 value (+ iter 1)))
            (如果(eq?ref1 iter)
                 价值
                 (list-ref list iter))))))

(定义交换
  (lambda (状态 ref1 ref2)
    (开始
      (定义温度(列表参考状态参考1))
      (set!state (set-ref!state ref1 (list-ref state ref2) 0))
      (set!state (set-ref!state ref2 temp 0))
      状态)))

;;返回给定状态的有效移动  
(定义有效动作
  (拉姆达(状态)
    (案例(查找空白状态0)
      ([0](列表右下))
      ([1](列表左下右下))
      ([2](左下列表))
      ([3](从上到下列出))
      ([4](从左到右列出))
      ([5](左上下列表))
      ([6](向上列出))
      ([7](左上右上列表))
      ([8](左上列表))
      (别的 '()))))  

;;测试我们是否达到目标状态的程序
(定义测试程序
  (拉姆达(状态)
    (如果(eq?(汽车状态)目标)
        #t
        #F)))

;;一般搜索程序
(定义一般搜索
  (lambda (queue test-procedure expand-procedure limit num-runs output-procedure)
    (条件
     [(null?queue) #f] ;队列为空 - 未找到目标状态 - 非常不可能的情况 - 除非某些 bozo 超出状态空间
     [(test-procedure (car queue)) (output-procedure num-runs (car queue))] ;达到目标状态??
     [(零?限制)“达到限制”] ;达到限制停止
     [其他(一般搜索
     (expand-procedure (car queue) (cdr queue))
      测试程序扩展程序(-限制1)(+ num-runs 1)输出程序)])))

(定义输出过程
  (lambda (num-runs 节点)
    (开始
    (显示运行次数)
    (显示“\n”)
    (显示 (list-ref (汽车节点) nw))
    (显示 (list-ref (汽车节点) n))
    (显示 (list-ref (汽车节点) ne))
    (显示“\n”)
    (显示 (list-ref (汽车节点) w))
    (显示 (list-ref (汽车节点) c))
    (显示 (list-ref (汽车节点) e))
    (显示“\n”)
    (显示 (list-ref (汽车节点) sw))
    (display (list-ref (car node) s))
    (display (list-ref (car node) se)))))

;;测试函数    
(定义使初始状态
  (lambda (nw n 新 wce sw s se)
    (列表 nw n 新 wce sw s se)))

(定义目标状态
  (lambda (nw n 新 wce sw s se)
    (列表 nw n 新 wce sw s se)))

(定义测试不知情搜索
  (lambda(初始目标限制)
    (开始
      (定义队列 (list (make-node init '() '() 0 1)))
      (通用搜索队列测试程序扩展程序限制 0 输出程序))))

(定义初始化(make-initial-state 1 2 3 4 5 6 7 空白 8))
(定义目标(make-goal-state 1 2 3 4 5 6 7 8 空白))
(test-uninformed-search init 目标 2000)
4

1 回答 1

1

我越来越

module: duplicate definition for identifier in: left

作为一个错误,这意味着您不止一次定义了 left。(我在 DrRacket 中运行它,所以可能与你的不同。)

尝试先修复它。

于 2010-11-05T02:42:30.570 回答