商人过河实验报告

合集下载

数学建模:研究商人过河问题

数学建模:研究商人过河问题

数学建模实验一报告实验题目:研究商人过河问题一、实验目的:编写一个程序(可以是C,C++或Mathlab )实现商人安全过河问题。

二、实验环境:Turbo c 2.0、Microsoft Visual C++ 6.0、Matlab 6.0以上 三、实验要求:要求该程序不仅能找出一组安全过河的可行方案,还可以得到所有的安全过河可行方案。

并且该程序具有一定的可扩展性,即不仅可以实现3个商人,3个随从的过河问题。

还应能实现 n 个商人,n 个随从的过河问题以及n 个不同对象且每个对象有m 个元素问题(说明:对于3个商人,3个随从问题分别对应于n=2,m=3)的过河问题。

从而给出课后习题5(n=4,m=1)的全部安全过河方案。

四、实验步骤:第一步:问题分析。

这是一个多步决策过程,涉及到每一次船上的人员以及要考虑此岸和彼岸上剩余的商人数和随从数,在安全的条件下(两岸的随从数不比商人多),经有限步使全体人员过河。

第二步:分析模型的构成。

记第k 次渡河前此岸的商人数为k x ,随从数为k y ,2,1=k ,n y x k k 2,1,=,(具有可扩展性),将)(k k y x ,定义为状态,状态集合成为允许状态集合(S )。

S={2,1;3,2,1,0,3;3,2,1,0,0|,======y x y x y x y x )(}记第k 次渡船的商人数为k u ,随从数为k v ,决策为),(k k v u ,安全渡河条件下,决策的集合为允许决策集合。

允许决策集合记作D ,所以D={2,1,0,,21|,=<+<v u v u v u )(|1<u+v<2,u,v=0,1,2},因为k 为奇数时船从此岸驶向彼岸,k 为偶数时船由彼岸驶向此岸,所以状态k s 随决策k d 变化的规律是k k k k d s s )1(1-+=-,此式为状态转移律。

制定安全渡河方案归结为如下的多步决策模型:求决策)2,1(n k D d k =∈,使状态S s k ∈按照转移律,由初始状态)3,3(1=s 经有限n 步到达)0,0(1=+n s第三步:模型求解。

商人渡河

商人渡河

V1(1,1,1,1) v2(1,0,1,0) v3(1,1,0,1) v4(1,1,1,0) v5(1,0,1,1)V6(0,0,0,0) v7(0,1,0,1) v8(0,0,1,0) v9(0,0,0,1) v10(0,1,0,0)图11.1模型的建立将人、狼、羊和蔬菜在河的初始位置的状态视为一个四维向量1234(,,,)x x x x ,1i x =表示此物体在河岸上;反之,0i x =表示此物体不在河岸上。

因此,人载着物体过河可视为状态向量的转移。

由于人不在现场时候,狼和羊、羊和蔬菜不能同时存在,因此,可能存在的状态向量为1,1,1,1()、1,0,1,0()、1,1,0,1()、1,1,1,0()、1,0,1,1()、0,0,0,0()、0,1,0,1()、0,0,1,0()、0,0,0,1()、0,1,0,0()。

首先,初始状态为1,1,1,1(),然后转移为0,1,0,1(),此时状态向量可转移为1,1,0,1()或1,1,1,1(),按照人不在时候,狼和羊、羊和蔬菜不能同时在一起这一规则,进行10个四维向量的转移,如图1,。

设(,)G V E =,将状态向量作为点 1,2,...,10i v i =,将转移过程作为边 1,2,...,9i e i =,那么,要求得最少次数将狼、羊和蔬菜运到对岸,只需找到状态向量1,1,1,1()转移到0,0,0,0()的最短路径,即只要找到点1v 到6v 的最短路径1.2 模型的求解 利用迪杰斯特拉算法,从点1v 出发,搜索寻找到点6v 的最短路径,通过运行MATLAB 程序,得到最短路径为1739582v v v v v v v v ->->->->->->->或173104826v v v v v v v v ->->->->->->->。

最新4商人过河问题

最新4商人过河问题
13
4商人过河问题
分析
此类智力问题当然可以通过一番思考, 拼凑出一个可行方案来。
但是,我们现在希望能找到求解这类问 题的规律性、建立数学模型,用以解决更 为广泛的问题。
2
如图所示:
例如: d1:(3,3)-----(2,2) 1个商人1个随从过对岸 d1:(3,3)-----(3,1)2个随从过对岸
12
探索
(1) 夫妻过河问题 有三对夫妻要过河,船最多可载两人。 约束条件是根据法律,任一女子不得在其
丈夫不在场的情况下与另外男子在一起,问 此时这三对夫妻能否过河? 四对夫妻呢 (2) 人、狗、鸡、米过河问题
某人要带一条狗、一只鸡、一箩米过河, 但小船除需要人划外,最多只能载一物过河, 而当人不在场时,狗要咬鸡、鸡要吃米。问 此人应如何过河?
9
思考
(1) 若船的情况不变,则2名商人2个随从 如何安全渡河?
(2) m名商人m个随从(m≥4)能否安全渡 河?
10
(1) (2,2)→(1,1) or (2,0)→(2,1)→(0,1) → (1,1)→(0,0) 如下图:
11
(2) m名商人m个随从(m≥4)无法安全渡河,如m=4 时的图(如下图),d7就无法作不重复的转移。

案例-商人过河

案例-商人过河
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

数学模型实验商人过河

数学模型实验商人过河

《数学模型实验》实验报告姓名:王佳蕾学院:数学与信息科学学院地点:主楼402学号:20151001055 专业:数学类时间:2017年4 月16日一、实验名称:商人和仆人安全渡河问题的matlab实现二、实验目的:1.熟悉matlab基础知识,初步了解matlab程序设计;2.研究多步决策过程的程序设计方法;3.(允许)状态集合、(允许)决策集合以及状态转移公式的matlab表示;三、实验任务:只有一艘船,三个商人三个仆人过河,每一次船仅且能坐1-2个人,而且任何一边河岸上仆人比商人多的时候,仆人会杀人越货。

怎么在保证商人安全的情况下,六个人都到河对岸去,建模并matlab实现。

要求:代码运行流畅,结果正确,为关键语句加详细注释。

四、实验步骤:1.模型构成2.求决策3.设计程序4.得出结论(最佳解决方案)五、实验内容:(一)构造模型并求决策设第k次渡河前此岸的商人数为xk,随从数为yk,k=1,2,...,xk,yk=0,1,2,3.将二维向量sk=(xk,yk)定义为状态,安全渡河条件下的状态集合称为允许状态集合,记作S,S 对此岸和彼岸都是安全的。

S={(x,y)|x=0,y=0,1,2,3;x=3,y=0,1,2,3;x=y=1,2}设第k次渡船上的商人数为uk,随从数vk,将二维变量dk=(uk,vk)定义为决策,允许决策集合记为D,由小船的容量可知,D={(u,v)|1<=u+v<=2,u,v=0,1,2}k为奇数时,船从此岸驶向彼岸,k为偶数时,船从彼岸驶向此岸,状态sk随决策变量dk的变化规律为sk+1=sk+(-1)^k*dk(状态转移律)这样制定安全渡河方案归结为如下的多步决策模型:求决策dk∈D(k=1,2,...,n),使状态sk∈S,按照转移律,由初始状态s1=(3,3)经有限步n到达状态sn+1=(0,0)。

(二)程序设计(三)运行结果、六、 结论体会:安全渡河问题可以看成一个多步决策过程。

商人过河

商人过河

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

但是如何乘船渡河的大权掌握在商人们手中,另外,当船的的容量增大为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)到这里,整个数学模型就已经非常清晰了,接下来要做的就是求解模型得出结果。

