图搜索问题求解--实验报告

  • 格式:doc
  • 大小:222.00 KB
  • 文档页数:10

实 验 报 告

|

|

实验名称 图搜索问题求解

课程名称 人工智能

|

|

验证性、综合性实验报告应含的主要内容:

一、实验目的及要求

二、所用仪器、设备

三、实验原理

四、实验方法与步骤

五、实验结果与数据处理

六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见)

七、所附实验输出的结果或数据

设计性实验报告应含的主要内容:

一、设计要求

二、选择的方案

三、所用仪器、设备

四、实验方法与步骤

五、实验结果与数据处理

六、结论(依据“设计要求”)

七、所附实验输出的结果或数据

* 封面左侧印痕处装订 华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页 一、实验目的及要求

1. 熟悉PROLOG的运行环境,进行prolog的基本编程练习。

了解PROLOG语言中常量、变量的表示方法。PROLOG的简单程序结构,掌握分析问题、询问解释技巧;进行事实库、规则库的编写,并在此基础上进行简单的询问。

具体实验课上相关内容,练习例1到例6的内容。

2. 图搜索问题求解。

任选以下实际应用题目:爱因斯坦的超级问题、字谜问题、汉诺塔问题、八数码问题、八皇后问题、过河问题等,选两个。

要求实验报告中包括:程序及其注释和说明、console表单中的程序运行结果。

二、所用仪器、设备

PC机和trinc prolog编译软件

三、实验原理

PROLOG语言是一种以逻辑推理为基础的逻辑型程序设计语言,是一种陈述性语言而不是过程性语言。PROLOG语言能够自动实现模式匹配和回溯、具备递归技术,而且语法简明,可以简化复杂问题求解。

四、实验方法与步骤

1熟悉trinc prolog开发环境,编写简单的prolog程序,学习prolog的语法,进行事实库、规则库的编写,并进行简单的询问。

2.按照所给题目选择汉诺塔与过河问题,熟悉其算法思想,编程并调试运行。

3.写实验报告

五、求解的问题与程序

求解问题:汉诺塔问题

代码:

hanoi(N):-

move(N,left,middle,right).

move(1,A,_,C):- 华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页 inform(A,C),

!.

move(N,A,B,C):-

N1 is N-1,

move(N1,A,C,B),

inform(A,C),

move(N1,B,A,C).

inform(Loc1, Loc2):

-nl,

write('Move a disk from '-Loc1-' to '-Loc2).

求解问题:传教士与野人

代码:

get_integer(L,H,X):-L>H,!,fail.

get_integer(L,H,L).

get_integer(L,H,X):-L1 is L+1,get_integer(L1,H,X).

append([], X, X).

append([A|X], Y, [A|Z]) :- append(X,Y,Z).

member(A,[A|X]).

member(A,[B|X]) :- member(A,X).

del_move:-

retract(move(X,Y)),

fail.

del_move.

del_stat:-

retract(inistatu(X)),

retract(desstatu(Y)),!.

del_stat.

insert_move(N):-

insert_move0(N),

insert_move1(N).

insert_move0(0).

insert_move0(N):-

asserta(move(N,0)),

asserta(move(0,N)),

N1 is N-1, 华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页 insert_move0(N1).

insert_move1(N):-

get_integer(1,N,X),

get_integer(X,N,Y),

X+Y=

asserta(move(Y,X)),

fail.

insert_move1(_).

legal((X,Y,_)):-

legal1(X),

legal1(Y).

legal1((X,Y)):-

X=:=0,Y>=0,!.

legal1((X,Y)):-

Y=:=0,X>=0,!.

legal1((X,Y)):-

X>=Y,X>=0,Y>=0.

update((X,Y,0),Move,Statu1):-

(A,B)=X,

(C,D)=Y,

(E,F)=Move,

C1 is C+E,

D1 is D+F,

A1 is A-E,

B1 is B-F,

Statu1=((A1,B1),(C1,D1),1).

update((X,Y,1),Move,Statu1):-

(A,B)=X,

(C,D)=Y,

(E,F)=Move,

C1 is C-E,

D1 is D-F,

A1 is A+E,

B1 is B+F,

Statu1=((A1,B1),(C1,D1),0).

connect(Statu,Statu1):-

move(X,Y),

update(Statu,(X,Y),Statu1),

legal(Statu1). 华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页

findroad(X,X,L,L).% 递归的边界条件。

findroad(X,Y,L,L1):- % L为储存的路由表。

connect(X,Z),

not(member(Z,L)), % X所连接的节点Z不在已经储存的路由表中。

findroad(Z,Y,[Z|L],L1).

insert_statu(N):-

asserta(inistatu(((N,N),(0,0),0))),

asserta(desstatu(((0,0),(N,N),1))).

writelist([]).

writelist([X|L]):-

write(X),

nl,

writelist(L).

widesolve(N,M):-

del_move,

del_stat,

insert_move(M),

insert_statu(N),

inistatu(X),

desstatu(Y),

!,

findroad(L,X,Y),

writelist(L),

nl.

deepsolve(N,M):-

del_move,

del_stat,

insert_move(M),

insert_statu(N),

inistatu(X),

desstatu(Y),

!,

findroad(Y,X,[Y],L),

writelist(L),

nl.

华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页 六、讨论与结论

传教士与野人问题中的顺序输出问题。

七、所附实验输出的结果或数据

汉诺塔数据

结果输出

华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页

过河问题数据

结果输出

华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页 华 北 电 力 大 学 科 技 学 院 实 验 报 告

第 页 共 页