题目
-
什么是图搜索过程?其中,重排Open表意味着什么?重排的原则是什么?
图搜索过程:一种系统地探索图的点和边、在图中寻找路径的过程
重排Open表:根据评价函数 f f f,重新对当前的搜索状态进行评估,以期找到当前最有希望的结点
重排的原则:评价函数 f f f
-
试给出爬山法和分支界限搜索算法搜索图所示的从A到J的搜索路径,其中g(n)用节点深度表示,h(n)的值在图中显示。
-
怎么用一架天平3次称出13个硬币中唯一的然而未知轻重的假币(已知有标准的硬币)
方法一:状态空间
状态设置:
-
标记每枚硬币的状态为
-
标准币: S S S
-
标准币或轻币: L S LS LS
-
标准币或重币: H S HS HS
-
标准币或轻币或重币: L H S LHS LHS
-
-
记当前剩余称量次数为 t t t
用五元组 ( l h s , l s , h s , s , t ) (lhs,ls,hs,s,t) (lhs,ls,hs,s,t)描述当前状态,其中 l h s , l s , h s , s , t lhs,ls,hs,s,t lhs,ls,hs,s,t表示对应状态的硬币的枚数。则题设可以翻译为由初始状态 ( 13 , 0 , 0 , 0 , 3 ) (13,0,0,0,3) (13,0,0,0,3)到目标状态 ( 0 , 1 , 0 , 12 , 0 ) (0,1,0,12,0) (0,1,0,12,0)或 ( 0 , 0 , 1 , 12 , 0 ) (0,0,1,12,0) (0,0,1,12,0),约束条件为 t ≥ 0 t\geq0 t≥0。
变化设置:
用函数
PICKUP([lhs_1,ls_1,hs_1,s_1],[lhs_2,ls_2,hs_2,s_2])
表示本次分别从 ( l h s , l s , h s , s , t ) (lhs,ls,hs,s,t) (lhs,ls,hs,s,t)中取出了 l h s 1 , l s 1 , h s 1 , s 1 lhs_1,ls_1,hs_1,s_1 lhs1,ls1,hs1,s1个硬币放到了天平的左边,取出了 l h s 2 , l s 2 , h s 2 , s 2 lhs_2,ls_2,hs_2,s_2 lhs2,ls2,hs2,s2个硬币放到了天平的右边。令PICKUP()=-1,0,1
分别表示天平左倾、平衡、右倾,每次称量后状态转化为 ( l h s ′ , l s ′ , h s ′ , s ′ , t − 1 ) (lhs',ls',hs',s',t-1) (lhs′,ls′,hs′,s′,t−1)。-
左倾
PICKUP=-1
,
s ′ = s + l s 1 + h s 2 + ( l h s − l h s 1 − l h s 2 ) + ( l s − l s 1 − l s 2 ) + ( h s − h s 1 − h s 2 ) = s + l s − l s 2 + h s − h s 1 + l h s − ( l h s 1 + l h s 2 ) l s ′ = l s 2 + l h s 2 h s ′ = h s 1 + l h s 1 l h s ′ = 0 \begin{aligned} s' &= s+ls_1+hs_2+(lhs-lhs_1-lhs_2)+(ls-ls_1-ls_2)+(hs-hs_1-hs_2) \\ &= s+ls-ls_2+hs-hs_1+lhs-(lhs_1+lhs_2) \\ ls' &= ls_2+lhs_2 \\ hs' &= hs_1+lhs_1 \\ lhs' &= 0 \end{aligned} s′ls′hs′lhs′=s+ls1+hs2+(lhs−lhs1−lhs2)+(ls−ls1−ls2)+(hs−hs1−hs2)=s+ls−ls2+hs−hs1+lhs−(lhs1+lhs2)=ls2+lhs2=hs1+lhs1=0- 在左天平状态为 L S LS LS的硬币,在右天平的状态为 H S HS HS和天平下的硬币都是标准型;
- 右天平原有的 l s 2 ls_2 ls2个轻标准型硬币仍然为轻标准型,右天平的 l h s 2 lhs_2 lhs2个轻重标准型硬币改为轻标准型;0
- 左天平原有的 h s 1 hs_1 hs1个重标准型硬币仍然为重标准型,左天平的 l h s 1 lhs_1 lhs1个轻重标准型硬币改为重标准型;
- 只要不平衡,就不存在轻重标准型的硬币, l h s ′ = 0 lhs'=0 lhs′=0
-
平衡
PICKUP=0
,
s ′ = s + l s 1 + l s 2 + h s 1 + h s 2 + l h s 1 + l h s 2 l s ′ = l s − l s 1 − l s 2 h s ′ = h s − h s 1 − h s 2 l h s ′ = l h s − l h s 1 − l h s 2 \begin{aligned} s' &= s+ls_1+ls_2+hs_1+hs_2+lhs_1+lhs_2 \\ ls' &= ls-ls_1-ls_2 \\ hs' &= hs-hs_1-hs_2 \\ lhs' &= lhs-lhs_1-lhs_2 \end{aligned} s′ls′hs′lhs′=s+ls1+ls2+hs1+hs2+lhs1+lhs2=ls−ls1−ls2=hs−hs1−hs2=lhs−lhs1−lhs2- 在天平上的所有硬币都是标准型
- 左右天平上的轻标准型、重标准型均改为标准型
- 平衡情况下,轻重标准型硬币需要减去天平上的轻重标准型
-
右倾
PICKUP=1
,
s ′ = s + l s − l s 1 + h s − h s 2 + l h s − ( l h s 1 + l h s 2 ) l s ′ = l s 1 + l h s 1 h s ′ = h s 2 + l h s 2 l h s ′ = 0 \begin{aligned} s' &= s+ls-ls_1+hs-hs_2+lhs-(lhs_1+lhs_2) \\ ls' &= ls_1+lhs_1 \\ hs' &= hs_2+lhs_2 \\ lhs' &= 0 \end{aligned} s′ls′hs′lhs′=s+ls−ls1+hs−hs2+lhs−(lhs1+lhs2)=ls1+lhs1=hs2+lhs2=0- 与天平左倾情况对称
搜索路径
与或图中省略:
-
不可能情况
-
部分称量中的对称情况
-
方法二:逻辑推理
第一次称量:
将13个硬币(标记为 c 1 , c 2 , ⋯ , c 13 c_1,c_2,\cdots,c_{13} c1,c2,⋯,c13)分为三堆,其中两堆各有 4 4 4枚,余下一堆有 5 5 5枚,三堆分别记为 C ( 1 , 4 ) , C ( 5 , 8 ) , C ( 9 , 13 ) C(1,4),C(5,8),C(9,13) C(1,4),C(5,8),C(9,13),称量 C ( 1 , 4 ) , C ( 5 , 8 ) C(1,4),C(5,8) C(1,4),C(5,8),
-
若天平平衡,说明假币在 C ( 9 , 13 ) C(9,13) C(9,13)中。任取 C ( 9 , 13 ) C(9,13) C(9,13)中的 3 3 3枚,以 C ( 9 , 11 ) C(9,11) C(9,11)为例,与 C ( 1 , 3 ) C(1,3) C(1,3)称量,
第二次称量:
-
若天平平衡,说明假币为 c 12 c_{12} c12或 c 13 c_{13} c13,称量 c 12 c_{12} c12与 c 1 c_{1} c1,
第三次称量:
- 若天平平衡,则假币为 c 13 c_{13} c13;
- 若天平不平衡,则假币为 c 12 c_{12} c12。
-
若天平不平衡,说明假币为 c 9 c_{9} c9或 c 10 c_{10} c10或 c 11 c_{11} c11;且若 C ( 9 , 11 ) C(9,11) C(9,11)更轻/重,则假币重量更轻/重。称量 c 9 c_9 c9与 c 10 c_{10} c10,
第三次称量:
- 若天平平衡,则假币为 c 11 c_{11} c11;
- 若天平不平衡,则 c 9 , c 10 c_9,c_{10} c9,c10中较重的那枚为假币。
-
-
若天平不平衡,则 C ( 9 , 13 ) C(9,13) C(9,13)中均为良币;假设 C ( 1 , 4 ) C(1,4) C(1,4)更重,则 C ( 1 , 4 ) C(1,4) C(1,4)中有一枚重币或 C ( 5 , 8 ) C(5,8) C(5,8)中有一枚轻币。任取 C ( 1 , 4 ) C(1,4) C(1,4)中的 3 3 3枚和 C ( 5 , 8 ) C(5,8) C(5,8)中的 2 2 2枚,以 c 1 , c 2 , c 3 , c 5 , c 6 c_1,c_2,c_3,c_5,c_6 c1,c2,c3,c5,c6为例,与 C ( 9 , 13 ) C(9,13) C(9,13)称量,
第二次称量:
-
若天平平衡,则称量 c 7 , c 8 c_7,c_8 c7,c8,
第三次称量
- 若天平平衡,则假币为 c 4 c_4 c4;
- 若天平不平衡,则 c 7 , c 8 c_7,c_8 c7,c8中较轻的那枚为假币。
-
若天平不平衡,假设 c 1 , c 2 , c 3 , c 5 , c 6 c_1,c_2,c_3,c_5,c_6 c1,c2,c3,c5,c6重于 C ( 9 , 13 ) C(9,13) C(9,13),则假币更重,则假币在 C ( 1 , 3 ) C(1,3) C(1,3)中,称量 c 1 , c 2 c_1,c_2 c1,c2,
第三次称量:
- 若天平平衡,则假币为 c 3 c_3 c3;
- 若天平不平衡,则 c 1 , c 2 c_1,c_2 c1,c2中较重的那枚为假币。
-
-
给定4升和3升的水壶各一个。水壶上没有刻度。可以向水壶中加水。如何在4升的壶中准确的得到2升水?
用 ( X , Y ) (X,Y) (X,Y)表示当前两壶中的水量,其中 X X X表示 4 4 4升壶的水量, Y Y Y表示 3 3 3升壶的水量,题设可翻译为初始状态 ( 0 , 0 ) (0,0) (0,0)到目标状态 ( 2 , y ) (2,y) (2,y)的路径。用数组
closed
记录已出现过的状态,open
记录当前状态可以转化成的状态。遍历open
,将遍历到的状态移出open
,若遍历到closed
中的状态,那么当前搜索停止,探索open
中的下一个情况;若遍历到新状态,则将新状态加入closed
,在当前层搜索结束后更新open
表。 -
对于A* 算法,证明下面的结论:
a) 对于有限图,A* 算法一定会在有限步内终止;
b) 对于无限图,只要从初始节点到目标节点有路径存在,则A* 算法也必然会终止;
c) 若存在路径,则A* 算法一定会终止在最优路径上。
证明
a)
A*算法终止有两种情况:
- 成功找到解,退出;
- 查找失败,
open
表为空时退出。
对于情况1,有限图条件下必然为有限步;对于情况2,每次循环会弹出
open
表中的一个结点,且open
表中结点个数为有限个,于是循环次数一定有限。得证。b)
下用反证法证明:假设无限图从初始节点到目标节点有路径存在,A*不终止,
-
先证引理1:对无限图,若有从初始节点
s
到目标节点T
的路径,则A*不结束时,在open
表中即使最小的一个 f f f值也将增到任意大,或有 f ( n ) > f ∗ ( S ) f(n)>f^*(S) f(n)>f∗(S)。设
n
为open
表中任意一点,记 d ∗ ( n ) d^*(n) d∗(n)为从初始节点S
到n
最短路径的长度,记 ϵ \epsilon ϵ为边耗散值的最小值,则
g ( n ) ≥ g ∗ ( n ) ≥ d ∗ ( n ) ⋅ ϵ g(n)\geq g^*(n)\geq d^*(n)\cdot \epsilon g(n)≥g∗(n)≥d∗(n)⋅ϵ
易得
f ( n ) ≥ g ( n ) ≥ d ∗ ( n ) ⋅ ϵ f(n)\geq g(n)\geq d^*(n)\cdot \epsilon f(n)≥g(n)≥d∗(n)⋅ϵ
若A*不终止,open
表中总有后续节点加入,又因为图为无限图,所以 d ∗ ( n ) d^*(n) d∗(n)会增加到任意大;又有 ϵ > 0 \epsilon>0 ϵ>0,所以 f ( n ) f(n) f(n)会增加到无限大。而因为小于当前 f f f值的结点都会被考察后放入closed
表,所以 f ( n ) ≥ f ∗ ( S ) f(n)\geq f^*(S) f(n)≥f∗(S)。 -
再证引理2:若从初始节点到目标节点有路径存在,A*结束前,
open
表中必存在 f ( n ) ≤ f ∗ ( S ) f(n)\leq f^*(S) f(n)≤f∗(S)。存在一个结点
n
,n
在最佳路径上,则有
f ( n ) = g ( n ) + h ( n ) = g ∗ ( n ) + h ( n ) ≤ g ∗ ( n ) + h ∗ ( n ) = f ∗ ( n ) = f ∗ ( S ) \begin{aligned} f(n) &= g(n)+h(n) \\ &= g^*(n)+h(n) \\ &\leq g^*(n)+h^*(n) \\ &= f^*(n) \\ &= f^*(S) \end{aligned} f(n)=g(n)+h(n)=g∗(n)+h(n)≤g∗(n)+h∗(n)=f∗(n)=f∗(S)
由引理1,若A*不结束,则对
open
表中的所有结点n
有 f ( n ) > f ∗ ( S ) f(n)>f^*(S) f(n)>f∗(S);而由引理2,由于从初始节点到目标节点有路径存在,那么必存在结点n'
,使得 f ( n ′ ) ≤ f ∗ ( S ) f(n')\leq f^*(S) f(n′)≤f∗(S)。矛盾,所以假设不成立。得证。c)
根据a}和b),A*一定找到一条路径结束。
下用反证法证明:假设找到的路径
s
→ \rightarrow →T
不是最佳路径,则
f ( T ) = g ( T ) > f ∗ ( S ) f(T)=g(T)> f^*(S) f(T)=g(T)>f∗(S)
由引理2,open
中存在结点n
使得 f ( n ) ≤ f ∗ ( S ) f(n)\leq f^*(S) f(n)≤f∗(S),则
f ( n ) ≤ f ∗ ( S ) < f ( T ) f(n)\leq f^*(S) < f(T) f(n)≤f∗(S)<f(T)
此时A*应选择n
扩展,而不是T
,与A*选择了T
作为结束矛盾,所以假设不成立。得证。
定找到一条路径结束。
下用反证法证明:假设找到的路径s
→
\rightarrow
→T
不是最佳路径,则
f
(
T
)
=
g
(
T
)
>
f
∗
(
S
)
f(T)=g(T)> f^*(S)
f(T)=g(T)>f∗(S)
由引理2,open
中存在结点n
使得
f
(
n
)
≤
f
∗
(
S
)
f(n)\leq f^*(S)
f(n)≤f∗(S),则
f
(
n
)
≤
f
∗
(
S
)
<
f
(
T
)
f(n)\leq f^*(S) < f(T)
f(n)≤f∗(S)<f(T)
此时A*应选择n
扩展,而不是T
,与A*选择了T
作为结束矛盾,所以假设不成立。得证。