数学建模:研究商人过河问题

数学建模:研究商人过河问题

数学建模实验一报告实验题目:研究商人过河问题一、实验目的:编写一个程序(可以是C,C++或Mathlab )实现商人安全过河问题。

二、实验环境:Turbo c 2.0、Microsoft Visual C++ 6.0、Matlab 6.0以上 三、实验要求:要求该程序不仅能找出一组安全过河的可行方案,还可以得到所有的安全过河可行方案。

并且该程序具有一定的可扩展性,即不仅可以实现3个商人,3个随从的过河问题。

还应能实现 n 个商人,n 个随从的过河问题以及n 个不同对象且每个对象有m 个元素问题(说明:对于3个商人,3个随从问题分别对应于n=2,m=3)的过河问题。

从而给出课后习题5(n=4,m=1)的全部安全过河方案。

四、实验步骤:第一步:问题分析。

这是一个多步决策过程,涉及到每一次船上的人员以及要考虑此岸和彼岸上剩余的商人数和随从数,在安全的条件下(两岸的随从数不比商人多),经有限步使全体人员过河。

第二步:分析模型的构成。

记第k 次渡河前此岸的商人数为k x ,随从数为k y ,2,1=k ,n y x k k 2,1,=,(具有可扩展性),将)(k k y x ,定义为状态,状态集合成为允许状态集合(S )。

S={2,1;3,2,1,0,3;3,2,1,0,0|,======y x y x y x y x )(}记第k 次渡船的商人数为k u ,随从数为k v ,决策为),(k k v u ,安全渡河条件下,决策的集合为允许决策集合。

允许决策集合记作D ,所以D={2,1,0,,21|,=<+<v u v u v u )(|1<u+v<2,u,v=0,1,2},因为k 为奇数时船从此岸驶向彼岸,k 为偶数时船由彼岸驶向此岸,所以状态k s 随决策k d 变化的规律是k k k k d s s )1(1-+=-,此式为状态转移律。

制定安全渡河方案归结为如下的多步决策模型:求决策)2,1(n k D d k =∈,使状态S s k ∈按照转移律,由初始状态)3,3(1=s 经有限n 步到达)0,0(1=+n s第三步:模型求解。

商人过河问题

商人过河问题

商人过河问题摘要:为了求解3个商人和3个随从的过河问题,用数学分析方法,建立数学模型,并且加以求解,展示动态规划思想的应用步骤。

最后利用计算机编程进行求解,获得过河问题的完整求解过程;有效地求解类似多步决策问题的作用。

关键词:多步决策计算机求解状态转移律图解法 MATLAB程序一.问题提出S个商人各带一个随从乘船过河,一只小船只能容纳K人,由他们自己划船。

商人们窃听到随从们密谋,在河的任意一岸上,只要随从的人数比商人多,就杀掉商人。

但是如何乘船渡河的决策权在商人手中,商人们如何安排渡河计划确保自身安全?二.问题的关键解决的关键集中在商人和随从的数量上,以及小船的容量上,该问题就是考虑过河步骤的安排和数量上。

各个步骤对应的状态及决策的表示法也是关键。

三.问题的分析在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。

由于船上人数限制,这需要多步决策过程,必须考虑每一步船上的人员。

动态规划法正是求解多步决策的有效方法。

它要求把解的问题一层一层地分解成一级一级、规模逐步缩小的子问题。

直到可以直接求出其解的子问题为止。

分解成所有子问题按层次关系构成一棵子问题树.树根是原问题。

原问题的解依赖于子问题树中所有子问题的解。

四.模型假设记第k次过河前A岸的商人数为XK,随从数为YK k=1,2,⋯ XK ,YK=0,1,2,3,将二维向量SK=(XK,YK)定义为状态.把满足安全渡河条件下的状态集合称作为允许状态集合。

记作S。

则 S={(XK ,YK)|(XK =0,YK =0,1,2,3),(XK =3,YK =0,1,2,3),(XK =YK =1)(XK =YK =2)}记第k次过河船上的商人数为UK,随从数为VK将二维向量DK=(UK ,VK)定义为决策。

由小船的容量可知允许决策集合(记作D)为D={(UK ,VK)|UK +VK=l,2}={(O,1);(O,2);(1,O);(1,1);(2,O)}五.模型建立:动态规划法正是求解多步决策的有效方法。

安全渡河问题

安全渡河问题

上图给出了一种移动方案, 上图给出了一种移动方案,经过决策 d1, d2 , d3 ⋯d11, 最终 这个方案很容易写成渡河的方案。 有 S12 = (0,0)。这个方案很容易写成渡河的方案。
分析:在问题中每一步,即船由此岸驶向彼岸或从彼 分析:在问题中每一步,
岸驶向此岸,都要对船上的人员(商人、随从各几人) 岸驶向此岸,都要对船上的人员(商人、随从各几人) 作出决策,保证安全的前提下( 作出决策,保证安全的前提下(两岸的商人数都不比随 从数少),在有限的步内使人员全部过河。用状态( ),在有限的步内使人员全部过河 从数少),在有限的步内使人员全部过河。用状态(变 来表示某一岸的人员状况,决策(变量) 量)来表示某一岸的人员状况,决策(变量)表示船上 人员的状况,可以找出状态随决策变化的规律。问题转 人员的状况,可以找出状态随决策变化的规律。 化为在状态的允许范围内(即安全渡河条件), ),确定每 化为在状态的允许范围内(即安全渡河条件),确定每 一步的决策,达到渡河的目标。 一步的决策,达到渡河的目标。
这样的话,制订安全渡河的方案归结为如下的多步决策问题: 这样的话,制订安全渡河的方案归结为如下的多步决策问题:
d k ∈ D ( k = 1, 2, ⋯ n ), 使状态 S k ∈ S 按照转移规律, 由初始状态 S1 = (3, 3)经过有限步 n到达状态 S n +1 = 0, ( 0)。
y
D = {( u , v ) | u + v = 1, 2}
(2) )
因为k为奇数时船从次岸驶向彼岸, 为偶数时由彼岸驶回此 因为 为奇数时船从次岸驶向彼岸,k为偶数时由彼岸驶回此 为奇数时船从次岸驶向彼岸 岸,所以状态 Sk 随决策 d k 变化的规律是 k (3) ) k +1 k k

