商人过河实验报告
数学建模:研究商人过河问题

数学建模实验一报告实验题目:研究商人过河问题一、实验目的:编写一个程序(可以是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商人过河问题
分析
此类智力问题当然可以通过一番思考, 拼凑出一个可行方案来。
但是,我们现在希望能找到求解这类问 题的规律性、建立数学模型,用以解决更 为广泛的问题。
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 = {( 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第三步:模型求解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。