狮子过河问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题
• 有三对母子狮子Aa、Bb与Cc,其中 ABC为母狮,abc为小狮。要过一条 河,河边只有一条船,狮子自己划 船,船每次只能载两只狮子。
• 生存准则:一只小狮如果没有母亲 的保护,则会被其它母狮吃掉。母 狮之间、小狮之间是安全的。
• 问题:如何安全过河?
狮子数字化
• 对6只狮子进行编码:
– 0:A – 1:a – 2:B – 3:b – 4:C – 5:c
• int a[128][9];
• 第一维[128]表历史,最深128步。
• 第二维的[0]~[5]表狮子状态,[6]表船的 位置,[7]~[8]表到下一状态采取的动作。
• int curr;
当前历史位置,即a数
组第一维从0演变到curr。
初始化
• a[0][0] ~ a[0][6]取值0。初始状态。 • a[0][7]=0,a[0][8]=-1第一步动作的前期。 • curr=0;当前为第一步。
初始化
当前位置选择 下一个动作
N N Y
所有动作完毕, 没有下一动作?
选择的动作是否 可行?
计算并生成下 一状态
下一状态是否安 全?
下一状态是否造 成历史重演?
N
Y
当前位置移到 上一状态
当前位置移到初 始状态之前?
初始下一状态 的动作:0,-1
当前位置移到 下一状态
打印没有结果
Βιβλιοθήκη Baidu
程序结束
打印状态序列 Y
• 状态集共有7个元素,每个有2个取 值,故状态总数为27 = 128 ,它是有 限的。
• 初始状态:所有元素为0。
• 结束状态:所有元素为1。
• 问题演变为:找到一个状态变化序 列,使得能从初始态到结束态?相 邻的状态变化符合划船要求。
动作数字化
• 动作:每次划船动作,或状态之间的演 变方式,即参与划船的狮子编号。由于 最多两只狮子过河,故用两个数来表示 过河的狮子号码,当两个数相等时表示 只有一个狮子过河。
当前状态是否结 束状态?
• 历史是不能重演的。 • 历史是可以回溯的,当历史无路可
走时,允许历史回到过去,选择新 的动作,继续历史的演变。
历史记录
• 由于最多只有128个状态,故历史最多 只有128深。
• 历史使用数组记录。 • 状态本身也使用数组。 • 状态的历史使用二维数组,第一维表历
史,第二维表状态与动作。
变量定义
状态数字化
• 将每只狮子是否已过河以及船的位 置做为划船前后的一个状态。
• 每只狮子的状态:0:未过河/此岸, 1:已过河/对岸。
• 船的状态:0:此岸,1:对岸。
• 使用数组[7],有7个元素,每个取值 0或1,映射某一时刻的总状态。依 次为A、a、B、b、C、c、船。
状态作用
• 可以计算安全性。
• 为避免重复动作,实际动作时要求第2数 >=第1数。
• 动作顺序:00、01、02、03、04、05、 11、12、13、14、15、22、23、24、 25、33、34、35、44、45、55。
• 动作初始化:0与-1。
历史跟踪
• 历史:对从初始状态到当前状态的 状态序列以及每次划船的动作进行 跟踪。
• 有三对母子狮子Aa、Bb与Cc,其中 ABC为母狮,abc为小狮。要过一条 河,河边只有一条船,狮子自己划 船,船每次只能载两只狮子。
• 生存准则:一只小狮如果没有母亲 的保护,则会被其它母狮吃掉。母 狮之间、小狮之间是安全的。
• 问题:如何安全过河?
狮子数字化
• 对6只狮子进行编码:
– 0:A – 1:a – 2:B – 3:b – 4:C – 5:c
• int a[128][9];
• 第一维[128]表历史,最深128步。
• 第二维的[0]~[5]表狮子状态,[6]表船的 位置,[7]~[8]表到下一状态采取的动作。
• int curr;
当前历史位置,即a数
组第一维从0演变到curr。
初始化
• a[0][0] ~ a[0][6]取值0。初始状态。 • a[0][7]=0,a[0][8]=-1第一步动作的前期。 • curr=0;当前为第一步。
初始化
当前位置选择 下一个动作
N N Y
所有动作完毕, 没有下一动作?
选择的动作是否 可行?
计算并生成下 一状态
下一状态是否安 全?
下一状态是否造 成历史重演?
N
Y
当前位置移到 上一状态
当前位置移到初 始状态之前?
初始下一状态 的动作:0,-1
当前位置移到 下一状态
打印没有结果
Βιβλιοθήκη Baidu
程序结束
打印状态序列 Y
• 状态集共有7个元素,每个有2个取 值,故状态总数为27 = 128 ,它是有 限的。
• 初始状态:所有元素为0。
• 结束状态:所有元素为1。
• 问题演变为:找到一个状态变化序 列,使得能从初始态到结束态?相 邻的状态变化符合划船要求。
动作数字化
• 动作:每次划船动作,或状态之间的演 变方式,即参与划船的狮子编号。由于 最多两只狮子过河,故用两个数来表示 过河的狮子号码,当两个数相等时表示 只有一个狮子过河。
当前状态是否结 束状态?
• 历史是不能重演的。 • 历史是可以回溯的,当历史无路可
走时,允许历史回到过去,选择新 的动作,继续历史的演变。
历史记录
• 由于最多只有128个状态,故历史最多 只有128深。
• 历史使用数组记录。 • 状态本身也使用数组。 • 状态的历史使用二维数组,第一维表历
史,第二维表状态与动作。
变量定义
状态数字化
• 将每只狮子是否已过河以及船的位 置做为划船前后的一个状态。
• 每只狮子的状态:0:未过河/此岸, 1:已过河/对岸。
• 船的状态:0:此岸,1:对岸。
• 使用数组[7],有7个元素,每个取值 0或1,映射某一时刻的总状态。依 次为A、a、B、b、C、c、船。
状态作用
• 可以计算安全性。
• 为避免重复动作,实际动作时要求第2数 >=第1数。
• 动作顺序:00、01、02、03、04、05、 11、12、13、14、15、22、23、24、 25、33、34、35、44、45、55。
• 动作初始化:0与-1。
历史跟踪
• 历史:对从初始状态到当前状态的 状态序列以及每次划船的动作进行 跟踪。