商人随从过河

商人随从过河

数学建模作业题目:商人随从过河队员:姓名:***姓名:***姓名:王*2011年08月25日商人过河问题摘要本文针对商人渡河的问题,建立分步决策模型,采用Dijkstra算法解决了商人和随从渡河问题。

根据题意用三维向量表示商人、随从和船的状态,并且定义此岸允许状态集合、彼岸允许状态集合及决策变量集合。

然后把此岸允许状态集合和彼岸允许状态集合中的每个元素视为节点,按照状态转移规律连接这些节点构成了一个连通图,寻找安全的渡河方案最终转化为从起始状态(节点)到最终状态(节点)的路径,用图论的Dijkstra算法找出所有路径,每一条路径对应一种渡河方案,整体方案如图1(实心点代表此岸,空心点代表彼岸,人数均为此岸人数),由图可知共有四种渡河方案。

图1 整体渡河方案关键词:分步决策 Dijkstra算法三维向量连通图1 问题重述三名商人各带一名随从过河,随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货.但是乘船渡河的方案由商人决定.商人们怎样才能安全过河?(如果推广到四名商人四个随从又如何?)2 模型假设(1)商人和仆人都会划船,并且仆人听从商人的调度 (2)商人和仆人每次渡船都能安全到达(3)船的质量很好,在多次满载情况也能正常运作3 符号说明(1) k s 第k 次渡河前此岸商人和仆人的数量称为状态向量;(2) ks '第k 次渡河前彼岸商人和仆人的数量称为状态向量; (3) S 所有安全渡河条件下状态向量的集合; (4) S '所有安全渡河条件下状态向量的集合; (5) k d 第k 次渡河船上商人和仆人的数称为决策向量; (6) D 所有安全渡河条件下决策向量的集合; (7) k x 第k 次渡河前此岸的商人数;(8) kx ' 第k 次渡河前彼岸的商人数; (9) k y 第k 次渡河前此岸的仆人数;(10) ky ' 第k 次渡河前此岸的仆人数; (11) k u 第k 次渡船上的商人数; (12) k v 第k 次渡船上的仆人数。

