商人过河方案

合集下载

C语言培训第26章商人过河游戏

C语言培训第26章商人过河游戏

26.2 问题分析及实现
➢ 26.2.1 问题分析 ➢ 26.2.2 问题实现 ➢ 26.2.3 程序运行
26.2 问题分析及实现
➢ 对于此问题,首先想到的前面提到的要 领:看清、想明、把握每一个细节。由 问题描述可知,我们要实现的是打印安 全过河的方案,即不触发杀人越货并能 安全过河的方案。
26.2.1 问题分析
➢ 我们的将要开发的程序,就是从所有过河方 案中,排除错误的方案,留下正确可行的方 案。
26.2.2 问题实现
➢ 本小节就来通过编程来实现商人过河的游戏。 ➢ 1. 采用结构体保存过程数据 ➢ 通过定义一个结构体类型,模拟商人过河时,
所有可能的方案及此方案的状态,即需要记 录当前河东(原点)有几位商人、几位仆人, 当前河西(目的地)有几位商人、几位仆人。 实现代码见随书光盘中的代码26-1.txt。
26.2.2 问题实现
➢ 2. 求解问题的主要实现函数 ➢ 由于渡河过程有两种情况:向东渡河,向西
返回,因此,与仆人个数是否合法。代 码如下(代码26-1.txt)。
26.2.2 问题实现
➢ 3. 求解问题的判断函数 ➢ 如果合法则继续递归查找剩下的商人和仆人
商人过河游戏
➢ C语言的功能是强大而又灵活的。特别是在 算法与数据结构上,其灵活性、高效性更加 明显。本章研究对商人过河问题的求解。
26.1 问题描述
➢ 三名商人各带一个随从乘船渡河,一只小 船只能容纳二人,由他们自己划行。随从 们密约,在河的任一岸,一旦随从的人数 比商人多,就杀人越货。但是如何乘船渡 河的大权掌握在商人们手中。商人们怎样 才能安全渡河呢?
过河的方案,否则为不合法的方案,则应该 将此方案放弃。放弃后,程序返回上一级, 继续递归判断其他情况是否合法,直到全部 情况递归完毕。代码如下(代码26-2.txt)

数学建模作业(商人过河问题)

数学建模作业(商人过河问题)

数学建模作业(四)——商人过河问题一.问题描述有四名商人各带一名仆人过河,但船最多能载二人,商人已获得仆人的阴谋:在河的任一岸,只要仆人数超过商人数,仆人会将商人杀死并窃取财物且安排如何乘船的权力掌握在商人手中。

试为商人制定一个安全过河的方案。

