我正在考虑在方案中实现 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)