(完整word版)商人过河问题数学建模

(完整word版)商人过河问题数学建模

作业1、2:商人过河一、问题重述问题一:4个商人带着4个随从过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人。

随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货。

乘船渡河的方案由商人决定。

商人们怎样才能安全过河?问题二:假如小船可以容3人,请问最多可以有几名商人各带一名随从安全过河。

二、问题分析问题可以看做一个多步决策过程。

每一步由此岸到彼岸或彼岸到此岸船上的人员在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。

用状态变量表示某一岸的人员状况,决策变量表示船上的人员情况,可以找出状态随决策变化的规律。

问题就转换为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到安全渡河的目标。

三.问题假设1. 过河途中不会出现不可抗力的自然因素。

2. 当随从人数大于商人数时,随从们不会改变杀人的计划。

3.船的质量很好,在多次满载的情况下也能正常运作。

4. 随从会听从商人的调度。

四、模型构成x(k)~第k次渡河前此岸的商人数x(k),y(k)=0,1,2,3,4;y(k)~第k次渡河前此岸的随从数k=1,2,…..s(k)=[ x(k), y(k)]~过程的状态S~允许状态集合S={(x,y) x=0,y=0,1,2,3,4; x=4,y=0,1,2,3,4;x=y=1,2,3}u(k)~第k次渡船上的商人数u(k), v(k)=0,1,2;v(k)~ 第k次渡船上的随从数k=1,2…..d(k)=( u(k), v(k))~过程的决策 D~允许决策集合D={u,v |u+v=1,2,u,v=0,1,2}状态因决策而改变s(k+1)=s(k)+(-1)^k*d(k)~状态转移律求d(k) ∈D(k=1,2,….n),使s(k)∈S 并按转移律s(k+1)=s(k)+(-1)^k*d(k)由(4,4)到达(0,0)数学模型:k+1k S =S +k k D (-1) (1)'4k k x x += (2)'4k k y y += (3)k.k x y ≥ (4)''k k x y ≥ (5)模型分析:由(2)(3)(5)可得44kk x y -≥- 化简得k k x y ≤综合(4)可得k k x y = 和 {}(,)|0,0,1,2,3,4k k k k k S x y x y === (6)还要考虑 {}'(',')|'0,'0,1,2,3,4kk k k k S x y x y === (7) 把(2)(3)带入(7)可得{}(4,4)|40,40,1,2,3,4k k k k k S x y x y =---=-=化简得{}(,)|4,0,1,2,3,4k k k k k S x y x y === (8) 综合(6)(7)(8)式可得满足条件的情况满足下式{}(,)|0,4,0,1,2,3,4;k k k k k k k S x y x y x y ==== (9)所以我们知道满足条件的点如上图所示:点移动由{}(,)|4,0,1,2,3,4k k k k k S x y x y === (8) 到达{}(,)|0,0,1,2,3,4k k k k k S x y x y === (6)时,可以认为完成渡河。

