商人过河问题

合集下载

商人过河问题数学建模

商人过河问题数学建模

作业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)时,可以认为完成渡河。

5---安全渡河问题

5---安全渡河问题
S k = ( xk , yk )
k
决策, 决策,取奇偶数与前面表示意义相同,则状 态转移满足下列关系:
S k +1 = S k + (−1) k d k

• 我们的问题就成为:求决策
kSk ∈ S来自dk ∈ D( =1,2,…)使 • 状态按(2.2.1)式由初始状态 状态按(2. 1)式由初始状态 经步转移到 的最小 的n值。
• 为便于计算机求解,记允许状态集合和决
策向量集合分别为
D = {(u , v) u + v = 1,2, ; u , v = 0,1,2} S = {( x, y ) x = 0, y = 0,1,2,3; x = 3, y = 0,1,2,3; x = y = 1,2}
• 并以 , • =1,2,…表示状态变化过程,表示过河
安全渡河问题
问题:三名商人各带一名随从乘船渡河,一只小船只能容纳 二人,由他们自己划行。随从们密约,在河的任一岸,一旦 随从的人数比商人多,就杀人越货。但是如何乘船渡河的大 权掌握在商人们手中。商人们怎样才能安全渡河呢?
• 这是一道阿拉伯早期的智力题,有多种解法,下面介绍 • •
• • •
两种。 1.应用状态转移法求解 商人过河问题同样是带有约束条件的过河问题,可视为 一个多步决策过程,每一步,即船由南岸到北岸或由北岸 到南岸,都要对船上人员(商人、随从各几人) 到南岸,都要对船上人员(商人、随从各几人)作出决策, 在允许的前提下,有限次内使三对商人全部过河。 记第次过河前南岸的商人数为,随从数为,=,,=0 记第次过河前南岸的商人数为,随从数为,=,,=0, 1,2,3,则状态向量可表为(,),所有可能状态共16个, ,则状态向量可表为( ,所有可能状态共16个, 其可取状态或允许状态有10个: 其可取状态或允许状态有10个: (0,0).(0,1),(0,2),(0,3),(3,0) (0,0).(0,1),(0,2),(0,3),(3, (3,1),(3,2),(3,3),(1,1),(2,2) (3,1),(3,2),(3,3),(1,1),(2,

动态规划第7讲 - 商人过河问题

动态规划第7讲 - 商人过河问题

8.7 动态规划:商人过河问题问题提出三名商人各带一个随从乘船渡河(A岸到B岸)。

现此岸有一小船只能容纳两人,由他们自己划行。

若在河的任一岸随从人数比商人多,他们就可能杀人越货。

不过如何乘船渡河的大权由商人们掌握。

商人们怎样才能安全过河呢?模型建立此问题可视为一个多步决策模型建立决策变量:(a,b)a------船上的商人数b ------船上的随从数a,b的取值范围:{0,1,2}且满足a+b<=2,且均为整数。

允许决策集合:D={(a,b)|a+b=1,2}={(0,1), (0,2), (1,1), (1,0), (2,0)}模型求解这样问题要求由(3,3,1)变到(0,0,0)的一条道路。

根据题意,状态转移时要满足一定的规则:1. Z从1变为0与从0变为1交替进行(船在哪个岸);2. 当Z从1变为0时,即船从A岸到B岸,A岸人数减少1或2个;即(x,y,1)→(u,v,0)时, u≤x, v≤y, u+v=x+y-1 oru+v=x+y-23. 当Z从0变为1时,即船从B岸到A岸,A岸人数增加1或2个;即(x,y,0)→(u,v,1)时, u≥x, v≥y,u+v=x+y+1 oru+v=x+y+24. 不重复已出现过的状态,如(3,3,1)→(3,1,0)→(3,3,1);按照以上规则,求解过程如下从(3,2,0)只能到达(3,3,1)/*不必考虑*/从(3,3,1)出发(3,2,0)(3,1,0)如右图(2,2,0)(3,3,1)(3,2,0)(3,1,0)(2,2,0)从(3,1,0)出发(3,3,1) /*不必考虑*/(3,2,1)/*可取*/从(2,2,0)出发(3,3,1) /*不必考虑*/(3,2,1)/*可取*/模型求解如下图所示:逐步求解,可得:模型求解由此可得到渡河策略:(3,3,1) (3,2,1)→(3,0,0)→(3,1,1)→(1,1,0)→(2,2,1)→(0,2,0)→(0,3,1)→(0,1,0) (0,0,0)(2,2,0)(3,1,0)(1,1,1)(0,2,1)模型求解思考(1) 夫妻过河问题有三对夫妻要过河,船最多可载两人。

4名商人带4名随从安全过河

4名商人带4名随从安全过河

4名商人带4名随从安全过河一.问题提出:4名商人带4名随从乘一条小船过河,小船每次自能承载至多两人。

随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货.乘船渡河的方案由商人决定,商人们如何才能安全渡河呢?二.模型假设:商人和随从都会划船。

三.问题分析:商随过河问题可以视为一个多步决策过程,通过多次优化,最后获取一个全局最优的决策方案。

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

用状态变量表示某一岸的人员状况,决策变量表示船上的人员状况,可以找出状态随决策变化的规律,问题转化为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到安全渡河的目标。

四.模型构成:xk~第k次渡河前此岸的商人数,yk~第k次渡河前此岸的随从数xk, yk=0,1,2,3,4; k=1,2,……Sk=(xk, yk)~过程的状态,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} uk~第k次渡船上的商人数vk~第k次渡船上的随从数dk=(uk, vk)~决策,D={(u , v)| 1=<u+v=<2,uk, vk=0,1,2} ~允许决策集合 k=1,2,……因为k为奇数时船从此岸驶向彼岸,k为偶数时船从彼岸驶向此岸,所以状态Sk随决策dk的变化规律是Sk1=Sk+(-1)k dk~状态转移律求dk∈D(k=1,2, …n), 使Sk∈S, 并按转移律由S1=(4,4)到达状态Sn1=(0,0)。

五.模型求解:1.图解法:对于人数不多的情况,可以利用图解法来求解。

在xoy平面坐标系上画出如图所示的方格,方格点表示状态s=(x,y),允许状态集合S是圆点标出的13个格子点,允许决策dk是沿方格线移动1格或2格,k为奇数时向左、下方移动,k为偶数时向右、上方移动。

商人过河问题

商人过河问题

商人过河问题一、三名商人各带一名随从的情况1.问题(略)2.模型假设①当一边岸满足随从数大于商人数,但商人数为0时仍为一种安全状态;②小船至多可容纳2人,且渡河时由随从(或者商人)来划船。

3.分析与建模商人过河需要一步一步实现,比如第一步:两个仆人过河,第二步:一个仆人驾船回来,第三步:又是两个仆人过河,第四步:……其中每一步都使当前状态发生变化,而且是从一种安全状态变为另一种安全状态。

如果我们把每一种安全状态看成一个点,又如果存在某种过河方式使状态a变到状态b,则在点a和点b之间连一条边,这样我们把商人过河问题和图联系起来,有可能用图论方法来解决商人过河问题。

建模步骤:⑴首先要确定过河过程中的所有安全状态,我们用二元数组(,)x y 表示一个安全状态(不管此岸还是彼岸),其中x表示留在此岸的主人数,y表示留在此岸的随从数。

两岸各有十种安全状态:(0,0),(0,1),(0,2),(0,3),(2,2),(1,1),(3,0),(3,1),(3,2),(3,3)⑵在两岸的安全状态之间,如存在一种渡河方法能使一种状态变为另一种安全状态,则在这两种状态之间连一条边。

这样,得到如下一个二部图(图1),其中下方顶点表示此岸状态,上方顶点表示彼岸状态。

我们的目的是要找出一条从此岸(3,3)到彼岸(0,0)的最短路。

⑶观察发现此岸的状态(0,0),(3,0)和彼岸的状态(0,3),(3,3)都是孤立点,在求最短路的过程中不涉及这些点,把它们删去。

两岸的点用1,2, (16)新标号。

(3,3)(3,2)(3,1)(3,0)(1,1)(2,2)(0,3)(0,2)(0,3)(0,0)○②④⑥⑧⑩○○12○14○16①③⑤○⑦⑨○11○13○15○(3,3)(3,2)(3,1)(3,0)(1,1)(2,2)(0,3)(0,2)(0,3)(0,0)(图1)4.模型求解求最短路程的matlab程序如下:function route=sroute(G,opt)%求图的最短路的Dijkstra算法程序,规定起点为1,顶点连续编号%G是给定图的邻接矩阵或弧表矩阵,程序能够自动识别%当opt=0(或缺省)时求无向图的最短路,当opt=1时求有向图的最短路%d——标记最短距离%route是一个矩阵,第一行标记顶点,第二行标记1到该点的最短路,第三行标记最短路上该点的先驱顶点while 1 %此循环自动识别或由弧表矩阵生成邻接矩阵if G(1,1)==0A=G;breakelsee=Gn=max([e(:,1);e(:,2)]); %顶点数m=size(e,1); %边数M=sum(e(:,3)); %代表无穷大A=M*ones(n,n);for k=1:mA(e(k,1),e(k,2))=e(k,3);if opt==0A(e(k,2),e(k,1))=e(k,3); %形成无向图的邻接矩阵endendA=A-M*eye(n) %形成图的邻接矩阵endbreakendpb(1:length(A))=0;pb(1)=1;index1=1;index2=ones(1,length(A));d(1:length(A))=M;d(1)=0; %标记距离temp=1;while sum(pb)<length(A)tb=find(pb==0);d(tb)=min(d(tb),d(temp)+A(temp,tb)); %更新距离temp=find(d(tb)==min(d(tb))); %确定新最小距离点temp=tb(temp(1));pb(temp)=1;index1=[index1,temp];index=index1(find(d(index1)==d(temp)-A(temp,index1)));if length(index)>=2index=index(1);endindex2(temp)=index; %记录前驱顶点endroute=[1:n;d;index2];在matlab的命令窗口输入图(1)的弧表矩阵e:e=[1 2;1 4;1 10;3 4;3 6;3 10;5 6;5 8;7 14;7 16;9 8;9 12;11 12;11 14;13 14;13 16;15 16];e=[e,ones(17,1)]; %边权都设为1调用程序:route=sroute(e,0)运行结果:e =1 2 11 4 11 10 13 4 13 6 13 10 15 6 15 8 17 14 17 16 19 8 19 12 111 12 111 14 113 14 113 16 115 16 1route =1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 160 1 2 1 4 3 10 5 6 1 8 7 10 9 12 111 1 4 1 6 3 14 5 8 1 12 9 14 11 16 7这表示存在一条从1到16的长度为11的路:1 4 3 6 5 8 912 11 14 7 16,此路对应商人成功渡河的一个方案:(3,3)变为(3,1)变为(3,2)变为(3,0)变为(3,1)变为(1,1)变为(2,2)变为(0,2)变为(0,3)变为(0,1)变为(1,1)变为(0,0)即:两个仆人过河,一个仆人回来;有两个仆人过河,一个仆人回来;两个主人过河,一主一仆回来;有两个主人过河,一个仆人回来;两个仆人过河,一个仆人回来;最后两个仆人过河。

日常生活中的数学建模

日常生活中的数学建模

改进模型:
l1: 鱼的有效长度 A1:横截面积
V l1 A 1
l1 l
2 A s 1
W kls
2
W V
数学建模
模型检验
在钓鱼比赛期间收集了有关数据:
第i条鱼 长度li
腰围si
所钓鱼的长度、腰围与重量 cm, g
1 36.83
2 31.75
3

5 32.07
6
7
8 32.07
决策 ~ 每一步(此岸到彼岸或彼岸到此岸)船上的人员 要求 ~ 在商人安全的前提下(两岸的随从数都不比商人多), 经有限步使全体人员过河。
数学建模
模型建立及求解
xk~第k次渡河前此岸的商人数 xk, yk=0,1,2,3; 设 yk~第k次渡河前此岸的随从数 k=1,2, sk=(xk , yk)~过程的状态,S ~允许状态集合 S={(x , y) x=0, y=0,1,2,3; x=3, y=0,1,2,3; x=y=1,2}
态转方程,由 s1=(3,3)到达 sn+1=(0,0)。
数学建模
模型求解
穷举法 ~ 编程上机 图解法
状态s=(x,y) ~ 16个格点
3 2
y
s1
d1
S={(x , y) x=0, y=0,1,2,3;
x=3, y=0,1,2,3; x=y=1,2} 允许状态 ~ 10个 点
1
d11 0sn+1 1 2 3 x
sk+1=sk+(-1)k dk
~状态转移方程
uk~第k次渡船上的商人数 uk, vk=0,1,2; vk~第k次渡船上的随从数 k=1,2, D={(u , v) u+v=1, 2} ~允许决策集合

商人过河问题数学建模

商人过河问题数学建模

商人过河问题数学建模作业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 ≤随从y商人x综合(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,4k k 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)时,可以认为完成渡河。

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

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

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

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

二.解决方案用递归的源程序如下:开始时商人,强盗所在的河的这边设为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();}。

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

商人过河问题
问题重述
三名商人各带一个随从乘船渡河。

现此岸有一小船只能容纳两人,由他们自己划行。

若在河的任一岸随从人数比商人多,他们就可能kill商人。

不过如何乘船渡河的大权由商人们掌握。

商人们怎样才能安全过河呢?
问题分析
此问题可视为一个多步决策问题,每一步就是一
次渡河,每次渡河就是一次状态转移。

符号说明
x,y的取值范围:{0,1,2,3}
z的取值范围:{0,1}
那么安全状态可表示为
x=0,3, y=0,1,2,3 或x=1,2, y=x
这样问题要求由(3,3,1)变到(0,0,0)的一条道路。

根据题意,状态转移时要满足一定的规则:
按照以上规则,求解过程如下:。

相关文档
最新文档