二.解决方案用递归的源程序如下:开始时商人,强盗所在的河的这边设为0状态,另一边设为1状态(也就是船开始时的一边设为0,当船驶到对岸是设为1状态,在这两个状态时,都必须符合条件)#include <stdlib.h>struct node /*建立一个类似栈的数据结构并且可以浏览每一个数据点*/ {int x;int y;int state;struct node *next;};typedef struct node state;typedef state *link;link PPointer1=NULL;link PPointer2=NULL;int a1,b1;int a2,b2;/*栈中每个数据都分为0,1状态*/void Push(int a,int b,int n){link newnode;newnode=(link)malloc(sizeof(state));newnode-> x=a;newnode-> y=b;newnode-> state=n;newnode-> next=NULL;if(PPointer1==NULL){PPointer1=newnode;PPointer2=newnode;}else{PPointer2-> next=newnode;PPointer2=newnode;}}void Pop()/*弹栈*/{link pointer;if(PPointer1==PPointer2){free(PPointer1);PPointer1=NULL;PPointer2=NULL;}pointer=PPointer1;while(pointer-> next!=PPointer2)pointer=pointer-> next;free(PPointer2);PPointer2=pointer;PPointer2-> next=NULL;}int history(int a,int b,int n) /*比较输入的数据和栈中是否有重复的*/ {link pointer;if(PPointer1==NULL)return 1;else{pointer=PPointer1;while(pointer!=NULL){if(pointer-> x==a&&pointer-> y==b&&pointer-> state==n)return 0;pointer=pointer-> next;}return 1;}}int judge(int a,int b,int c,int d,int n)/*判断这个状态是否可行,其中使用了history函数*/{if(history(a,b,n)==0) return 0;if(a> =0&&b> =0&&a <=3&&b <=3&&c> =0&&d> =0&&c <=3&&d <=3&&a+c==3&&b+d==3){switch(n){case 1:{if(a==3){Push(a,b,n);return 1;}else if(a==0){Push(a,b,n);return 1;}else if(a==b){Push(a,b,n);return 1;}else return 0;}case 0:{if(a==3){Push(a,b,n);return 1;}else if(a==0){Push(a,b,n);return 1;}else if(a> =b){Push(a,b,n);return 1;}else return 0;}}}else return 0;}int Duhe(int a,int b,int n)/*递归法解决商人渡河问题,如果这一个状态符合*/ {/*则判断下一个状态,直至问题解决*/ if(a==0&&b==0) return 1;if(n==0)/*判断0状态时,商匪状态是否符合要求*/{if(judge(a-1,b-1,4-a,4-b,1)){if(Duhe(a-1,b-1,1)==1)return 1;}if(judge(a,b-2,3-a,5-b,1)){if(Duhe(a,b-2,1)==1)return 1;}if(judge(a-2,b,5-a,3-b,1)){if(Duhe(a-2,b,1)==1)return 1;if(judge(a-1,b,4-a,3-b,1)){if(Duhe(a-1,b,1)==1)return 1;}if(judge(a,b-1,3-a,4-b,1)){if(Duhe(a,b-1,1)==1)return 1;}else{Pop(0);return 0;}}if(n==1)/*判断0状态时,商匪状态是否符合要求*/{if(judge(a+1,b+1,2-a,2-b,0)){if(Duhe(a+1,b+1,0)==1)return 1;}if(judge(a,b+2,3-a,1-b,0)){if(Duhe(a,b+2,0)==1)return 1;}if(judge(a+2,b,1-a,3-b,0)){if(Duhe(a+2,b,0)==1)return 1;}if(judge(a+1,b,2-a,3-b,0)){if(Duhe(a+1,b,0)==1)return 1;}if(judge(a,b+1,3-a,2-b,0))if(Duhe(a,b+1,0)==1)return 1;}else{Pop(1);return 0;}}return 0;}main(){link pointer;Push(3,3,0);Duhe(3,3,0);pointer=PPointer1;while(pointer!=NULL){printf( "%d,%d---%d\n ",pointer-> x,pointer-> y,pointer-> state);pointer=pointer-> next;}getch();}。

案例-商人过河

案例-商人过河
s 3 = ( 3 , 2 ) 故 s 2 = {( 2 , 2 ), ( 3 , 1 )} 且 s 3 = ( 3 , 2 )
穷举法适宜编程上机运算
问题分析
这是一类智力游戏问题, 这是一类智力游戏问题,可经过一番逻辑 推理求解。当然也可视为一个多步决策问题 多步决策问题, 推理求解。当然也可视为一个多步决策问题, 每一步(此岸到彼岸或彼岸到此岸) 每一步(此岸到彼岸或彼岸到此岸)都要对船 上的人员作出决策,在保证安全的前提下( 上的人员作出决策,在保证安全的前提下(两 岸的随从数不比商人多) 岸的随从数不比商人多)经有限步使全体人员 过河
S = {( 0 , 0 ), ( 0 , 1 ), ( 0 , 2 ), ( 0 , 3 ), ( 1 , 1 ), ( 2 , 2 ) ( 3 , 0 ), ( 3 , 1 ), ( 3 , 2 ), ( 3 , 3 )}
记 第k次渡船上的商人数为 uk ,随从数 为过程中的决策。 为 vk ,而 d k = ( uk , vk ) 为过程中的决策。
sk +1 = sk + ( −1)k d k
多步决策问题模型: 多步决策问题模型: 转移律由 求 d k ∈ D 使 s k ∈ S 并按转移律由 s1 = ( 3, 3) 到达 sn+1 = (0,0)
模型求解
• 图解法
y 3 2
16个格点 状态s=(x,y)为16个格点 允许状态为10个点 允许状态为10个点 10 允许决策为移动1 允许决策为移动1或2格; k为奇数时,向左、下移; 奇数时,向左、下移; k为偶数时,向右、上移. 偶数时,向右、上移.
安全渡河条件下的决策称为允许决策, 安全渡河条件下的决策称为允许决策,全 允许决策 体允许决策构成的集合记为 D

商人们怎样安全过河

商人们怎样安全过河