关于商人过河问题的分析

关于商人过河问题的分析

关于商人过河问题的分析我的整个国庆假期就在紧张的课业学习与照顾家庭生活中结束了(呵呵别误会,我工作已久,只是今年又读了个在职研究生)。

在假期尾声抽出一点时间完成之前我在/thread-436739-1-1.html中对朋友的承诺,写一篇关于原贴中问题的分析。

同时也算为我计划写的书积累点文字经验。

表达能力有限,不到之处欢迎大家批评指正。

问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人。

在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过河顺序才能让所有人都安全地过到河的另一边。

问题分析:构建解题模型的第一步是分析问题包含的属性。

1 有3个商人和3个仆人。

从问题的描述可以认为这里商人与商人之前没有区别,仆人与仆人之前没有区别。

2 有一条河。

相应的它将地理空间分隔成三部分。

左岸、右岸(只是为了区分河的两侧,怎么叫没关系,也可以叫南岸、北岸,东岸、西岸,或者本岸、对岸等等)和河上。

3 有一只船。

它的属性是这个问题的核心,需要详细讨论。

3.1 船无主动动力,移动需要有人在船上控制。

但由谁划船并没有限制,问题的一个隐含条件是这3个商人和3个仆人谁都会划船。

3.2 船最多可载两人,包括划船的在内。

但由于上一条属性,空船不能往来于两岸之间,所以要使其移动至少要载一人。

3.3 船的位置有三种停靠在左岸、停靠在右岸、载人行驶在河中。

这里“行驶在河中”是一个动态属性,其它之前分析的全都是静态属性。

这个动态属性的发生受其它静态属性的制约也改变其它静态属性。

下面就船的这条动态属性细讨论一下。

3.3.1 船的移动只能从它之前停靠的岸边移动到对岸。

3.3.2 船可以载一个人(可以是商人或者仆人)移动到对岸。

进行这个动作的前提条件是本侧至少有一个人,并且这个人离开后本侧岸边的商人数量不少于仆人数量或者干脆没有商人(否则会发生血案)。

数学建模实验报告经典实例

数学建模实验报告经典实例

《数学建模》实验报告计算过程如下, 结果如下:画图程序命令如下:函数图象如下:实验题目二: 编写利用顺序Guass消去法求方程组解的M-函数文件,并计算方程组的解解: M-函数文件如下:方程组的计算结果如下:实验题目三: 编写“商人们安全过河”的Matlab程序解: 程序如下:function foot=chouxiang%%%%%%%%%%%%%%%%%%%%%% 程序开始需要知道商人数, 仆人数, 船的最大容量n=input('输入商人数目:');nn=input('输入仆人数目:');nnn=input('输入船的最大容量:');if nn>nn=input('输入商人数目:');nn=input('输入仆人数目:');nnn=input('输入船的最大容量:');end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 决策生成jc=1; % 决策向量存放在矩阵“d”中, jc为插入新元素的行标初始为1for i=0:nnnfor j=0:nnnif (i+j<=nnn)&(i+j>0) % 满足条件D={(u,v)|1<=u+v<=nnn,u,v=0,1,2}d(jc,1:3)=[i,j 1]; %生成一个决策向量后立刻将他扩充为三维(再末尾加“1”)d(jc+1,1:3)=[-i,-j,-1]; % 同时生成他的负向量jc=jc+2; % 由于一气生成两个决策向量,jc指标需要往下移动两个单位endendj=0;end再验证:程序结果说明在改变商人和仆人数目, 其他条件不变的条件下。

可能无法得到结果。

程序结果说明在改变商人和仆人数目,其他条件不变的条件下。

可能无法得到结果。

商人过河的数学模型及编程解决

商人过河的数学模型及编程解决

