Автор работы: Пользователь скрыл имя, 14 Апреля 2013 в 14:34, лабораторная работа
Цель работы: Реализация в среде CLIPS задачи поиска в пространстве состояний и
анализ ее решения. Одной из классических задач ИИ, рассматриваемых при построении и анализе
алгоритмов поиска является известная головоломка о крестьянине, которому необходимо
переправить на другой берег реки волка, козу и капусту. Он располагает двухместной
лодкой, т.е. может перевозить только по одному объекту. При этом нельзя оставлять на
берегу волка с козой и козу с капустой, т. к. в этом случае будут потери.
(farmer-location ?fs)
(cabbage-location ?fs))
(opposite-of ?fs ?ns)
=>
(duplicate ?node
(search-depth(+ 1 ?num))
(parent ?node)
(farmer-location ?ns)
(cabbage-location ?ns)
(last-move cabbage)))
(defmodule CONSTRAINS
(import MAIN deftemplate status))
(defrule CONSTRAINS::wolf-eats-goat
(declare (auto-focus TRUE))
?node<-(status (farmer-location ?s1)
(wolf-location ?s2&~?s1)
(goat-location ?s2))
=>
(retract ?node))
(defrule CONSTRAINS::goat-eats-cabbage
(declare (auto-focus TRUE))
?node<-(status (farmer-location ?s1)
(goat-location ?s2)
(cabbage-location ?s2&~?s1))
=>
(retract ?node))
(defrule CONSTRAINS::circular-path
(declare (auto-focus TRUE))
(status (search-depth ?sd1)
(farmer-location ?fs)
(wolf-location ?xs)
(goat-location ?gs)
(cabbage-location ?cs))
?node<-(status (search-depth ?sd2&:(< ?sd1 ?sd2))
(farmer-location ?fs)
(wolf-location ?xs)
(goat-location ?gs)
(cabbage-location ?cs))
=>
(retract ?node))
(defmodule SOLUTION
(import MAIN deftemplate status))
(deftemplate SOLUTION::moves
(slot id (type FACT-ADDRESS SYMBOL) (allowed-symbols no-parent))
(multislot moves-list (type SYMBOL) (allowed-symbols no-move alone wolf goat cabbage)))
(defrule SOLUTION::goal-test
;(declare (auto-focus TRUE))
?node <- (status (parent ?parent)
(farmer-location shore-2)
(wolf-location shore-2)
(goat-location shore-2)
(cabbage-location shore-2)
(last-move ?move))
=>
(retract ?node)
(assert (moves (id ?parent) (moves-list ?move))))
(defrule SOLUTION::build-solution
?node <- (status (parent ?parent)
(last-move ?move))
?mv <- (moves (id ?node) (moves-list $?rest))
=>
(modify ?mv (id ?parent) (moves-list ?move ?rest)))
(defrule SOLUTION::print-solution
?mv <- (moves (id no-parent) (moves-list no-move $?m))
=>
(retract ?mv)
(printout t t Solution found: t t)
(bind ?length (length ?m))
(bind ?i 1)
(bind ?shore shore-2)
(while (<= ?i ?length)
(bind ?thing (nth ?i ?m))
(if (eq ?shore alone)
then (printout t Farmer moves alone to ?shore . t))
else (printout t Farmer moves with ?thing to ?shore . t)
(if (eq ?shore shore-1)
then (bind ?shore shore-2)
else (bind ?shore shore-1))
(bind ?i (+ 1 ?i))))
Результаты.
Рис.1 Окно Диалога (при выполнении работы)
Рис.2
Результат пошаговой
Рис.3 Дерево поиска
Информация о работе Реализация поиска в пространстве состояний