看谁答得快
1、某甲早8时从山下旅店出发沿一路径上山,下午5时到达山顶 并留宿。次日早8时沿同一路径下山,下午5时回到旅店。某 乙说,甲必在两天中的同一时刻经过路径中的同一地点,为 什么? 2、某人家住T市在他乡工作,每天下班后乘火车于6时抵达T市 车站,他的妻子驾车准时到车站接他回家。一日他提前下班 搭早一班火车于5时半抵T市车站,随即步行回家,他的妻子 像往常一样驾车前来,在路上遇到他接回家时,发现比往常 提前了10分钟,问他步行了多长时间? 3、两兄妹分别在离家2千米和1千米且方向相反的两所学校上学, 每天同时放学后分别以4千米/小时和2千米/小时的速度步行回 家,一小狗以6千米/小时的速度从哥哥处奔向妹妹,又从妹妹 处奔向哥哥,如此往返直至回家中,问小狗奔波了多少路程?
图 状态s=(x,y) ~ 16个格点 解 法 允许状态S ~ 10个 点 允许决策D ~ 移动1或2格; k奇,左下移; k偶,右上移.
s1
d1
d1, d11给出安全渡河方案
d11
评注和思考
sn+1
ቤተ መጻሕፍቲ ባይዱ
1
2
3
x
规格化方法, 易于推广 考虑4名商人各带一随从的情况
习题
• 模仿这一案例,作下面一题: 人带着猫、鸡、米过河,船除需要 人划之外,至多能载猫、鸡、米三者之 一,而当人不在场时猫要吃鸡、鸡要吃 米。试设计一安全过河方案,并使渡河 次数尽量地少。
建模示例
问题(智力游戏)
商人们怎样安全过河

小船(至多2人)
随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货.
但是乘船渡河的方案由商人决定. 3名商人 3名随从 商人们怎样才能安全过河?

商人过河

商人过河

商人们怎样安全过河摘要:四名商人各带一名随从乘船渡河,一只小船至多容纳两人,由他们自己制定,随从约定,在河的任一岸,一旦随从的人数比商人多,就杀了越货。

但是如何乘船渡河的大权掌握在商人们手中,另外,当船的的容量增大为3,最多可以有几对商人安全过河。

商人们怎么才安全渡河,那将再此文中分析过河问题。

模型主要通图表法对过河的方案进行举例,然后根据小船的容量和商人们要安全过河为前提对各种方案进行层层筛选,最终得到商人安全过河方案。

关键词:多步决策图解法商人过河一、问题重述四名商人各带一名随从乘船渡河,一只小船至多容纳俩人,由他们自己划行,随从约,在河的任一岸,一旦随从的人数比商人多,就杀了越货。

另外,当船的的容量增大为3最多可以有几对商人安全过河但是如何乘船渡河的大权掌握在商人们手中。

现在需要解决的问题如下:1.四名商人在不被随从谋杀和小船最多能为2人的情况下,商人们将如何安全过河?2.如果有m名商人m名随从,小船的容量为3时,最多可以有多少商人各带一名随从过河。

二、模型的假设1.假设过河的过程中不会发生以外事故。

2.假设当随从人数多国商人时,不会改变杀人越货计划。

3.假设所有人最终都必须到达河对岸。

三、符号说明=0,1,2,3,4…;x k~第k次渡河前此岸的商人数x k,yk~第k次渡河前此岸的随从数k=1,2,…,) ~过程的状态S ~ 允许状态集合xS={(x , y)x=0, y=0,1,2,3,..; x=m, y=0,1,2,3,..; x=y=1,2,3..}=0, 1, 2..;~第k次渡船上的商人数~第k次渡船上的随从数k=1,2,…=( , ) ~过程的决策 D ~允许决策集合D={(u , v)u+v=1, 2, ….,u, v=0, 1, 2,…}状态因决策而改变~状态转移律四、模型分析针对商人们能否安全过河问题,需要选择一种合理的过河方案,对该问题可将看为一个多步决策模型,通过对每一次过河的方案的筛选优化,最终得到商人们全部安全过河。

【数学模型】商人们怎样过河?

【数学模型】商人们怎样过河?

问题引出问题:三名商人各带一个随从过河,一只小船只能容纳两个人,随从们约定,只要在河的任何一岸,一旦随从人数多于商人人数就杀人越货,但是商人们知道了他们的约定,并且如何过河的大权掌握在商人们手中,商人们该采取怎样的策略才能安全过河呢?这次的问题是一个很经常遇到的过河问题,其实对于该类问题,我们经过逻辑思考就可以得到答案。