摘要:M对商仆过河,一只船最多载N人,船上和岸上的仆人数都不能多于商人数,否则商人有危险。

安排合理的渡河方案,保证商人能安全渡河。

(可利用向量,矩阵,图解等方法)一.问题提出:有M对商仆乘船过河,一只船最多载N人,由商人和仆人自己划船渡河,在河的任意一岸,一旦仆人数多于商人数,仆人就可将商人杀死,谋取利益,但是乘船渡河的主动权掌握在商人们手中,商人们如何安排渡河方案,才能安全渡河?二.假设:商人和仆人都会划船,天气很好,无大风大浪,船的质量很好,船桨足够很多次的运载商人和仆人。

三.参数:1.设(x,y)是状态向量,表示任一岸的商人和仆人数,并且x,y分别要大于等于0,小于等于M。

2.设(m,n)是运载向量,表示运载的商人数和仆人数,0<=m<=N,0<=n<=N,0<=m+n<=N。

3.设用s表示所有的可取状态向量的集合。

4.设用d表示所有运载向量的集合。

5.设用表示从此岸到彼岸,作减;用表示从彼岸到此岸,作加。

Sk:表示第k步可取状态向量(sk属于s);dk:表示第k步可取转移向量(dk属于d);四.问题分析:商仆安全渡河问题可以视为一个多步决策过程,多步决策是指决策过程难以一次完成,而是多步优化,最后获取一个全局最优方案的决策方法。

对于每一步,即船由此岸驶向彼岸,或者船由彼岸驶向此岸的决策,不仅会影响到该过程的效果,而且还会影响到下一步的初始状态,从而对整个过程都会有影响。

所以,在每一次过河时,就不能只从这一次过河本身考虑,还要把它看成是整个过河过程中的一个部分。

在对船上的人员做决策时,要保证两岸的商人数不能少于仆人数,用最少的步伐是人员全部过河。

应用状态向量和运载向量,找出状态随运载变化的规律,此问题就转化为状态在允许范围内(即安全渡河条件),确定每一次该如何过河,从而达到渡河的目标。

现在我们都把它们数量化:即用数学语言来表示。

我们以3名商人为例设第k次渡河前此岸的商人数为x k,随从数为y k,k=1,2,…,x k,y k =0,1,2,3,将二维向量S k =(x k,y k)定义为状态。

实验报告

实验报告

学号:20092122103 姓名:郑少钊数学实验作业实验一商人们怎样安全过河有3个商人带着随从要过一条河。

随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。

但是乘船渡河的方案由商人决定,商人们怎样才能安全过河。

假设每人都会划船,小船一次只能容纳2人,且船载起始岸边。

请给出安全过河的最佳方案。

解:模型建立:用三元组(x,y,z)表示渡河过程中的某个状态x-----起始岸边上商人的个数y-----起始岸边随从的个数z-----小船的位置(z为1时,表示小船在起始岸边,为0时,表示小船在目的的岸边)其中一种方案:(3,3,0)---(2,2,1)---(3,2,0)---(3,0,1)---(3,1,0)---(1,1,1)---(2,2,0)---(0,2,1)---(.0,3,0)---(0,1,1)---(0,2,0)---(0,0,1)实验四最短总航线问题下表给出世界六大城市(伦敦、墨西哥城、纽约、巴黎、北京和东京)之间的航线距离(以英里为单位),试确定连通这六大城市的最短总航线。

解:由上表可得图如下:A:伦敦;B:墨西哥城;C:纽约;D:巴黎;E:北京;F:东京用MATLAB软件求解,代码如下:(Prim算法)cleara=[0 5558 3469 214 5074 5959;5558 0 2090 5725 7753 7035;3469 2090 0 3636 6844 6757;214 5725 3636 0 5120 6053;5074 7753 6844 5120 0 1307;5959 7035 6757 6053 1307 0;]T=[];c=0;v=1;n=6;sb=2:n;for j=2:nb(1,j-1)=1;b(2,j-1)=j;b(3,j-1)=a(1,j);endwhile size(T,2)<n-1[tmin,i]=min(b(3,:));T(:,size(T,2)+1)=b(:,i)c=c+b(3,i);v=b(2,i);temb=find(sb==b(2,i));sb(temb)=[];b(:,i)=[];for j=1:length(sb)d=a(v,b(2,j));if d<b(3,j)b(1,j)=v;b(3,j)=d;endendendT,c结果如下:T =1 1 3 1 54 3 25 6214 3469 2090 5074 1307c =12154因此,上图的最小生成树的边集合为{(1,4),(1,3),(3,2),(1,5),(5,6) },最短总航线为12154.实验一求最短路问题求图14.9所示的有向网络中点1到点6的最短有向路。

