商人过河问题
数学建模:研究商人过河问题
数学建模实验一报告实验题目:研究商人过河问题一、实验目的:编写一个程序(可以是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:商人过河一、问题重述问题一: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)时,可以认为完成渡河。
动态规划第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名随从乘一条小船过河,小船每次自能承载至多两人。
随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货.乘船渡河的方案由商人决定,商人们如何才能安全渡河呢二.模型假设:商人和随从都会划船,天气很好,无大风大浪,且船的质量很好,可以保证很多次安全的运载商人和随从。
三.问题分析:商随过河问题可以视为一个多步决策过程,通过多次优化,最后获取一个全局最优的决策方案。
对于每一步,即船由此岸驶向彼岸或由彼岸驶向此岸,都要对船上的人员作出决策,在保证两岸的商人数不少于随从数的前提下,在有限步内使全部人员过河。
用状态变量表示某一岸的人员状况,决策变量表示船上的人员状况,可以找出状态随决策变化的规律,问题转化为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到安全渡河的目标。
四.模型构成:k x ~第k 次渡河前此岸的商人数,k y ~第k 次渡河前此岸的随从数 k x , k y =0,1,2,3,4; k =1,2,… …k S =(k x , k y )~过程的状态,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} k u ~第k 次渡船上的商人数k v ~第k 次渡船上的随从数k d =(k u , k v )~决策,D={(u , v )| 21≤+≤v u ,k u , k v =0,1,2} ~允许决策集合 k =1,2,… …因为k 为奇数时船从此岸驶向彼岸,k 为偶数时船从彼岸驶向此岸,所以状态k S 随决策k d 的变化规律是1+k S =k S +k )1(-k d ~状态转移律求k d ∈D(k =1,2, …n), 使k S ∈S, 并按转移律由1S =(4,4)到达状态1+n S =(0,0)。
商人过河问题
商人过河问题一、三名商人各带一名随从的情况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)即:两个仆人过河,一个仆人回来;有两个仆人过河,一个仆人回来;两个主人过河,一主一仆回来;有两个主人过河,一个仆人回来;两个仆人过河,一个仆人回来;最后两个仆人过河。
怎样安全渡河问题
实验1 怎样安全过河问题一、问题3名商人各带1名随从乘船渡河,一只小船只能容纳2人,由他们自己划行。
随从们密约,在河的任一岸,一旦随从人数比商人多,就杀商人。
此密约被商人知道,如何乘船渡河的大权掌握在商人们手中,商人们怎样安排每次乘船方案,才能安全渡河呢?二、实验目的使学生进一步巩固和理解向量的定义、运算规则及多步决策理论及其应用。
三、预备知识向量定义及运算,多步决策理论。
四、实验内容与要求建立起商人安全渡河的数学模型,并给出商人们如何安全渡河的一个方案,使得渡河的次数尽量少。
五、思考问题在上述的约束条件下,若商人有4名时,问商人们是否能实现安全渡河?更一般地,若商人数是m,小船最多只能坐n(1〈n〈m〉人,m和n有何关系时,商人们才能实现安全渡河?问题解答一、问题分析与建立模型由于这个问题已经理想化了,所以不必再作假设。
这个问题可以看作一个多步决策的过程。
设第k次渡河前此岸的商人数为X K,随从数为Y K,k=1,2,…。
X K,Y K=0,1,2,3。
将二维向量S K=( X K,Y K)定义为状态。
安全渡河条件下的状态集合称为允许状态集合,记为S,则S={(x,y)|x=0或3,y=0,1,2,3;x=y=1,2} (1) 又设第k次渡船上的商人数为U K,随从数为V K,将二维向量D K=(U K,V K)定义为决策,则允许决策集合为:D={(u,v)|u+v=1,2} (2)因为k为奇数时船从此岸驶向彼岸,k为偶数时船由彼岸驶回此岸,所以状态S K随着决策D K变化的规律即状态转移规律是:S K+1=S K+(—1)K D K (3)这样,制定安全渡河方案归结为如下的多步决策问题:求决策D K∈D(k=1,2,…,n),使S K∈S按照转移律(3),由初始状态S1=(3,3)经有限步(设为n)到达状态S n+1=(0,0)。
二、计算过程下面通过Mathematica的程序给出这个多步决策问题的一个解,同时满足了渡河次数尽量少的条件。
【数学模型】商人们怎样过河?
问题引出问题:三名商人各带一个随从过河,一只小船只能容纳两个人,随从们约定,只要在河的任何一岸,一旦随从人数多于商人人数就杀人越货,但是商人们知道了他们的约定,并且如何过河的大权掌握在商人们手中,商人们该采取怎样的策略才能安全过河呢?这次的问题是一个很经常遇到的过河问题,其实对于该类问题,我们经过逻辑思考就可以得到答案。
但是通过数学模型的建立,我们可以得到一个通用的解答,并且通过计算机的计算我们可以大大扩大问题的规模。
问题分析因为这个问题已经理想化了,所以我们无需对模型进行假设,该问题可以看作一个多步决策问题。
每一步,船由此岸划到彼岸或者由彼岸划回此岸,都要对船上的人员进行决策(此次渡河船上可以有几名商人和几名随从),在保证安全(两岸的随从都不比商人多)的前提下,在有限次的决策中使得所有人都到对岸去。
因此,我们要做的就是要确定每一步的决策,达到渡河的目标。
建立模型记第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语言商人过河问题是一个经典的数学建模问题,通过建立数学模型,我们可以更深入地理解问题的本质,并找到最优的解决方案。
本文将通过C语言来实现这个问题的数学建模。
一、问题描述假设有n个商人要过河,每艘船只能承载一定数量的货物,而过河需要消耗一定的时间。
为了在最短的时间内完成过河任务,我们需要考虑商人的数量、船只的承载量以及过河的时间等因素,建立相应的数学模型。
二、数学建模1. 变量定义我们需要定义一些变量来描述过河过程中的各种因素,如商人的数量、船只的数量、船只的承载量、过河的时间等。
2. 算法设计算法的核心思想是利用贪心策略,尽可能多地利用船只,以减少过河的时间。
具体步骤如下:(1) 分配船只:根据船只的承载量,将商人分配到不同的船只上;(2) 计算过河时间:根据当前船只的位置和目标河岸的位置,计算每艘船只的过河时间;(3) 更新船只位置:根据过河时间,更新每艘船只的位置;(4) 重复以上步骤,直到所有商人过河。
3. C语言实现以下是一个简单的C语言程序,实现了上述算法:```c#include <stdio.h>#include <stdlib.h>int main() {int n, m, t, i, j, k;scanf("%d%d", &n, &m); // 输入商人数量和船只数量int cargo[n], time[n]; // 定义变量数组,用于存储商人和船只的信息scanf("%d%d", &cargo[0], &time[0]); // 输入第一个商人和他的过河时间for (i = 1; i < n; i++) { // 输入剩余商人和他们的过河时间scanf("%d%d", &cargo[i], &time[i]);}int boat[m]; // 定义船只数组,用于存储船只的承载量和位置信息for (j = 0; j < m; j++) { // 输入船只的承载量和位置信息scanf("%d", &boat[j]);}for (k = 0; k < n; k++) { // 模拟过河过程for (j = 0; j < m; j++) { // 遍历所有船只if (boat[j] >= cargo[k]) { // 如果船只承载量足够承载当前商人time[k] += time[k] / boat[j]; // 根据过河时间和船只速度计算剩余时间boat[j] += cargo[k]; // 将商人转移到指定位置的船只上break; // 如果找到了足够承载商人的船只,跳出当前循环继续下一轮操作}}}printf("%d\n", time[n - 1]); // 输出最后一个商人的过河时间return 0;}```三、总结通过上述C语言程序,我们可以实现商人过河问题的数学建模。
商人过河问题
商人过河问题摘要本文就商人们如何能够安全过河问题, 采用多步决策建立了数学模型,求解得到商人们安全过河的方案。
将经典的商人过河问题进行了更广的讨论,在此基础上着重分析了安全渡河的状态空间,建立了满足问题需求的规则,从而得出了要求解问题的方案。
模型主要通过穷举的方法对各种过河的方案进行一一列举,然后根据小船的容量和商人们要安全渡河为前提对各种方案进行层层筛选。
最终,得到商人安全渡河的方案。
最后本文就此问题进行推广,当有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)。
商人过河问题.
A (aij )nn 为 G 的邻接距阵,其中
1 aij 0
viv j E(G) viv j E(G)
i, j 1, 2, , n
定理 1:设 A(G) 为图 G 的邻接距阵,则 G 中从顶点 vi 到顶点 v j ,长度为 k 的道路的条
数为 Ak 中的 i 行 j 列元素.
证: 对 k 用数学归纳法 k 1 时,显然结论成立; 假设 k 时,定理成立, 考虑 k 1的情形.
其中 A 表示从南岸到北岸渡河的图的邻接距阵, B AT 表示从北岸到南岸渡河的图的
邻接距阵。
由定理 1、我们应考虑最小的 k ,s t ( AB)k A 中 1 行 10 列的元素不为 0,此时 2k 1
即为最少的渡河次数,而矩阵 ( AB)k A 中 1 行 10 列的元素为最佳的路径数目。
商人过河问题
三名商人各带一个随从乘船渡河,现有一只小船只能容纳两个人,由他们自己划行,若 在河的任一岸的随从人数多于商人,他们就可能抢劫财物。但如何乘船渡河由商人决定,试 给出一个商人安全渡河的方案。
首先介绍图论中的一个定理
G 是一个图,V(G)为 G 的顶点集,E(G)为 G 的边集。 设 G 中有 n 个顶点 v1, v2 , , vn ;
条,所以长为 k 1的从 vi 经 k 步到 vl 再一步到 v j 的道路共有 ai(lk) alj 条,故从 vi 经 k 1
n
步到 v j 的路径共有 ai(jk1)
a(k) il
alj
条.
l 1
下面分析及求解 假设渡河是从南岸到北岸,(m,n)表示南岸有 m 个商人,n 个随从,全部的允许状 态共有 10 个
v1 (3,3) v2 (3,2) v3 (3,1) v4 (3,(0,3) v8 (0,2) v9 (0,1) v10 (0,0)
商人们怎样安全过河的数学模型
商人们怎样安全过河的数学模型示例文章篇一:话说啊,商人们遇到了一个棘手的问题:他们得带着随从们一起过河,但随从们可不是省油的灯,一有机会就想着害商人抢货。
这河又不宽不窄,一只小船每次只能载两个人,怎么过河才能确保安全呢?咱们来聊聊这个问题吧。
首先,商人们得明白,随从们人多势众,要是他们比商人多了,那可就危险了。
所以,商人们得想个法子,让随从们没法儿耍花招。
其实啊,这个问题可以变成一个数学模型。
想象一下,我们把每次过河的人都看成是一个状态,就像打游戏一样,每过一次河就是进入了一个新的关卡。
在这个关卡里,商人们得保证自己的人数不能少于随从们。
那具体怎么做呢?咱们得先设定一些规则。
比如说,每次过河的人数只能是两个,这是小船的容量决定的。
然后,商人们得选择让哪些人过河,这就得靠他们的智慧和策略了。
想象一下这个场景:商人们先让两个随从过河,然后一个商人再带一个随从回来。
这样,河对岸的随从人数虽然多了,但商人这边还有足够的人手可以应对。
接下来,两个商人再过河,这样河对岸的商人数就比随从数多了,安全就得到了保障。
然后,再让一个商人带一个随从回来,这样河这边也有足够的商人保护随从不敢造次。
最后,两个随从再过河,问题就解决了。
这个数学模型虽然简单,但却非常实用。
它告诉我们,在面对困难和挑战时,只要我们善于运用智慧和策略,就一定能够找到解决问题的方法。
所以,商人们要想安全过河,就得靠他们的智慧和勇气了。
示例文章篇二:话说啊,有这么一个古老的谜题,叫做“商人过河”。
话说有三名聪明的商人,他们各自带着一个狡猾的随从,准备乘船过河。
这船啊,一次只能载两个人,问题就在于,这些随从们心里都有个小九九,他们密谋着,只要到了河的对岸,随从人数多于商人人数,就立马动手抢货。
这商人们也不是吃素的,他们知道随从们的阴谋,但他们毕竟都是聪明人,于是就想出了一个绝妙的策略。
咱们来想想啊,这过河其实就是一个多步决策的过程。
每次渡河,船上的人员选择都至关重要。
商人过河问题
商人过河问题摘要:为了求解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)}五.模型建立:动态规划法正是求解多步决策的有效方法。
商人过河问题
商人过河一、问题重述和分析随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货。
现有4名商人各带一个随从一起渡河一只船只能容纳两个人,但如何乘船渡河的大权掌握在商人的手里,商人怎样安排才能在有限步内安全渡河?二、模型假设1、在商人人数多于随从时乘船渡河的大权掌握在商人的手里;2、商人和随从都会划船;三.符号说明x表示商人人数;y表示随从人数;z表示划船到河的此岸与彼岸。
四、模型的建立与求解本题为多步决策模型,每一次过河都是状态量的转移过程。
此岸四个商人用x=0、1、2、3、4表示,此岸四个随从用y=0、1、2、3、4表示,z=0时表示划船到河的此岸时,z=1时表示划船到河的彼岸时,用有序数对(x,y,z)表示每次转移的状态量。
解决此问题就是状态量(4,4,0)转移至(0,0,1),以下就是状态量转移的全部情况(其中“!”表示不能再转移下去或与前面步骤重复):(4,4,0)→(3,3,1)↓↓(4,2,1)→(4,3,0)→(4,1,1)→(4,2,0)→(4,0,1)→(4,1,0)→!↓(2,2,1)↓!由以上关系可知,一只船只能容纳两个人的情况下,四名商人各带一个随从无法过河。
此外,如果船的容量增加到3人,那么商人就能以几种方式安全过河,以下是其中一种方案:(4,4,0)→(4,2,1)→(4,3,0)→(4,1,1,)→(4,2,0)→(2,2,1)↓(0,1,1)←(0,3,0)←(0,2,1)←(0,4,0)←(0,3,1)←(3,3,0)↓(0,2,0)→(0,0,1)五、模型推广通过以上模型的建立,若商人和随从人数增加或小船容量加大,考虑n名商人各带一随从的情况。
安全渡河问题
上图给出了一种移动方案, 上图给出了一种移动方案,经过决策 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
商人过河问题数学建模之欧阳光明创编
作业1、2:欧阳光明(2021.03.07)商人过河一、问题重述问题一: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)可得化简得综合(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,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)时,可以认为完成渡河。
(完整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 船可以载一个人(可以是商人或者仆人)移动到对岸。
进行这个动作的前提条件是本侧至少有一个人,并且这个人离开后本侧岸边的商人数量不少于仆人数量或者干脆没有商人(否则会发生血案)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
商人过河问题
一、三名商人各带一名随从的情况
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程序sroute.m如下:
function route=sroute(G,opt)
%求图的最短路的Dijkstra算法程序,规定起点为1,顶点连续编号
%G是给定图的邻接矩阵或弧表矩阵,程序能够自动识别
%当opt=0(或缺省)时求无向图的最短路,当opt=1时求有向图的最短路
%d——标记最短距离
%route是一个矩阵,第一行标记顶点,第二行标记1到该点的最短路,第三行标记最短路上该点的先驱顶点
while 1 %此循环自动识别或由弧表矩阵生成邻接矩阵
if G(1,1)==0
A=G;break
else
e=G
n=max([e(:,1);e(:,2)]); %顶点数
m=size(e,1); %边数
M=sum(e(:,3)); %代表无穷大
A=M*ones(n,n);
for k=1:m
A(e(k,1),e(k,2))=e(k,3);
if opt==0
A(e(k,2),e(k,1))=e(k,3); %形成无向图的邻接矩阵
end
end
A=A-M*eye(n) %形成图的邻接矩阵
end
break
end
pb(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)>=2
index=index(1);
end
index2(temp)=index; %记录前驱顶点
end
route=[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
调用程序sroute.m:
route=sroute(e,0)
运行结果:
e =
1 2 1
1 4 1
1 10 1
3 4 1
3 6 1
3 10 1
5 6 1
5 8 1
7 14 1
7 16 1
9 8 1
9 12 1
11 12 1
11 14 1
13 14 1
13 16 1
15 16 1
route =
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0 1 2 1 4 3 10 5 6 1 8 7 10 9 12 11
1 1 4 1 6 3 14 5 8 1 1
2 9 14 11 16 7
这表示存在一条从1到16的长度为11的路:1 4 3 6 5 8 9
12 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)
即:两个仆人过河,一个仆人回来;有两个仆人过河,一个仆人回来;两个主人过河,一主一仆回来;有两个主人过河,一个仆人回来;两个仆人过河,一个仆
人回来;最后两个仆人过河。
这样,商人安全过河。
若把刚才的最短路上的边权全部改大,如取2或3,重新运行程序sroute.m ,得到同样的结果,但实际上还有另外一种安全渡河状态:
(3,3)变为(2,2)变为(3,2)变为(3,0)变为(3,1)变为(1,1)变为(2,2)变为(0,2)变为(0,3)变为(0,1)变为(0,2)变为(0,0)
5. 图解法
将十种安全状态的点在直角坐标系中标出,如下图
(0,0),(0,1),(0,2),(0,3),(2,2),(1,1),(3,0),(3,1),(3,2),(3,3) (实线表示才此岸开往彼岸,虚线表示才彼岸开往此岸)
图中111d d 到给出了商人安全渡河的一条路径。
二、四名商人各带一名随从
1.问题:四名商人各带一名随从时,就附加说明条件才能实现安全渡河。
2.原模型求解
改编程序sroute.m 重新运行,或用递归的方法程序运行,结果运行出现错误或死机,这说明模型无解,即四名商人各带一名随从在原条件下无安全状态渡河。
所以我们需附加一定的条件,使模型有解。
由第一问中的条件可知:商人渡河的限制条件是在任何一边岸商人数一定要比随从数多且小船最多只能载2人,而安全状态(即商人数比随从数多)是最其本的前提条件,因此我们考虑更改小船的容量来实现安全渡河。
3.新模型及求解
当小船的容量为5或大于5时,显然一种安全渡河方式为:先4名随从渡河,1名随从回来;随后4名商人与回来的那名随从一起渡河。
当小船容量为4时,一种渡河方案为:先4名随从渡河,1名随从回来;再3名商人渡河,1名商人
s n +1
和1名随从回来;最后2名商人和2名随从一起渡河。
现在我们考虑小船容量为3时的情况:(在这我们用图解法来完成)
①9步渡河方案(如图⑴所示):
图⑴
即:第一步先三名随从过河,一名随从回来;再两名商人过河,一名商人和一名随从回来;再三名商人过河,一名随从回来;再三名随从过河,一名随从回来;最后两名随从过河。
②11步度河方案(如图⑵所示):
图⑵
1 2 3 4
x 0 1 2 3 4 x
即:第一步先一名商人和一名随从过河,一名商人回来;再三名随从过河,一名随从回来;再三名商人过河,一名商人和一名随从回来;再两名商人过河,一名随从回来;最后三名随从一起过河。
③13步渡河方案(如图⑶所示):
图⑶
即:第一步先一名商人和一名随从过河,一名商人回来;再两名随从过河,一名随从回来;再两名随从过河,一名随从回来;在三名商人过河,一名商人和一名随从回来;再两名商人过河,两名随从回来;再三名随从过河,一名随从回来;最后三名随从一起过河。
0
1 2 3 4 x。