但是通过数学模型的建立,我们可以得到一个通用的解答,并且通过计算机的计算我们可以大大扩大问题的规模。

问题分析因为这个问题已经理想化了,所以我们无需对模型进行假设,该问题可以看作一个多步决策问题。

每一步,船由此岸划到彼岸或者由彼岸划回此岸,都要对船上的人员进行决策(此次渡河船上可以有几名商人和几名随从),在保证安全(两岸的随从都不比商人多)的前提下,在有限次的决策中使得所有人都到对岸去。

因此,我们要做的就是要确定每一步的决策,达到渡河的目标。

建立模型记第k 次过河前此岸的商人数为x k , 随从数为y k, k = 1, 2, 3…, x k ,yk = 0, 1, 2, 3定义状态:将二维向量s k = ( x k , y k ) 定义为状态将安全渡河状态下的状态集合定义为允许状态集合,记为S = {(x,y) | x=0,y=0,1,2,3; x=y=1; x=y=2; x=3,y=0,1,2,3}记第k 次渡河船上的商人数为u k,随从数为v k定义决策:将二维向量d k = (u k , v k) 定义为决策允许决策集合记作D = {(u,v) | 1 ≤ u+v ≤ 2, u,v = 0,1,2}因为小船容量为2,所以船上人员不能超过2,而且至少要有一个人划船,由此得到上式。

由我们定义的状态s k和决策d k,我们可以发现它们之间是存在联系的:•k 为奇数是表示船由此岸划向彼岸,k 为偶数时表示船由彼岸划回此岸••状态s k是随着决策d k变化的,规律为:•s k+1 = s k + (-1)k d k我们把上式称为状态转移律,因此渡河方案可以抽象为如下的多步决策模型:求决策d k∈D(k = 1,2,…,n) , 使状态s k∈S 按照转移率,初始状态s1 = (3,3) 经有限步n 到达状态s n+1= (0,0)到这里,整个数学模型就已经非常清晰了,接下来要做的就是求解模型得出结果。

商人过河问题

商人过河问题
最后本文就此问题进行推广,当有m名商人m名随从 且小船的容量为k时,将会得到几种解决方案给出了说明。 关键词:穷举法 多步决策 图解法 商人过河 状态空间
问题的提出
三名商人各带一个随从乘船渡河。现此岸 有一小船只能容纳两人,由他们自己划行 。若在河的任一岸随从人数比商人多,他 们就可能抢劫财物。不过如何乘船渡河的 大权由商人们掌握。商人们怎样才能安全 过河呢?
模型的求解
y
3
d8 2 d9
商仆
商仆
d1
商仆
d10
d7
d6
d2
1 d11
d3 d5 d4
O
1
2
3x
模型的要求从(3,3,1)开始经过对每次过河的安全 状态量的选择最终安全到达(0,0,0)。
根据题意状态转移必须满足以下规则; (1)Z从1变0或0变1交替进行。 (2)Z从1变为0即从河的此岸到彼岸,此案的人数减少1或2;即(m,n,1)
示为
当m=0或3, n={0,1,2,3},
当m=1或2,m=n
或用三维向量表示允许状态量如下表格1:
(3,3,1) (3,2,1) (3,1,1) (2,2,1) (0,3,1) (0,2,1) (1,1,1) (0,1,1)
(3,2,0) (3,1,0) (2,2,0) (0,3,0) (0,2,0) (1,1,0) (0,1,0) (0,0,0)
(3,2,1)/*可取*/
(3,3,1) /*不必考虑*/
从(2,2,0)出发
(3,2,1)/*可取*/
最终我们得到商人们安全渡河的方案有四种如下 第一种方案
(3,3,1)(2,2,0)(3,2,1)(3,0,0)(3,1,1)(1,1,0)

商人过河问题

商人过河问题

商人过河问题摘要本文就商人们如何能够安全过河问题, 采用多步决策建立了数学模型,求解得到商人们安全过河的方案。

将经典的商人过河问题进行了更广的讨论,在此基础上着重分析了安全渡河的状态空间,建立了满足问题需求的规则,从而得出了要求解问题的方案。

模型主要通过穷举的方法对各种过河的方案进行一一列举,然后根据小船的容量和商人们要安全渡河为前提对各种方案进行层层筛选。

最终,得到商人安全渡河的方案。