商人过河方案

商人过河方案
3.控制过河成本,提供性价比高的过河服务。
4.提升服务水平,满足商人过河过程中的舒适与便利需求。
三、方案内容
1.交通工具与设施
-根据河流宽度、流速及航道条件,选择适宜的船只作为过河工具。
-船只应定期进行安全检查,确保救生设备、导航设备、通讯设备的完好。
-设立专门的候船设施,提供舒适的等候环境。
2.航线规划
3.及时解决过河过程中出现的问题,优化过河方案,提高商人满意度。
五、总结与展望
本方案旨在为商人提供合法合规、安全便捷的过河服务。在实施过程中,需不断总结经验,完善相关制度,提高服务质量。展望未来,随着我国基础设施建设的不断推进,过河条件将得到进一步改善,商人的过河需求将得到更好满足。在此背景下,我们将继续努力,为商人提供更加优质、高效的过河服务。
4.人员培训与管理
(1)对从事过河服务的人员进行专业培训,提高其业务素质和服务水平。
(2)建立完善的人员管理制度,确保过河服务的质量和安全。
5.安全保障措施
(1)建立健全应急预案,提高应对突发情况的能力。
(2)配备必要的救生设备,确保商人在紧急情况下的安全。
(3)加强对过河过程中的安全监控,防止安全事故的发生。
本方案立足于商人的实际需求,结合安全、效率、经济、服务等多方面因素,旨在打造一套高效便捷、安全可靠的过河服务体系。在实施过程中,将持续关注商人的反馈与市场的变化,不断调整和完善方案,以适应日益增长的过河需求。展望未来,随着技术的进步和管理的优化,我们有信心为商人提供更加优质、高效的过河体验。
2.原则:
(1)合法性:严格遵守国家相关法律法规,确保过河方案的合法合规性。
(2)安全性:确保商人在过河过程中的生命财产安全。
(3)便捷性:提高过河效率,缩短过河时间。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数学模型实验—实验报告6
学院:工商学院专业:电气二类(计算机)姓名:辛文辉尚磊张亨
学号:___ 2012484019 2012484091 2012484055 ____ 实验时间:__ 3.18 ____ 实验地点:b3
一、实验项目:
Matlab程序设计
安全渡河问题可以看成一个多步决策过程。

每一步,即船由此岸驶向彼岸或从彼岸驶回此岸,都要对船上的人员(商人随从各几人)作出决策,在保证安全的前提下(两岸的商人数都不比随从数少),在有限步内使人员全部过河。

用状态(变量)表示某一岸的人员状况,决策(变量)表示船上的人员状况,可以找出状态随决策变化的规律。

问题转化为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到渡河的目的。

此类智力问题经过思考,可以拼凑出一个可行方案。

但是,我们现在希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。

二、实验目的和要求
a.了解Matlab程序设计有关基本操作
b.掌握有关程序结构
三、实验内容
允许的状态向量
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
0 10
0 11
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 0
11 1
11 2
11 3
11 4
11 5
11 6
11 7
11 8
11 9
11 10
允许的决策向量:
0 1
0 2
0 3
0 4
0 5
0 6
1 0
1 1
2 0
2 1
2 2
3 0
3 1
3 2
3 3
4 0
4 1
4 2
5 0
5 1
6 0
过河步骤:
第1步:0商5仆过河,0商1仆返回
第2步:5商1仆过河,1商1仆返回
第3步:3商3仆过河,1商1仆返回
第4步:3商3仆过河,1商1仆返回
第5步:3商3仆过河,完成
过河过程中状态变化:
步骤此岸商此岸仆方向彼岸商彼岸仆
1 11 6 ==> -8 -3
11 7 <== -8 -4
2 6 6 ==> -
3 -3
7 7 <== -4 -4
3 4 4 ==> -1 -1
5 5 <== -2 -2
4 2 2 ==> 1 1
3 3 <== 0 0
5 0 0 ==> 3 3
对于经典的3对商仆、小船容量为2人时的问题,运行程序求得结果如下
11对商仆,小船容量为6人时,运行程序求得结果如下:
图 3 11对商仆、小船容量为6时的求解结果
事实上,11对商仆时的状态空间如图:
图 4 12对商仆时的状态空间
显然的船容量必须至少保证状态转移能够沿对角线方向向下移动,问题才会有解。

船容量为2时可以使状态转移沿对角线移动,但不能持续向下移动,船容量至少为4才可使状态能够沿对角线向下移动。

下面说明何时需要状态空间沿对角线移动。

