商人过河问题

合集下载

动态规划第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:商人过河一、问题重述问题一: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…..综合(4)可得 和(6)k k x y ={}(,)|0,0,1,2,3,4k k k k k S x y x y ===还要考虑 (7){}'(',')|'0,'0,1,2,3,4kk k k k S x y x y ===把(2)(3)带入(7)可得{}(4,4)|40,40,1,2,3,4k k k k k S x y x y =---=-=化简得(8){}(,)|4,0,1,2,3,4k k k k k S x y x y ===综合(6)(7)(8)式可得 满足条件的情况满足下式(9){}(,)|0,4,0,1,2,3,4;k k k k k k k S x y x y x y ====所以我们知道满足条件的点如上图所示:点移动由(8){}(,)|4,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 ===时,可以认为完成渡河。

案例-商人过河

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

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

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

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

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

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

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

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

建立模型记第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)到这里,整个数学模型就已经非常清晰了,接下来要做的就是求解模型得出结果。

商人渡河问题的有解性分析

商人渡河问题的有解性分析

商人渡河问题的有解性分析
商人渡河问题是一个传统的组合优化问题,它的出现非常有趣,令人瞩目。

商人渡河问题介绍了一个商人需要运输他的货物从一个地方到另一个地方,在这条旅途中他需要渡河。

商人拥有一艘小船,由于它的容量有限,只能分开运送,但它无法运送所有的货物,这个原因,他只好选择一些货物来渡河,而剩下的部分会有一端被留下。

商人渡河问题必须解决的是,商人怎样有效地把所有的货物运送到目的地。

商人渡河问题有解性取决于具体的商人设置的情况。

理论上,对于任何一个给定的商人设置条件,都应该有一个可行的解决方案使得商人能够成功地把货物运送到目的地。

一般来说,为了确保存在一组可行解,商人渡河问题有解性条件就是“不能够有三位商人或以上一起乘船”,“狼不能够单独船乘陆”,“羊不能够单独船乘陆”,“家长不能够离开他们的孩子”和“船不能够空投着划”,只有满足这些条件才能保证可行解的存在。

除此之外,基本的图算法也可以用来解商人渡河问题,如果问题复杂度较小,它是一种很好的算法。

此外,还有其他一些更加复杂的算法,如模型驱动的算法,如遗传算法,这些算法被用来对比测试复杂问题,查看它是否具有可行解决方案。

总的来说,商人渡河问题的可解性取决于具体的商人设置,一般来说,为了确保可行解的存在,商人渡河问题被限制在一定的条件之下,如果条件被满足,商人渡河问题有解性,如果复杂度较小,基本的图算法可以用来解决这个问题,如果复杂度较高,可以使用更加复杂的算法来寻找可行的解决方案。

商人过河问题数学建模

商人过河问题数学建模

商人过河一、问题重述问题一: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;k(1) kv(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)随从 y商人 x数学模型:S k+1=S +(-1)D kx + x ' = 4kky + y ' = 4k k(2)(3)x ≥ y k.k (4)x ' ≥ y 'kk模型分析:由(2)(3)(5)可得(5)4 - x ≥ 4 - ykk化简得(( ( (( ( k(10) k综合(4)可得x = yk还要考虑x ≤ ykkk 和 S k = { x k , y k ) | x k = 0, y k = 0,1,2,3,4 }(6)S ' = { x ', y ') | x ' = 0, y ' = 0,1,2,3,4 }kkkkk(7)把(2)(3)带入(7)可得S = {(4 - x ,4 - y ) | 4 - x = 0,4 - y = 0,1,2,3,4 }kk k k k化简得S = { x , y ) | x = 4, y = 0,1,2,3,4 }kk k k k综合(6)(7)(8)式可得满足条件的情况满足下式S = { x , y ) | x = 0,4, y = 0,1,2,3,4; x = ykkkkk k k所以我们知道满足条件的点如上图所示:点移动由}(8)(9)S = { x , y ) | x = 4, y = 0,1,2,3,4 }kkkkk(8)到达S = { x , y ) | x = 0, y = 0,1,2,3,4 }kkkkk(6)时,可以认为完成渡河。

商人过河问题数学建模c语言

商人过河问题数学建模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语言程序,我们可以实现商人过河问题的数学建模。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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程序如下:
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
调用程序:
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,重新运行程序,得到同样的结果,但实际上还有另外一种安全渡河状态:
(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.原模型求解
改编程序重新运行,或用递归的方法程序运行,结果运行出现错误或死机,这说明模型无解,即四名商人各带一名随从在原条件下无安全状态渡河。

所以我们需附加一定的条件,使模型有解。

由第一问中的条件可知:商人渡河的限制条件是在任何一边岸商人数一定要比随从数多且小船最多只能载2人,而安全状态(即商人数比随从数多)是最其本的前提条件,因此我们考虑x
3 2 1 s n +1
更改小船的容量来实现安全渡河。

3.新模型及求解
当小船的容量为5或大于5时,显然一种安全渡河方式为:先4名随从渡河,1名随从回来;随后4名商人与回来的那名随从一起渡河。

当小船容量为4时,一种渡河方案为:先4名随从渡河,1名随从回来;再3名商人渡河,1名商人和1名随从回来;最后2名商人和2名随从一起渡河。

现在我们考虑小船容量为3时的情况:(在这我们用图解法来完成)
①9步渡河方案(如图⑴所示):
图⑴
即:第一步先三名随从过河,一名随从回来;再两名商人过河,一名商人和一名随从回来;再三名商人过河,一名随从回来;再三名随从过河,一名随从回来;最后两名随从过河。

②11步度河方案(如图⑵所示):
1 2 3 4 x
图⑵
即:第一步先一名商人和一名随从过河,一名商人回来;再三名随从过河,一名随从回来;再三名商人过河,一名商人和一名随从回来;再两名商人过河,一名随从回来;最后三名随从一起过河。

③13步渡河方案(如图⑶所示):
图⑶
即:第一步先一名商人
和一名随从过河,一名商人回来;再两名随从过河,一名随从回来;再两名随从过河,一名随从回来;在三名商人过河,一名商人和一名随从回来;再两名商人过河,两名随从回来;再三名随从过河,一名随从回来;最后三名随从一0
1 2 3 4 x
0 1 2 3 4 x
起过河。

相关文档
最新文档