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