当商仆对数为6时,状态空间为:
图 5 6对商仆时的状态空间
此时状态中心(3,3)距离边界状态(6,3)的距离为3,船容量至少为4才可避免状态转移沿对角线下行,而船容量为4已经是状态转移沿对角线移动的条件,即当商仆对数大于等于6时,船容量至少为4,问题有解。

不难说明,当商仆对数为4或5时,所需的
最小船容量为3。

综上,使问题有解的商仆对数与船容量之间的关系如下:
表 1 商仆对数与船容量的关系
商仆对数小船容量
1、2、3 ≥2
4、5 ≥3
≥6 ≥4
从图中可以看出,商仆对数为3,容量为2,3,4,5,6的时候,均可以安全过河。

当容量为2时并且有4种方式。

通过计算机运行此c++程序,当题目中给定出任意数量的商人,随从,以及规定出任意船的容量,都可以判断出“商人们能否安全渡河?”以及解决“如果能,那么安全渡河的方案是什么?”的问题。

从而使这个模型更具有一定的推广价值。

.附件
n=input('输入商人数目: ');
m=input('输入仆人数目: ');
h=input('输入船的最大容量: ');
m0=0;n0=0;
LS=0; % 允许的状态集合S与个数LS
LD=0; % 允许的决策集合D与个数LD
for i=0:n
for j=0:m
if i>=j&n-i>=m-j|i==n|i==0
LS=LS+1;S(LS,:)=[i j];
end
if i+j>0&i+j<=h&(i>=j|i==0)
LD=LD+1;D(LD,:)=[i j];
end
end
end% 用搜寻法找出符合条件的渡河方案
N=15;
Q1=inf*ones(2*N,2*N);
Q2=inf*ones(2*N,2*N);
t=1;le=1;
q=[m n];f0=0; % 判断循环终止标记
while f0~=1&t<N %搜索可行的策略
k=1; sa=[]; sb=[]; for i0=1:le % 第n次允许的策略集逐次搜索
s0=q(i0,:);
if f0==1
break
end
for i=1:LD % 由s0搜索D后得到允许的状态
s1=s0+(-1)^t*D(i,:);
if s1==[m0,n0]
sa=[m0,n0];
sb=D(i,:);
f0=1;
break
end
for j=2:LS-1 % 搜索对比S后允许状态
if s1==S(j,:)
if k==1
sa(k,:)=s1;
sb(k,:)=D(i,:);
k=k+1;
break
end
if k>1 % 对重复状态删除处理
f1=0;
for ii=1:k-1
if s1==sa(ii,:)
f1=1;
break
end
end
end
if f1==0
sa(k,:)=s1; sb(k,:)=D(i,:); k=k+1;
break
end
end
end
end
end
q=sa;
le=size(q,1);
Q1(1:le,t*2-1:t*2)=q;
Q2(1:le,t*2-1:t*2)=sb;
t=t+1;
end% 在可行方案集合中逆向搜寻唯一方案
tr=t-1;
saa1=sa;
SA=zeros(tr,2);
SB=zeros(tr,2);
for k=tr:-1:2
k1=k-1;f0=0;
sbb=Q2(:,k*2-1:k*2);
saa=Q1(:,k1*2-1:k1*2);
for i=1:2*N
saa2=saa1-(-1)^k*sbb(i,:);
for j=1:2*N
if saa2==saa(j,:)
saa1=saa2;
sbb1=sbb(i,:);
f0=1;
break
end
end
if f0==1
break
end
end
SA(k1,:)=saa1;
SB(k,:)=sbb1;
end
SA(tr,:)=[m0 n0];
SB(1,:)=[m,n]-SA(1,:);% 输出
SC = ones(size(SA))*3 - SA;nStep = ceil( size(SB,1) / 2 );
fprintf('\n允许的状态向量:\n');
disp(S);
fprintf('\n允许的决策向量:\n');
disp(S);
fprintf('\n过河步骤:\n');
for i = 1 : nStep fprintf('第%i步:%i商%i仆过河', i, SB(2*i-1,:));
if i < nStep fprintf(',%i商%i仆返回\n', SB(2*i,:));
else
fprintf(',完成\n\n');
end
end
fprintf('过河过程中状态变化:\n步骤此岸商此岸仆方向彼岸商彼岸
仆\n');
for i = 1 : nStep
fprintf('%3i %4i%8i ==> %4i%8i\n', i, SA(2*i-1, :), SC(2*i-1, :));
if i < nStep
fprintf(' %4i%8i <== %4i%8i\n', SA(2*i, :), SC(2*i, :));
end
end。

相关文档
最新文档