not(member(Z,L)),
path(Z,Y,[Z|L],D2),D=D1+D2.%再找Z到出口Y的路径 member(X,[X|_]).
member(X,[_|T])if member(X,T).
road(A,B,D):-road(B,A,D). %因为没向图 /* 交通图 */
road(“西安”,”北京”,1165). road(“西安”,”上海”,1511). road(“西安”,“广州” ,2129). road(“西安”,”昆明”,1942). road(“昆明”,”北京”,3179). road(“昆明”,”上海”,2677). road(“昆明”,“广州”,2216). road(“北京”,”广州”,2510). road(“上海”,”北京”,1462). road(“广州”,“上海”,1511). (1)path(“西安”,”北京”,L,D),write(L,D). (2)path(“西安”,”北京”,L,D), member(“上海”,L),write(L,D). (3)path(“西安”,”北京”,L,D),
member(“上海”,L),not(member(“昆明”,L)), write(L,D). 17. 何谓估价函数? 在估价函数中,g(x)和h(x)各起什么作用?
答:估价函数用来估计节点重要性的函数。估价函数f(x)被定义为从初始节点S0出发,约束经过节点x到达目标节点Sg的所有路径中最小路径代价的估计值。它的一般形式为: f(x)=g(x)+h(x)
其中,g(x)是从初始节点S0到节点x的实际代价;h(x)是从节点x到目标节点Sg的最优路径的估计代价。
18. 局部择优搜索与全局择优搜索的相同处与区别各是什么? 答:局部择优搜索与全局择优搜索的区别是,扩展节点N后仅对N的子节点按启发函数值大小以升序排序,再将它们依次放入OPEN表的首部。故算法从略。
19. 传教士和野人问题。有三个传教士和三个野人一起来到河边准备渡河, 河边有一条空船,且传教士和野人都会划船, 但每次最多可供两人乘渡。河的任何一岸以及船上一旦出现野人人数超过传教士人数,野人就会把传教士吃掉。为安全地渡河,传教士应如何规划渡河方案?试给出该问题的状态图表示, 并用PROLOG语言编程求解之。
若传教士和野人的数目均为五人,渡船至多可乘三人,请定义一个启发函数, 并给出相应的搜索树。
解:首先选取描述问题状态的方法。在这个问题中,需要考虑两岸的修道士人数和野人数,还需要考虑船在左岸还是在右岸。从而可用一个三元组来表示状态: S=(m, c, b) 其中,m表示左岸的修道士人数,c表示左岸的野人数,b表示左岸的船数。
右岸的状态可由下式确定:右岸修道士数:m'=3-m;右岸野人数:c'=3-c;右岸船数:b'=1-b 在这种表示方式下,m和c都可取0、1、2、3中之一,b可取0和1中之一。因此,共有4×4×2=32种状态。 这32种状态并非全有意义,除去不合法状态和修道士被野人吃掉的状态,有意义的状态只有16种:
S0=(3, 3, 1) S1=(3, 2, 1) S2=(3, 1, 1) S3=(2, 2, 1) S4=(1, 1, 1) S5=(0, 3, 1) S6=(0, 2, 1) S7=(0, 1, 1) S8=(3, 2, 0) S9=(3, 1, 0) S10=(3, 0, 0) S11=(2, 2, 0) S12=(1, 1,0) S13=(0, 2, 0) S14=(0, 1, 0) S15=(0, 0, 0) 有了这些状态,还需要考虑可进行的操作。
操作