A*算法————传教士和野人

来源:互联网 发布:背叛了男朋友 知乎 编辑:程序博客网 时间:2024/06/06 00:47

还有一篇更好的解释,我不太明白为什么评价函数是这样...

http://wenku.baidu.com/link?url=gKyphJnwWf04XJPszGPb9plPPncvpw5c9omOTlzCXQzHCid_saeiIy8_fIkMYpKvUXvEAuW7uSC1l_g2zm1U5TUB4874ZcTm-P_iB0SG_Na

转载自

Maruko_momoko忘的博客

A*算法————传教士和野人
 问题描述

设有3个传教士和3个野人来到河边,打算乘一只船从左岸渡到右岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡河过去?

问题表示:需要考虑两岸的修道士人数和野人人数,船的位置。用三元式表示状态:S= (m, n, B)

其中,m表示左岸修道士人数,n表示左岸野人人数,B表示左岸船的数目。


评估函数的建立。
评估函数为f=d+h=d+M+N-2*B
M表示左岸的传教士的人数,N表示左岸野人的数目,B取值为0或1 。1表示船在左岸,0 表示船在右岸。d 表示节点的深度。
 

下面我们来证明h(n)=M+C-2B是满足A*条件的。
  我们分两种情况考虑。先考虑船在左岸的情况。如果不考虑限制条件,也就是说,船一次可以将三人从左岸运到右岸,然后再有一个人将船送回来。这样,船一个来回可以运过河2人,而船仍然在左岸。而最后剩下的三个人,则可以一次将他们全部从左岸运到右岸。所以,在不考虑限制条件的情况下,也至少需要摆渡[(M+N-3)/2]*2+1次。其中分子上的"-3"表示剩下三个留待最后一次运过去。除以"2"是因为一个来回可以运过去2人,需要[(M+N-3)/2]个来回,而"来回"数不能是小数,需要向上取整,这个用符号[ ]表示。而乘以"2"是因为一个来回相当于两次摆渡,所以要乘以2。而最后的"+1",则表示将剩下的3个运过去,需要一次摆渡。
化简有: M+N-2。
  再考虑船在右岸的情况。同样不考虑限制条件。船在右岸,需要一个人将船运到左岸。因此对于状态(M,N,0)来说,其所需要的最少摆渡数,相当于船在左岸时状态(M+1,N,1)或(M,N+1,1)所需要的最少摆渡数,再加上第一次将船从右岸送到左岸的一次摆渡数。因此所需要的最少摆渡数为:(M+N+1)-2+1。其中(M+N+1)的"+1"表示送船回到左岸的那个人,而最后边的"+1",表示送船到左岸时的一次摆渡。
化简有:(M+N+1)-2+1=M+N。
  综合船在左岸和船在右岸两种情况下,所需要的最少摆渡次数用一个式子表示为:M+N-2B。其中B=1表示船在左岸,B=0表示船在右岸。
  由于该摆渡次数是在不考虑限制条件下,推出的最少所需要的摆渡次数......
1 0
原创粉丝点击