最后本文就此问题进行推广,当有m名商人m名随从且小船的容量为k时,将会得到几种解决方案给出了说明。

关键词:穷举法多步决策图解法商人过河状态空间一、问题重述三名商人各带一名随从过河,随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货.但乘船渡河的方案由商人决定.现在需要解决的问题如下:1.1 3名商人在不被随从谋杀和小船最多能容2人的情况下,商人们将如何安全过河?1.2如果有m名商人n名随从,小船的容量为k时,商人们又将如何安全过河?二、模型的假设2.1 假设过河的过程中不会发生意外事故。

2.2 假设当随从人数多过商人时,不会改变杀人越货计划。

2.3假设所有人最终都必须到达河对岸。

三、符号说明M表示商人的数量::N表示随从的数量Z表示河的此岸和彼岸:K表示小船的容量:m表示此岸的商人数量::n表示此岸随从的数量:u表示彼岸的商人数量:v表示彼岸的随从数量四、模型分析本题针对商人们能否安全过河问题,需要选择一种合理的过河方案。

对该问题可视为一个多步决策模型,通过对每一次过河的方案的筛选优化,最终得到商人们全部安全过到河对岸的最优决策方案。

对于每一次的过河过程都看成一个随机决策状态量,商人们能够安全到达彼岸或此岸我们可以看成目标决策允许的状态量,通过对允许的状态量的层层筛选,从而得到过河的目标。

五、模型建立与求解5.1模型的建立本题为多步决策模型,每一次过河都是状态量的转移过程。

可以用三维向量表示(,,m n Z )m 的取值范围:{0,1,2,3}n 的取值范围:{0,1,2,3}1,0,Z ⎧=⎨⎩表示划船到河的彼岸表示划船到河的此岸那么允许状态量(即两岸同时必须满足(m n ≥))可以表示为(1) 当m =0或3, n ={0,1,2,3},(2) 当m =1或2,m =n或用三维向量表示允许状态量如下表格1:表(1)过河安全状态量5.2模型的求解模型的要求从(3,3,1)开始经过对每次过河的安全状态量的选择最终安全到达(0,0,0)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

商人过河方案
商人过河是一个经典的智力题,要求找到一种方案,让商人和一只狼、一只羊、一颗白菜能够安全地过河。

然而,由于限制条件和问题
本身的复杂性,要想找到最优解并非易事。

在接下来的文章中,我将
介绍三种常见的商人过河方案,并分析其优缺点。

方案一:简单粗暴法
这种方案是最直接且容易理解的,商人一次只能带一样物品过河。

首先商人带羊过河,然后返回,带走羊,带狼过河,再返回,带羊过河,最后商人带白菜过河。

这个方案的优点是简单易懂,对于问题的
限制条件没有做太多的改变,但缺点也显而易见,商人需要多次来回,花费的时间和力气会比较多。

方案二:改进的方式
为了减少商人的返程次数,我们可以在方案一的基础上做一些改进。

商人过河后,带一样物品过河的同时,再带回之前带过的物品。

具体
来说,商人带着羊过河后,不再返回,而是带着羊再带狼回去。

商人
只下船,放下羊,然后带着白菜过河,商人离开,带走狼,返回船边,与羊相会,然后一起过河。

这个方案相比方案一的优势在于减少了商
人的返程次数,但仍然需要多次的来回,对于问题的限制条件并没有
得到彻底的突破。

方案三:全新思路
除了上述两种方式外,还有一种全新的思路可以解决商人过河问题。

我们可以引入一个额外的限制条件,即商人和狼不能同时留在同一边,羊和白菜也不能同时留在同一边。

首先,商人带着狼过河,然后将狼
放置在对岸,商人返程。

接下来商人带走羊过河,但商人上岸后,将
狼带回原岸,将狼放下,再将羊带回原岸。

然后商人带白菜过河,商
人上岸后将白菜放置在对岸,再次返程。

最后商人带狼过河,成功完
成任务。

这个方案的优点是最大程度地减少商人的来回次数,几乎做到了最
优解。

引入额外的限制条件进一步增加了问题的难度,但也提供了更
高效的解决方式。

综上所述,商人过河问题虽然看似简单,但通过不同的思路和方案,可以得到不同的解决结果。

不同的方案有其优缺点,选择最适合的方
案需要考虑问题的限制条件、时间和效率。

希望这篇文章能够帮助你
更好地理解商人过河问题,并找到解决方案。

相关文档
最新文档