数学建模商人过河__论文
商人过河问题数学建模
做业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+1kS =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)时,不妨认为完毕渡河.果为移动的格数小于等于2,惟有核心面(2,2)到(6)面战(8)面的距离为2,所以核心面(2,2)成为渡河的闭键面.当咱们移动到(2,2)面时,便无法举止下去.故4个商人,4个随从,船容量为2人时,无法仄安渡河. 对付于问题二,咱们不妨修坐模型为:k+1k S =S +k k D (-1)(10)'k k x x M += (11)'k k y y M += (12)k.k x y ≥(13)''k k x y ≥ (14)u(k), v(k)=0,1,2,3; (15)通过类似于问题一的步调不妨知讲:坐标上的闭键面是(3,3),最多不妨五名商人戴五名随从往日.需要决定五名商人戴五名随从的规划可止再决定六名商人戴六名随从的规划没有成止1、五名商人戴五名随从的情况:(1)最先没有成能有三名商人先过河,二名商人一名随从过河,一名商人二名随从过河(2)三个随从先过河(5,2),回去一个随从(5,3),往日二个随从(5,1)回去一个随从(5,2),再往日三个商人(2,2),回去一个商人一个随从(3,3),再往日三个商人(0,3),回去一个随从(0,4),往日三个随从(0,1),回去一个随从(0,2)再往日二个随从(0,0)综上可知:五名商人戴五名随从,小船不妨载三部分不妨过河2、六名商人戴六名随从的情况:(1)最先没有成能有三名商人先过河,二名商人一名随从过河,一名商人二名随从过河(2)三个随从先过河(6,3),回去一个随从(6,4),往日二个随从(6,2)回去一个随从(6,3),往日三个商人(3,3),此时二岸皆是(3,3),由坐标法分解知,那是最交近末面的临界面,然而是如果回去的时间一定是回去一个商人战一个随从,如果那一步可止,后里便举止没有去综上所述,六个商人戴六个随从,小船载三部分的情况下没有克没有及渡河分离1、2知,当小船最多载三部分的时间,最多五名商人各戴一个随从不妨过河.五、模型的考验取评介由少量人的过河问题推广到了更普遍人的过河问题,使得问题变得明白有顺序.六、参照文件[1]章胤,2014年燕山大教世界大教死数教修模竞赛训练ppt,2014年4月17日。
15对商仆过河问题数学建模论文
数学建模题目:商仆过河问题组员:班级:指导老师:目录1.摘要 (3)2.问题的提出 (3)3.问题的分析 (4)4.模型的假设 (5)5.模型的建立与解 (5)6.模型的符号 (6)7.模型的解 (6)8.模型的图解 (8)9.关于C语言的程序算法 (10)10.模型的优缺点 (14)11.参考文献 (15)摘要:本文针对商人安全渡河问题,采用多步决策的过程建立数学模型,求解得到了在随从没杀人越货的情况下的渡河方案。
对于本题而言,在3(15)对商仆、船最大容量为2(8)人的情况下,首先定义了渡河前此岸的状态,并设安全渡河条件下的状态集合定义为允许状态集合,接着得到渡河方案的允许决策集合,然后得到状态随从渡河方案变化的规律。
利用c软件编译运行程序得到了一种商人安全渡河的方案,并输出了允许的状态向量和允许的决策向量。
关键词:船载量、允许状态向量、允许决策向量一.问题的提出仆人们密约,在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,三名商人各带一个随从乘船渡河,一只小船只能容纳两人,由他们自己划行。
在河的任意一岸,一旦随从的人数比商人多,商人就有危险.但是如何乘船渡河的大权掌握在商人们手中。
商人们怎样才能安全渡河呢?同时,推广到十五名商人带十五名随从又如何?二.问题的分析1.安全渡河问题可以看成一个多步决策过程,船由此岸驶向彼岸或从彼岸驶回此岸,都要对船上的人员(商人随从各几人)作出决策。
2.状态向量:用二维坐标向量表示(商,仆):0<=H<=3(11),0<=S<=3(11),例如:(3,3,)(5,0)(6,4)等均成立3.允许向量:由题意可知,仆人数少于商人数被选定为允许向量。
4.运载向量:利用二维向量(m,n)表示船只上的商仆数量。
5.可行的运载向量:满足二维向量(m,n),0<=n<=m<=3(15)。
枚举所有可能的算法:(1,0)(2,0)(3,0)(4,0)(5,0)(6,0)(7,0)(8,0)(1,1)(2,2)(3,3)(4,4)(2,1)(3,2)(4,3)6.可取用状态向量:利用穷举法表示状态,利用递归算法进行模型的建立与运算7.运载向量:使用二维向量进行表示(商,仆):0<=商<=3(11),0<=仆<=3(11)8.该模型使用逻辑运算法则进行数学模型的建立三.模型的假设(1)每个商人和他的随从均会划船(2)只有一条船,且船只的承载数量为8人(3)船在划行的状况下不受任何的外力干扰(4)不存在任意几人不能同时坐船的情况四.模型的建立与解由题目可知,3(15)对商仆过河,船载量为2(8)人,现记第K次渡河前的商人数为Xk,仆人数为Yk,k=1,2,…,(2)8,再记一组二维向量Ak=(Xk,Yk),Ak为给定时的状态量,可记做C的表达式为:C={(x,y)|x=0,y=0,1,…,(3)15=y=0,1,…,(3)15=y=0,1,…,(3)15再记第K次渡河时船上的商人数为uk,仆人数为vk,记二维向量Bk=(uk,vk),可知小船此时的运载为D,D的表达式为;D ={(u,v)|1<=u+v<=2(8),u,v=0,1,…,2(8)}由上题目中的题意可知第K+1次时的情况为E :E=Ak+(-1)^k*Dk最终直到3(15)对商仆全部过河时完成问题五.模型的符号A 表示起始状态下商仆所在一岸B 表示末状态商仆所在一岸S 表示商仆的对数K 表示船最多的载人数C 渡河时的一侧岸边的商仆数D 小船运载的商仆数量E 第k次渡河是的商仆数量Ak 河岸一边的商人数Bk 河岸一边的仆人数Ck 河岸另一边的商人数Dk 河岸另一边的仆人数六.模型的解(1)利用程序框图来解决过河问题根据题意状态转移必须满足以下规则;(1). Z从1变0或0变1交替进行。
商人过河模型
商人过河模型商人过河摘要本文针对商人安全渡河的问题,采用多步决策的过程建立数学模型,求解得到了在随从没有杀人越货的情况下的渡河方案。
对于本题而言,在3名商人、3名随从、船的最大容量为2的情况下,首先定义了渡河前此岸的状态,并设安全渡河条件下的状态集定义为允许状态集合,接着得到渡河方案的允许决策集合,然后得到状态随渡河方案变化的规律,最后利用平面坐标分析法,并利用计算机进行了仿真,得到了一种商人安全渡河的方案。
但是,本文不仅仅是为了拼凑出一个可行方案,而是希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。
基于此目的,利用图解法和算法,得到最短路径的最优解。
但同时由于该算法遍历计算的节点很多,所以效率低,而且当有多个最短距离时,不能够将所有符合条件的情况逐一列出。
最后,从这类问题解得趣味性、合理性进行了深入讨论,得到了“传教士与野蛮人渡河”,“印度夫妻渡河”等问题通用的模型,并将其进行了推广。
这也是本文的一大特色。
关键词渡河问题状态集合决策集合平面坐标图解法算法一、问题提出问题: 三名商人各带一个随从过河,一只小船只能容纳两个人,随从们约定,只要在河的任何一岸,一旦随从人数多于商人人数就杀人越货,但是商人们知道了他们的约定,并且如何过河的大权掌握在商人们手中,商人们该采取怎样的策略才能安全过河呢?二、问题分析这个问题已经理想化了,所以我们无需对模型进行假设,该问题可以看作一个多步决策问题。
每一步,船由此岸划到彼岸或者由彼岸划回此岸,都要对船上的人员进行决策(此次渡河船上可以有几名商人和几名随从),在保证安全(两岸的随从都不比商人多)的前提下,在有限次的决策中使得所有人都到对岸去。
因此,我们要做的就是要确定每一步的决策,达到渡河的目标。
三、模型假设与建立记第次过河前此岸的商人数为k x , 随从数为k y ,1,2,,k m =,,0,1,2,3k k x y =定义状态:将二维向量(,)k k k S x y =定义为状态,将安全渡河状态下的状态集合定义为允许状态集合, 记为{},y |0,3; y 0, 1, 2, 31;y 0, 12;y 0, 1,2S x x x x =======()或或记第 次渡河船上的商人数为 k u ,随从数为k v .定义决策:将二维向量(,)k k k d u v = 定义为决策;允许决策集合 记作:{}(,)|+1,2D u v u v ==因为小船容量为2,所以船上人员不能超过2,而且至少要有一个人划船,由此得到上式。
数学建模 商人过河
数学建模课程作业论文题目:对商人过河问题的研究指导教师:黄光辉小组成员:黄志宇(20156260)车辆工程04班牛凯春(20151927)电气工程05班文逸楚(20150382)工商管理02班一、问题重述3名商人带3名随从乘一条小船过河,小船每次只能承载至多两人。
随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。
乘船渡河的方案由商人决定,商人们如何才能安全渡河呢?二、问题分析本题针对商人们能否安全过河问题,需要选择一种合理的过河方案。
对该问题可视为一个多步决策模型,通过对每一次过河的方案的筛选优化,最终得到商人们全部安全过到河对岸的最优决策方案。
对于每一次的过河过程都看成一个随机决策状态量,商人们能够安全到达彼岸或此岸我们可以看成目标决策允许的状态量,通过对允许的状态量的层层筛选,从而得到过河的目标。
三、模型假设1.过河途中不会出现不可抗力的自然因素。
2.当随从人数大于商人数时,随从们不会改变杀人的计划。
3.船的质量很好,在多次满载的情况下也能正常运作。
4.随从会听从商人的调度,所有人都到达河对岸。
四、符号说明第k次渡河前此岸的商人数第k次渡河前此岸的随从数过程的状态向量允许状态集合第k次渡船上的商人数第k次渡船上的随从数决策向量允许决策集合x y 3322110s 1s n +1d 1d 11五、模型建立本题为多步决策模型,每一次过河都是状态量的转移过程。
用二维向量表示过程的状态,其中分别表示对应时刻此岸的商人,仆人数以及船的行进方向,其中则允许状态集合:=又将二维向量定义为决策,则允许的决策合集为:因为k 为奇数时船从此岸驶向彼岸,k 为偶数时船从彼岸驶向此岸,所以状态随决策的变化规律是该式称为状态转移律。
求决策,使,并按照转移律,由经过有限步n 到达状态六、模型求解本模型使用MATLAB 软件编程,通过穷举法获得决策方案如下(完整matlab 程序详见附录):初始状态:可用图片表示为:X0=33状态为:S =3132303111220203010200决策为:D =0201020120112001020102七、模型推广该商人和随从过河模型可以完美解决此类商人过河的决策问题,并且该模型还可推广至解决m个商人和n个随从过河,以及小船的最大载重人数改变时的问题,只需适当地改变相关的语句即可轻松实现模型的转换。
数学建模:研究商人过河问题
数学建模试验一陈述 【1 】试验标题:研讨商人过河问题一.试验目标:编写一个程序(可所以C,C++或Mathlab )实现商人安然过河问题.二.试验情形:Turbo c 2.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第三步:模子求解.#include "stdio.h"#include "string.h"#include <memory>#include <stdlib.h>#include <iostream>using namespace std;#include "conio.h"FILE *fp;/*设立文件指针,以便将它用于其他函数中*/struct a{long m,s;struct a *next;};/*数组类型a :记载各类情形下船上的商人和家丁数,m :代表商人数 s :代表家丁数*/ struct a *jj,head;/*head 为头指针的链表单元(船上的人数的各类情形的链表)*/ int n,total=0,js=0;/*total 暗示船上各类情形总数*/struct aim {long m1,s1,m2,s2;int n;struct aim *back,*next;};/*用于树立双向的指针链表,记入相符的情形,m1,s1暗示要过岸的商人数和家丁数;m2,s2暗示过岸了的商人数和家丁数,n暗示往返的次数*/ int k1,k2;void freeit(struct aim *p){struct aim *p1=p;p1=p->back;free(p);if(p1!=NULL)p1->next=NULL;return;}/*释放该单元格,并将其上的单元格的next指针还原*/int determ(struct aim *p){ struct aim *p1=p;if(p->s1>k2)return -1;/*家丁数不克不及超出总家丁数*/if(p->m1>k1)return -1;/*商人数不克不及超出总商人数*/if(p->s2>k2)return -1;/*对岸,同上*/if(p->m2>k1)return -1;/*对岸,同上*/if(p->s1<0)return -1;/*家丁数不克不及为负*/if(p->s2<0)return -1;/*商人数不克不及为负*/if(p->m1<0)return -1;/*对岸,同上*/if(p->m2<0)return -1;/*对岸,同上*/if(p->m1!=0)if(p->s1>p->m1)return -1;if(p->m2!=0)if(p->s2>p->m2)return -1;/*两岸商人数均不克不及小于家丁数*/while(p1!=NULL){p1=p1->back;if(p1!=NULL)if(p1->n%2==p->n%2)if(p1->s1==p->s1)if(p1->s2==p->s2)if(p1->m1==p->m1)if(p1->m2==p->m2)return -1;}/*用于解决反复,算法思惟:即将每次算出的链表单元与以前的比拟较,若反复,则暗示消失轮回*/if(p->s1==0&&p->m1==0)if(p->n%2==0)return 1;else return -1;/*显然假如达到前提就解释ok了*/return 0;}/*断定函数*/int sign(int n){if(n%2==0)return -1;return 1;}/*符号函数*/void copyit(struct aim *p3,struct aim *p){p3->s1=p->s1;p3->s2=p->s2;p3->m1=p->m1;p3->m2=p->m2;p3->n=p->n+1;p3->back=p;p3->next=NULL;}/*复制内容函数,将p中的内容写入p3所指向的链表单元中*/ void print(struct aim *p3){struct aim *p=p3;js++;while(p->back){p=p->back;}printf("\n第%d种办法:\n",js);fprintf(fp,"\n第%d种办法:\n",js);int count=0;while(p){ printf("%ld,%ld::%ld,%ld\t",p->m1,p->s1,p->m2,p->s2); fprintf(fp,"%ld,%ld::%ld,%ld\t",p->m1,p->s1,p->m2,p->s2);p=p->next;count++;}cout<<"一共有"<<count<<"步完成"<<endl;}/*打印函数,将p3所指的内容打印出来*/void trans(struct aim *p){struct aim *p3;/*p3为申请的构造体指针*/struct a *fla;int i,j,f;fla=&head;p3=(struct aim *)malloc(sizeof(struct aim));f=sign(p->n);for(i=0;i<total;i++){copyit(p3,p);p3->s1-=fla->m*f;p3->m1-=fla->s*f;p3->s2+=fla->m*f;p3->m2+=fla->s*f;/*运算进程,即过河进程*/ j=determ(p3);/*断定,j记载断定成果*/if(j==-1){if(i<total-1){continue;}else{freeit(p3);break;}}int count1=0;if(j==1){if(i<total-1){print(p3);count1++;continue;}else{print(p3);freeit(p3);break;}//cout<<cout1<<endl;printf("%d",count1);printf("\n");}if(j==0)trans(p3);}return;}/*转移函数,即将人转移过河*//*n=0*/void main(){ struct aim *p,*p1;int j,a,e,f;struct a *flag;/*flag是用与记载头指针*/FILE*fpt;if((fpt=fopen("c:result.dat","w+"))==0){printf("can't creat it\n");exit(0);}fp=fpt;system("cls");printf("问题描写:三个商人各带一个侍从乘船过河,一只划子只能容纳X人,由他们本身荡舟.三个商人窃听到侍从们谋害,在河的随意率性一岸上,只要侍从的人数比上人多,就杀失落商人.但是若何乘船渡河的决议计划权在商人手里,商人们若何安插渡河筹划确保自身安然?\n");printf("\n");p=(struct aim *)malloc(sizeof(struct aim));p->back=NULL;p->next=NULL;p->s2=0;p->m2=0;p->n=1;/*设立初始头指针*/printf("please input the total of people on the board\n");fprintf(fp,"\n请输入船上的人数\n");scanf("%d",&n);fprintf(fp,"\n%d\n",n);flag=&head;for(e=0;e<=n;e++)for(f=0;f<=n;f++)if(e+f>0&&e+f<=n){ total++;jj=(struct a*)malloc(sizeof(struct a));jj->m=e;jj->s=f;flag->next=jj;jj->next=NULL;flag=jj;}/*********************************/printf("please input the total of merchant and salvent as follow: mechant,salvent;\n"); fprintf(fp,"\nplease input the total of merchant and salvent as follow: mechant,salvent;\n"); scanf("%ld,%ld",&p->m1,&p->s1);fprintf(fp,"\n%ld,%ld\n",p->m1,p->s1);/**********************************/k1=p->m1;k2=p->s1;trans(p);fclose(fpt);getch();}第一步:三个商人,三个侍从的模子求解答案为:运行后的成果为:第1 种筹划:(3,3) 到(0,0).(3,1) 到(0,2).(3,2) 到(0,1).(3,0) 到(0,3).(3,1) 到(0,2).(1,1) 到(2,2).(2,2) 到 (1,1).(0,2) 到 (3,1).(0,3) 到 (3,0).(0,1) 到 (3,2).(0,2) 到 (3,1).(0,0) 到 (3,3)第2 种筹划:(3,3) 到(0,0).(3,1) 到(0,2).(3,2) 到(0,1).(3,0) 到(0,3).(3,1) 到(0,2).(1,1) 到(2,2).(2,2) 到 (1,1).(0,2) 到 (3,1).(0,3) 到 (3,0).(0,1) 到 (3,2).(1,1) 到 (2,2).(0,0) 到 (3,3)第3 种筹划:(3,3) 到(0,0).(2,2) 到(1,1).(3,2) 到(0,1).(3,0) 到(0,3).(3,1) 到(0,2).(1,1) 到(2,2).(2,2) 到 (1,1).(0,2) 到 (3,1).(0,3) 到 (3,0).(0,1) 到 (3,2)(.0,2) 到 (3,1).(0,0) 到 (3,3)第4 种筹划:(3,3) 到(0,0).(2,2) 到(1,1).(3,2) 到(0,1).(3,0) 到(0,3).(3,1) 到(0,2).(1,1) 到(2,2).(2,2) 到 (1,1).(0,2) 到 (3,1).(0,3) 到 (3,0).(0,1) 到 (3,2).(1,1) 到 (2,2)(0,0) 到 (3,3)第二步:四个商人三个侍从,其成果为:第1种办法:4,3::0,0 3,2::1,1 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第2种办法:4,3::0,0 3,2::1,1 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,22,1::2,2 1,0::3,3 1,1::3,2 0,0::4,3 一共有14步完成第3种办法:4,3::0,0 3,2::1,1 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第4种办法:4,3::0,0 3,2::1,1 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第5种办法:4,3::0,0 3,2::1,1 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第6种办法:4,3::0,0 3,2::1,1 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第7种办法:4,3::0,0 3,2::1,1 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,0::4,3 一共有12步完成第8种办法:4,3::0,0 3,2::1,1 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第9种办法:4,3::0,0 3,2::1,1 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,22,1::2,2 1,0::3,3 1,1::3,2 0,0::4,3 一共有14步完成第10种办法:4,3::0,0 3,2::1,1 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第11种办法:4,3::0,0 3,2::1,1 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第12种办法:4,3::0,0 3,2::1,1 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第13种办法:4,3::0,0 3,2::1,1 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第14种办法:4,3::0,0 3,2::1,1 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,0::4,3 一共有12步完成第15种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第16种办法:2,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,22,1::2,2 1,0::3,3 1,1::3,2 0,0::4,3 一共有14步完成第17种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第18种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第19种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第20种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第21种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,0::4,3 一共有12步完成第22种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 4,2::0,10,3::4,0 0,1::4,2 1,1::3,2 0,0::4,3 一共有14步完成第23种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 4,2::0,14,0::0,3 4,1::0,2 2,1::2,2 2,2::2,1 0,2::4,10,3::4,0 0,1::4,2 2,1::2,2 1,0::3,3 1,1::3,20,0::4,3 一共有16步完成第24种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 4,2::0,14,0::0,3 4,1::0,2 2,1::2,2 2,2::2,1 0,2::4,10,3::4,0 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第25种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 4,2::0,14,0::0,3 4,1::0,2 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 0,1::4,2 1,1::3,2 0,0::4,3 一共有14步完成第26种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 4,2::0,14,0::0,3 4,1::0,2 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第27种办法:4,3::0,0 3,2::1,1 3,3::1,0 2,2::2,1 4,2::0,14,0::0,3 4,1::0,2 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 1,0::3,3 1,1::3,2 0,1::4,2 0,2::4,10,0::4,3 一共有16步完成第28种办法:4,0::0,3 4,1::0,2 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 1,0::3,3 1,1::3,2 0,0::4,3 一共有14步完成第29种办法:4,3::0,0 4,1::0,2 4,2::0,1 3,2::1,1 3,3::1,02,2::2,1 3,2::1,1 2,1::2,2 2,2::2,1 0,2::4,10,3::4,0 0,1::4,2 1,1::3,2 0,0::4,3 一共有14步完成第30种办法:4,3::0,0 4,1::0,2 4,2::0,1 3,2::1,1 3,3::1,02,2::2,1 3,2::1,1 2,1::2,2 2,2::2,1 0,2::4,10,3::4,0 0,1::4,2 2,1::2,2 1,0::3,3 1,1::3,20,0::4,3 一共有16步完成第31种办法:4,3::0,0 4,1::0,2 4,2::0,1 3,2::1,1 3,3::1,02,2::2,1 3,2::1,1 2,1::2,2 2,2::2,1 0,2::4,10,3::4,0 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第32种办法:4,3::0,0 4,1::0,2 4,2::0,1 3,2::1,1 3,3::1,02,2::2,1 3,2::1,1 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 0,1::4,2 1,1::3,2 0,0::4,3 一共有14步完成第33种办法:4,3::0,0 4,1::0,2 4,2::0,1 3,2::1,1 3,3::1,02,2::2,1 3,2::1,1 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第34种办法:2,2::2,1 3,2::1,1 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 1,0::3,3 1,1::3,2 0,1::4,2 0,2::4,10,0::4,3 一共有16步完成第35种办法:4,3::0,0 4,1::0,2 4,2::0,1 3,2::1,1 3,3::1,02,2::2,1 3,2::1,1 2,1::2,2 2,2::2,1 1,1::3,22,1::2,2 1,0::3,3 1,1::3,2 0,0::4,3 一共有14步完成第36种办法:4,3::0,0 4,1::0,2 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第37种办法:4,3::0,0 4,1::0,2 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,22,1::2,2 1,0::3,3 1,1::3,2 0,0::4,3 一共有14步完成第38种办法:4,3::0,0 4,1::0,2 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第39种办法:4,3::0,0 4,1::0,2 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第40种办法:2,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第41种办法:4,3::0,0 4,1::0,2 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第42种办法:4,3::0,0 4,1::0,2 4,2::0,1 2,2::2,1 3,2::1,12,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,0::4,3 一共有12步完成第43种办法:4,3::0,0 4,1::0,2 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,21,1::3,2 0,0::4,3 一共有12步完成第44种办法:4,3::0,0 4,1::0,2 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,22,1::2,2 1,0::3,3 1,1::3,2 0,0::4,3 一共有14步完成第45种办法:4,3::0,0 4,1::0,2 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 0,2::4,1 0,3::4,0 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第46种办法:4,3::0,0 4,1::0,2 4,2::0,1 4,0::0,3 4,1::0,21,1::3,2 0,0::4,3 一共有12步完成第47种办法:4,3::0,0 4,1::0,2 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 0,1::4,20,2::4,1 0,0::4,3 一共有12步完成第48种办法:4,3::0,0 4,1::0,2 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,1::4,2 0,2::4,1 0,0::4,3 一共有14步完成第49种办法:4,3::0,0 4,1::0,2 4,2::0,1 4,0::0,3 4,1::0,22,1::2,2 2,2::2,1 1,1::3,2 2,1::2,2 1,0::3,31,1::3,2 0,0::4,3 一共有12步完成。
数学建模作业(商人过河问题)
数学建模作业(四)——商人过河问题一.问题描述有四名商人各带一名仆人过河,但船最多能载二人,商人已获得仆人的阴谋:在河的任一岸,只要仆人数超过商人数,仆人会将商人杀死并窃取财物且安排如何乘船的权力掌握在商人手中。
试为商人制定一个安全过河的方案。
二.解决方案用递归的源程序如下:开始时商人,强盗所在的河的这边设为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();}。
商人过河
商人们怎样安全过河摘要:四名商人各带一名随从乘船渡河,一只小船至多容纳两人,由他们自己制定,随从约定,在河的任一岸,一旦随从的人数比商人多,就杀了越货。
但是如何乘船渡河的大权掌握在商人们手中,另外,当船的的容量增大为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,…}状态因决策而改变~状态转移律四、模型分析针对商人们能否安全过河问题,需要选择一种合理的过河方案,对该问题可将看为一个多步决策模型,通过对每一次过河的方案的筛选优化,最终得到商人们全部安全过河。
数学建模:研究商人过河问题
数学建模实验一报告实验题目:研究商人过河问题一、实验目的:编写一个程序(可以是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)可得化简得分解(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)时,可以以为完成渡河.因为移动的格数小于等于2,只有中间点(2,2)到(6)点和(8)点的距离为2,所以中间点(2,2)成为渡河的症结点.当我们移动到(2,2)点时,就无法进行下去.故4个商人,4个侍从,船容量为2人时,无法安然渡河. 对于问题二,我们可以树立模子为:k+1k S =S +k k D (-1)(10)'k k x x M+= (11) 'k k y y M += (12)k.k x y ≥(13)''k k x y ≥ (14) u(k), v(k)=0,1,2,3; (15)经由过程相似于问题一的步调可以知道:坐标上的症结点是(3,3),最多可以五名商人带五名侍从曩昔.须要肯定五名商人带五名侍从的筹划可行再肯定六名商人带六名侍从的筹划不成行1.五名商人带五名侍从的情形:(1)起首不成能有三名商人先过河,两名商人一名侍从过河,一名商人两名侍从过河(2)三个侍从先过河(5,2),回来一个侍从(5,3),曩昔两个侍从(5,1)回来一个侍从(5,2),再曩昔三个商人(2,2),回来一个商人一个侍从(3,3),再曩昔三个商人(0,3),回来一个侍从(0,4),曩昔三个侍从(0,1),回来一个侍从(0,2)再曩昔两个侍从(0,0)综上可知:五名商人带五名侍从,划子可以载三小我可以过河 2.六名商人带六名侍从的情形:(1)起首不成能有三名商人先过河,两名商人一名侍从过河,一名商人两名侍从过河(2)三个侍从先过河(6,3),回来一个侍从(6,4),曩昔两个侍从(6,2)回来一个侍从(6,3),曩昔三个商人(3,3),此时两岸都是(3,3),由坐标法剖析知,这是最接近终点的临界点,但是假如回来的时刻必定是回来一个商人和一个侍从,假如这一步可行,后面就进行不去综上所述,六个商人带六个侍从,划子载三小我的情形下不克不及渡河联合 1.2知,当划子最多载三小我的时刻,最多五名商人各带一个侍从可以过河.五、模子的磨练与评价由少数人的过河问题推广到了更多半人的过河问题,使得问题变得清楚明了有纪律.六、参考文献[1]章胤,2014年燕山大学全国大学生数学建模比赛培训ppt,2014年4月17日。
商人渡河问题的有解性分析
商人渡河问题的有解性分析
商人渡河问题是一个传统的组合优化问题,它的出现非常有趣,令人瞩目。
商人渡河问题介绍了一个商人需要运输他的货物从一个地方到另一个地方,在这条旅途中他需要渡河。
商人拥有一艘小船,由于它的容量有限,只能分开运送,但它无法运送所有的货物,这个原因,他只好选择一些货物来渡河,而剩下的部分会有一端被留下。
商人渡河问题必须解决的是,商人怎样有效地把所有的货物运送到目的地。
商人渡河问题有解性取决于具体的商人设置的情况。
理论上,对于任何一个给定的商人设置条件,都应该有一个可行的解决方案使得商人能够成功地把货物运送到目的地。
一般来说,为了确保存在一组可行解,商人渡河问题有解性条件就是“不能够有三位商人或以上一起乘船”,“狼不能够单独船乘陆”,“羊不能够单独船乘陆”,“家长不能够离开他们的孩子”和“船不能够空投着划”,只有满足这些条件才能保证可行解的存在。
除此之外,基本的图算法也可以用来解商人渡河问题,如果问题复杂度较小,它是一种很好的算法。
此外,还有其他一些更加复杂的算法,如模型驱动的算法,如遗传算法,这些算法被用来对比测试复杂问题,查看它是否具有可行解决方案。
总的来说,商人渡河问题的可解性取决于具体的商人设置,一般来说,为了确保可行解的存在,商人渡河问题被限制在一定的条件之下,如果条件被满足,商人渡河问题有解性,如果复杂度较小,基本的图算法可以用来解决这个问题,如果复杂度较高,可以使用更加复杂的算法来寻找可行的解决方案。
商人过河问题数学建模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语言程序,我们可以实现商人过河问题的数学建模。
n-m-k商人渡河问题解的存在性及算法实现
n-m-k商人渡河问题解的存在性及算法实现付艳玲;刘高峰;张伟【摘要】We extend the businessmen-crossing-river problem into the most general case,i.e.the n-m-k businessmen-crossing-river problem,and establish the multi-step-decision mathematical model for this problem.Firstly,a state space tree corresponding to this mathematical model is created and an algorithm for traversing the state space tree by recursion and backtracking methods is designed.Secondly,the analysis of algorithm complexity is evaluated based on experimental results.Finally,the existence of solution for this problem is analyzed,and some theorems and proofs are introduced.The obtained results are potentially beneficial to some real life problems.%本文将商人渡河问题推广到最一般情况,即n-m-k商人渡河问题,建立了该问题的多步决策数学模型.首先,根据该数学模型得到一棵状态空间树,设计了采用递归和回溯方法遍历该状态空间树的算法步骤.其次,根据部分运行结果,分析了该问题的算法复杂度.最后,分析了该问题解的存在性,并给出了若干定理及其证明.本文已将商人渡河问题扩展成为广泛的经典例子,有利于解决实际生活中的问题.【期刊名称】《工程数学学报》【年(卷),期】2013(030)004【总页数】8页(P561-568)【关键词】商人渡河问题;算法实现;解的存在性【作者】付艳玲;刘高峰;张伟【作者单位】河南财政税务高等专科学校信息工程系,郑州451464;西安电子科技大学雷达信号处理国家重点实验室,西安710071;河南理工大学万方科技学院,郑州451400【正文语种】中文【中图分类】O2441 引言渡河问题[1,2]始于公元8世纪,至今它仍是一个逻辑难题.这个问题指的是:有不同的对象或生物,他们其中一些相互不共存,逐步地让一小群体从河的一岸到另一岸,经过有限步后,该群体全部从一岸达到另一岸,并且要求没有任何损失.渡河问题有不同的版本,如传教士和食人族难题,猜疑的丈夫问题,人狼羊菜问题,商人和随从渡河问题等,但是解决方法是类似的.商人和随从渡河问题通常指三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行.随从们秘约:在河的任一岸,一旦随从的人数比商人多,就杀人越货.乘船渡河的大权掌握在商人们手中[3,4],商人们需要安排合理的渡河方案,以确保安全渡河.这类问题常作为数理逻辑、数学建模、图论以及算法设计的经典例子[5-8].到目前为止,n个商人n个随从船满载k人的渡河问题[1](以下简称n−n−k商人渡河问题)的程序实现虽已给出了,但n−n−k商人渡河问题解的存在性问题还不存在相关的结论.针对上面的情况,本文将渡河问题推广到最一般的情况,给出了n个商人m个随从船满载k人的渡河问题(以下简称n−m−k商人渡河问题)程序实现的方法,最后详细讨论了n−m−k商人渡河问题解的存在性问题并对相关结论进行了严格的证明.2 n−m−k商人渡河问题的数学模型本文考虑的商人渡河问题是最一般的情况,即n个商人与m个随从渡河,其中n≥m,渡河的小船至多可以容纳k人,并且n,m,k的取值互不影响.游戏的规则是在岸边一旦随从的人数比商人多,就杀人越货.针对这个问题,建立多步决策模型,其具体建模过程如下:本文把商人渡河问题视为一个多步决策过程,每一步(即船由此岸驶向彼岸或彼岸驶向此岸)都要对船上的人员作出决策(即决定船载几个商人与几个随从),在保证安全的前提下(即在两岸都不会发生杀人越货),经过有限步后使人员全部过河.用状态变量表示此岸的人员状况,决策变量表示船上的人员状况,可以找出状态随决策变化的规律,这样商人渡河问题就转化为在状态允许的变化范围内(即满足安全渡河的条件下)确定每一步的决策,达到安全渡河的目的.记第i次渡河前此岸的商人数为xi,随从数为yi,xi∈ {0,1,···,n},yi∈ {0,1,···,m}.将二维向量si=(xi,yi)定义为状态.将满足安全渡河条件下的状态集合称为允许状态集合,记为记第i次渡河时船上的商人数为ui,随从数为vi,将二维向量di=(ui,vi)定义为第i 次渡河决策.将所有允许决策(考虑到:小船有容量限制并且在船上商人数同样不得少于随从数)构成的集合称为允许决策集合,记为其中允许决策集合D的元素个数当i为奇数时,船从此岸驶向彼岸.当i为偶数时,船从彼岸驶向此岸,所以状态si随决策dj变化的规律是称这个规律为状态转移律.于是,确定安全渡河方案就归结为如下的多步决策问题:求每一步渡河的决策dj∈D,使得状态si∈S按照状态转移律由初始状态s1=(n,m),经有限步到达状态(0,0).至此,我们已经把n−m−k商人渡河问题用数学模型描述出来了.3 n−m−k商人渡河问题的算法求解3.1 算法思想n−m−k商人渡河问题的算法基本思想是:通过遍历状态空间树来搜索可行的渡河方案.在搜索过程中,用到了回溯法和剪枝法,针对渡河期间的某一步,当从允许决策集合S中选取所有决策方案都不能安全渡河时,说明这一步往下渡河是行不通的,那么这一步下面的状态空间树就不用搜索了(即剪枝),并且要求回溯到这一步的上一步,重新选择渡河决策.在搜索的过程中当此岸的商人和随从数一旦为0和0,表示已经找到了一个可行解,就输出这种渡河方案,然后继续搜索状态空间树的剩余部分,直至状态空间树被搜索完为止.这种算法思想可以求解出所有的渡河方案.n−m−k商人渡河问题状态空间树的每一个支点的分支数目与k有直接的联系,因为直接决定每一步渡河时的决策,即决定允许决策集合D,例如k=2时,可选的渡河决策就有5个,它们分别为(1,1),(2,0),(0,2),(1,0),(0,1).这样状态空间树就形如图1样子.因为渡河中的每一个状态往下有5种决策进行选择,所以状态空间树的每一支点有5个分支.图1 :状态空间树其次n−m−k商人渡河问题的关键问题是在当前此岸状态下怎样合理地选择允许决策集合D中的决策.设此岸的当前状态为si=(xi,yi),决策dj=(uj,vj)∈D,下一步此岸的状态si+1=si+(−1)idj.合理地选择允许决策集合D中的决策应满足的条件是:1) 满足渡河的规则:对此岸而言要求要么xi+1=0,要么xi+1̸=0,并且xi+1≥yi+1.对彼岸而言,要么n−xi+1=0,要么n−xi+1̸=0,并且n−xi+1≥m−yi+1;2) 不可重复性:如果当前是第i次渡河,那么下一步的状态si+1不能与前面的同奇偶次渡河后的状态相同.比如,前面第3次渡河后此岸状态为(1,1),后面第9次渡河后的此岸状态仍为(1,1),这就出现了重复,也就是说第9次渡河时选择的渡河决策是错误的,因为它出现了重复.不可重复性用来避免程序进行递归调用时出现无穷递归,或者说在遍历状态空间树时,避免了状态空间树的层数出现无穷大.3.2 算法描述n−m−k商人渡河问题的算法描述如下(采用了递归算法):算法的主体是:递归调用渡河子函数f(si,i,V),其中参数si表示当前准备渡河时此岸的商人与随从数,参数i表示当前状态是第几步状态,V表示从最开始到目前为止渡河过程中此岸所经历状态的集合.1) 初始化数据.设定商人数n,随从数m,船满载量k,允许决策集合D,允许状态集S,状态变量i=0,此岸初始状态si=(n,m),彼岸状态sp=(0,0),V={s0};2) 调用渡河子函数f(si,i,V).渡河子函数f(si,i,V)的执行步骤如下:设当前还没有渡河时的此岸人数为si,当前是第i步状态设j=1;(a) 若j>|D|,则结束当前的渡河子函数f(si,i,V)运行;若j≤|D|,则从允许决策集合D中选择允许决策向量dj;(b) 利用状态转移律计算si+1=si+(−1)idj;(c) 判断si+1和(n,m)−si+1是否在允许状态集S中,si+1是否与前面的状态不重复.如果都满足条件,则执行(d);如果存在一个条件不成立,则j=j+1,转到(a);(d) 将si+1添加到记录V中的第i+1位置,判断si+1=sp是否成立,如果成立,则说明找到了一种渡河方案,输出渡河方案(记录V中从1到i+1的元素);若不成立,则递归调用渡河子函数f(si+1,i+1,V);3) 第2)步结束以后,若有输出,则说明渡河问题有解,并且输出的解是渡河问题的所有可行解;若没有输出,则说明渡河问题无解.3.3 n−m−k商人渡河问题的算法复杂度分析n−m−k商人渡河问题的算法建立在状态空间树图1上.该算法的复杂度取决于算法在状态空间树上搜索时所遍历的树枝个数.算法在当前节点往下层搜索的树枝个数取决于当前的此岸与彼岸状态以及船满载人数.另外为了不让算法的状态出现重复情况,往下层搜索的树枝个数同样取决于以往所有出现的状态,所以该算法所搜索的状态空间树的树枝个数很难用一个解析式来表达,但我们可以分析出本文的n−m−k商人渡河问题是一个NP难问题.因为船满载人数k决定状态空间树节点的分支数目,公式为随着k的增加,状态空间树每个节点的分支数目为以k2数量级增加,另外随着n,m或k的增加,状态空间树的层数也会增加,于是算法所遍历的状态空间树枝个数会以指数复杂度形式增加.为了方便显示遍历树枝个数增长的情况,图2至图4的纵坐标采用了自然对数ln(·).在图2中,横坐标表示商人数(其中商人数=随从数,船满载人数固定为4人),纵坐标表示遍历树枝个数的自然对数,图2的曲线接近于一条斜率较小的直线,又因为纵坐标采取了自然对数的运算,这说明遍历树枝个数随着商人数(其中商人数=随从数,船满载人数固定为4人)的增加是成指数形式增加的.在图3中,横坐标表示商人数(其中商人数=随从数=船满载人数),纵坐标表示遍历树枝个数的自然对数,同样说明了遍历树枝个数随着商人数(其中商人数=随从数=船满载人数)的增加是成指数形式增加的.又因为图3的斜率略大于图2的斜率,所以在图3中遍历树枝个数随着商人数的增加而增长地更加剧烈.图2 : 当船满载人数为4时,遍历的树枝个数与商人数的关系(商人数=随从数)图3 : 人数与遍历树枝个数的关系(其中人数=商人数=随从数=船满载人数)图4 :船满载人数与遍历树枝个数的关系,其中商人数=随从数=4另外,当商人数n与随从数m都固定时,随着船满载人数k的增加,遍历的树枝个数也成指数增长.但当k>n+m后,随着船满载人数的增加,遍历树枝个数不会增长,这是因为此时船每次过河的决策方案与k=n+m时的决策方案相同,不会再随k的增加而变化,状态空间树每一个节点的分枝数目不再变化了.图4验证了上面的分析.当商人数与随从数固定时,即商人数=随从数=4,船满载人数从2到4这一段,遍历树枝个数的自然对数图形为一斜直线,说明在这一段,遍历树枝个数随船满载人数成指数增长.另外,后一段图形基本是一条水平直线,说明当船满载人数≥5时,遍历树枝个数的变化不大,并且定量结果显示:当k=8与9时,遍历的树枝个数是相同的,不再随着k的增加而变化.4 n−m−k商人渡河问题解的存在性根据3.3节的算法复杂度分析,得到n−m−k商人渡河问题在某些情况下解存在性的结论:1) 若k=2,n=m=1,2,3,n−m−k商人渡河问题有解;2) 若k=3,n=m=1,2,3,4,5,n−m−k商人渡河问题有解;3) 若k=2,n=m≥4,n−m−k商人渡河问题无解;4) 若k=3,n=m≥6,n−m−k商人渡河问题无解.下面给出除了上面情况之外的n−m−k商人渡河问题解的存在性定理及其证明.定理1 对任意的k≥2以及任意的n>m,n−m−k商人渡河问题有解.证明首先采用数学归纳法证明:开始时刻此岸为(n,m),彼岸为(0,0),船在此岸,经过有限步渡河后,总可以变成此岸为(n−m,0),彼岸为(m,m),船在此岸.1) 下面推导(n,m)和(0,0)变成(n−1,m−1)和(1,1),如表1.表1 :初时刻状态转移过程状态序号此岸状态彼岸状态商人数随从数商人数随从数1 n m 0 02 n−1 m−1 1 13 n−1 m 1 04 n−2 m−1 2 15 n−1 m−1 1 12) 假设满足定理条件的n−m−k商人渡河问题存在着状态(n−i,m−i)和(i,i),并且船在此岸,下面证明在此状态的基础上可以推导出状态(n−i−1,m−i−1)和(i+1,i+1),船在此岸,如表2.表2 :i时刻状态转移过程状态序号此岸状态彼岸状态商人数随从数商人数随从数x1 n−i m−i i i x2 n−i−1 m−i−1 i+1 i+1 x3 n−i−1 m−i i+1 i x4 n−i−2 m−i−1 i+2 i+1 x5 n−i−1 m−i−1 i+1 i+1综合以上1)和2),并且n>m,由数学归纳法得到开始时刻此岸为(n,m),彼岸为(0,0),船在此岸,经过有限步渡河后,总可以变成此岸为(n−m,0),彼岸为(m,m),船在此岸.设开始状态为:此岸状态为(n−m,0),彼岸状态为(m,m)以及船停在此岸;结束状态为:此岸状态为(0,0),彼岸状态为(n,m),船停在彼岸.下面给出如何从开始状态推导到结束状态.当n−m=1或2时,船直接将余下的商人载过河即可;若n−m>2,只需要重复过程:每次从此岸到彼岸时,船载2个商人.回来时,即从彼岸到此岸,船载1个商人.经过有限步总可以将余下的商人安全渡过河.证毕定理2 对任意的k≥4以及任意的n,m(n≥m),n−m−k商人渡河问题有解.证明假设商人数n大于随从数m,根据定理1,商人渡河问题有解.因此,只需考虑商人数n等于随从数m的情形.当k≥4且n=m时,要求船从此岸到彼岸始终载2个商人和2个随从过河,船从彼岸到此岸始终载1个商人和1个随从过河.交替重复以上过程,这样在任意时刻,两岸始终满足游戏规则,即商人数不会少于随从数,并且一个来回以后,此岸的人数在减少,彼岸人数在增加.当n和m是奇数时,则最后一步从此岸到彼岸,船载1个商人和1个随从过河,就可以载完所有的人;当n和m是偶数时,则最后一步从此岸到彼岸,船载2个商人和2个随从,就可以载完所有的人.证毕参考文献:[1]储理才.用Mathematica求解商人渡河问题[J].大学数学,2005,21(3):117-122 Chu L ing Mathematica to solve the businessmen-crossing-river problem[J].College Mathematics,2005,21(3):117-122[2]Ascher M.A river-crossing problem in cross-culturalperspective[J].Mathematics Magazine,1990,63(1):26-29[3]李天瑞.安全渡河问题的计算机求解和模拟[J].工科数学,1999,15(1):119-123 Li T R.Safe crossing river problem solving by computer andsimulation[J].Journal of Mathematics for Technology,1999,15(1):119-123 [4]王家华,王湘波.安全渡河问题的图解新法[J].西安石油大学学报(自然科学版),2007,22(4):103-105 Wang J H,Wang X B.A new graphic method for safe crossing river problem[J].Journal of Xi’an Shiyou Unive rsity(Natural Science Edition),2007,22(4):103-105[5]Lampis M,Mitsou V.Generalizing Alcuin’s river crossingproblem[C]//11th Panhellenic Conference in Informatics,2007:617-626 [6]Garey M R,Johnson D puters and Intractability:a Guide to the Theory of NP-completeness[M].New York:Freeman Company Press,1979 [7]Wells D G.The Penguin Book of Curious and InterestingPuzzles[M].London:Penguin Books,1992[8]Kraitchik M.Mathematical Recreations[M].New York:DoverPublications,1953。
商人们怎样安全过河的数学模型
商人们怎样安全过河的数学模型示例文章篇一:话说啊,商人们遇到了一个棘手的问题:他们得带着随从们一起过河,但随从们可不是省油的灯,一有机会就想着害商人抢货。
这河又不宽不窄,一只小船每次只能载两个人,怎么过河才能确保安全呢?咱们来聊聊这个问题吧。
首先,商人们得明白,随从们人多势众,要是他们比商人多了,那可就危险了。
所以,商人们得想个法子,让随从们没法儿耍花招。
其实啊,这个问题可以变成一个数学模型。
想象一下,我们把每次过河的人都看成是一个状态,就像打游戏一样,每过一次河就是进入了一个新的关卡。
在这个关卡里,商人们得保证自己的人数不能少于随从们。
那具体怎么做呢?咱们得先设定一些规则。
比如说,每次过河的人数只能是两个,这是小船的容量决定的。
然后,商人们得选择让哪些人过河,这就得靠他们的智慧和策略了。
想象一下这个场景:商人们先让两个随从过河,然后一个商人再带一个随从回来。
这样,河对岸的随从人数虽然多了,但商人这边还有足够的人手可以应对。
接下来,两个商人再过河,这样河对岸的商人数就比随从数多了,安全就得到了保障。
然后,再让一个商人带一个随从回来,这样河这边也有足够的商人保护随从不敢造次。
最后,两个随从再过河,问题就解决了。
这个数学模型虽然简单,但却非常实用。
它告诉我们,在面对困难和挑战时,只要我们善于运用智慧和策略,就一定能够找到解决问题的方法。
所以,商人们要想安全过河,就得靠他们的智慧和勇气了。
示例文章篇二:话说啊,有这么一个古老的谜题,叫做“商人过河”。
话说有三名聪明的商人,他们各自带着一个狡猾的随从,准备乘船过河。
这船啊,一次只能载两个人,问题就在于,这些随从们心里都有个小九九,他们密谋着,只要到了河的对岸,随从人数多于商人人数,就立马动手抢货。
这商人们也不是吃素的,他们知道随从们的阴谋,但他们毕竟都是聪明人,于是就想出了一个绝妙的策略。
咱们来想想啊,这过河其实就是一个多步决策的过程。
每次渡河,船上的人员选择都至关重要。
商人过河问题数学建模
作业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)可得化简得综合(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)时,可以认为完成渡河. 因为移动的格数小于等于2,只有中心点(2,2)到(6)点和(8)点的间隔为2,所以中心点(2,2)成为渡河的关键点.当我们移动到(2,2)点时,就无法停止下去.故4个商人,4个随从,船容量为2人时,无法平安渡河. 关于问题二,我们可以树立模型为:k+1k S =S +k k D (-1)(10)'k k x x M+= (11) 'k k y y M += (12)k.k x y ≥(13)''k k x y ≥ (14) u(k), v(k)=0,1,2,3; (15)通过相似于问题一的步伐可以知道:坐标上的关键点是(3,3),最多可以五名商人带五名随从过来.需要确定五名商人带五名随从的方案可行再确定六名商人带六名随从的方案不成行1、五名商人带五名随从的情况:(1)首先不成能有三名商人先过河,两名商人一名随从过河,一名商人两名随从过河(2)三个随从先过河(5,2),回来一个随从(5,3),过来两个随从(5,1)回来一个随从(5,2),再过来三个商人(2,2),回来一个商人一个随从(3,3),再过来三个商人(0,3),回来一个随从(0,4),过来三个随从(0,1),回来一个随从(0,2)再过来两个随从(0,0)综上可知:五名商人带五名随从,小船可以载三团体可以过河2、六名商人带六名随从的情况:(1)首先不成能有三名商人先过河,两名商人一名随从过河,一名商人两名随从过河(2)三个随从先过河(6,3),回来一个随从(6,4),过来两个随从(6,2)回来一个随从(6,3),过来三个商人(3,3),此时两岸都是(3,3),由坐标法剖析知,这是最接近终点的临界点,然则如果回来的时候一定是回来一个商人和一个随从,如果这一步可行,前面就停止不去综上所述,六个商人带六个随从,小船载三团体的情况下不能渡河结合1、2知,当小船最多载三团体的时候,最多五名商人各带一个随从可以过河.五、模型的检验与评价由少数人的过河问题推广到了更少数人的过河问题,使得问题变得明了有规律.六、参考文献[1]章胤,2014年燕山年夜学全国年夜学生数学建模竞赛培训ppt,2014年4月17日。
商人随从过河
数学建模作业题目:商人随从过河队员:姓名:***姓名:***姓名:王*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 次渡船上的仆人数。
数学建模商人过河__论文
组长:王鹏道110714组员:任利伟110713、孙祎110706小组成员负责情况:王鹏道:选择论文题目、设计论文版面字体、分配成员任务、总结任利伟:一、问题提出、关键、分析。
二、模型假设、三、模型建立孙祎:四、模型求解、五、模型的检验、拓展及延伸2014年11月24日摘要为了求解3个商人与3个随从的过河问题,用数学分析方法,建立数学模型,并且加以求解,展示动态规划思想的应用步骤。
最后利用计算机蝙程进行求解,获得过河问题的完整求解过程;有效地求解类似多步决策问题的作用。
关键词:多步决策计算机求解状态转移律图解法一、问题的提出随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货,但就是乘船渡河的方案由商人决定、商人们怎样才能安全过河?二、问题的关键解决的关键集中在商人与随从的数量上,以及小船的容量上,该问题就就是考虑过河步骤的安排与数量上。
各个步骤对应的状态及决策的表示法也就是关键。
三、问题的分析在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。
由于船上人数限制,这需要多步决策过程,必须考虑每一步船上的人员。
动态规划法正就是求解多步决策的有效方法。
它要求把解的问题一层一层地分解成一级一级、规模逐步缩小的子问题。
直到可以直接求出其解的子问题为止。
分解成所有子问题按层次关系构成一棵子问题树.树根就是原问题。
原问题的解依赖于子问题树中所有子问题的解。
四、模型假设记第k 次过河前A 岸的商人数为X K ,随从数为Y K k=1,2,⋯X K ,Y K =0,1,2,3,将二维向量S K =(X K ,Y K )定义为状态.把满足安全渡河条件下的状态集合称为允许状态集合。
记作S 。
则S={(X K ,Y K )|(X K =0,Y K =0,1,2,3),(X K =3,Y K =0,1,2,3),(X K =Y K =1)(X K =Y K =2)} 记第k 次过河船上的商人数为U K随从数为V K将二维向量D K =(U K ,V K )定义为决策.由小船的容量可知允许决策集合(记作D)为D={(U K ,V K )|U K +V K =l,2}={(O,1);(O,2);(1,O);(1,1);(2,O)}五、 模型建立:动态规划法正就是求解多步决策的有效方法。
数学建模论文
数学建模论文题目:13对商仆过河问题姓名:班级:学号:日期:题目:13对商仆过河问题13对商人过河摘要本文针对商人安全渡河的问题,采用多步决策的过程建立数学模型,求解得到了在仆人没有杀人越货的情况下的渡河方案。
对于本题而言,在13对商仆、船的最大容量为2的情况下,首先定义了渡河前此岸的状态,并设安全渡河条件下的状态集定义为允许状态集合,接着得到渡河方案的允许决策集合,然后得到状态随渡河方案变化的规律,最后利用 dijkstra 算法,并利用Microsoft Visual C++ 6.0软件,编译运行程序得到了一种商仆安全渡河的方案。
但是,本文不仅仅是为了拼凑出一个可行方案,而是希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。
基于此目的,利用了dijkstra算法,得到最短路径的最优解。
但同时由于该算法遍历计算的节点很多,所以效率低,而且当有多个最短距离时,不能够将所有符合条件的情况逐一列出。
我们通过对程序的改善,使可以运行比较多的将符合条件的情况列出来。
1 问题重述13对商仆乘船渡河,在河的任意一岸,一旦仆人数多于商人数,商人就有危险.船一次载多少人商人们才可以安全渡河呢?2 问题分析安全渡河问题可以看成一个多步决策过程。
每一步,即船由此岸驶向彼岸或从彼岸驶回此岸,都要对船上的人员(商仆各几人)作出决策,在保证安全的前提下(两岸的商人数都不比仆人数少),在有限步内使人员全部过河。
用状态(变量)表示某一岸的人员状况,决策(变量)表示船上的人员状况,可以找出状态随决策变化的规律。
问题转化为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到渡河的目的。
此类智力问题经过思考,可以拼凑出一个可行方案。
但是,我们现在希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。
3 模型假设及符号说明3.1 模型假设(1)每对商仆都会划船;(2)只有一条船,且船上最多只能乘坐两个人;(3)所有商仆之间没有矛盾,不会出现两人不愿意坐一条船的现象;(4)船在渡河的过程中不受外界环境的影响。
数学模型实验商人过河
《数学模型实验》实验报告姓名:王佳蕾学院:数学与信息科学学院地点:主楼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)。
(二)程序设计(三)运行结果六、结论体会:安全渡河问题可以看成一个多步决策过程。
商人过河的数学模型及编程解决
摘要: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)定义为状态。
基于商人过河游戏的数学建模-最新教育文档
基于商人过河游戏的数学建模1提出问题文献[1]给出一个智力游戏:“三名商人各带一个随从渡河,一只小船只能容纳二人,由他们自己划行。
随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。
但是如何乘船的大权掌握在商人们手中。
商人怎样才能安全渡河呢?”此类智力问题当然可以通过一番思考,拼凑出一个可行的方案来。
文献[1]中通过图解法给出了解答,但是当商人数与随从数发生变化,船能容纳的人数不是二人时,图解法就会变得复杂而难以解决问题。
因此,将上述游戏改为n名商人各带一个随从过河,船每次至多运p个人,至少要有一个人划船,由他们自己划行。
随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。
但是如何乘船的大权掌握在商人们手中。
商人怎样才能安全渡河的问题。
除此之外,考虑了随着船载人数的增多,以及商人与仆人的对数增多到多少时,会影响商人的安全渡河的问题。
2问题分析由于这个虚拟的游戏已经理想化了,所以不必再作假设。
我们希望能找出这类问题的规律性,建立数学模型,并通过计算机编程进行求解。
安全渡河游戏可以看做是一个多步决策过程,分步优化,船由此岸驶向彼岸或由彼岸驶回此岸的每一步,都要对船上的商人和随从做出决策,在保证商人安全的前提下,在有限步内使全部人员过河。
用状态表示某一岸的人员状况,决策表示船上的人员情况,可以找出状态随决策变化的规律。
问题转化为在状态的允许范围内,确定每一步的决策,最后获取一个全局最优方案的决策方案,达到渡河的目标。
除此以外,我们还要找出,随着船载人数的增加,商人与仆人对数达到多少时,会影响到商人不能安全过河。
这里要对船载人数进行限制,因为船载人数过多时,此智力游戏会变得相当复杂,就会失去作为游戏的本来意义。
3模型构成记第k次渡河前此岸的商人数为,随从数为,,,。
将二维向量定义为过程的状态。
安全渡河条件下的状态集合称为允许状态集合,记作S。
当时,;当时,。
记第k次渡船上的商人数为uk,随从数为vk,将二维向量定义为决策。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
组长:王鹏道110714
组员:任利伟110713、孙祎110706
小组成员负责情况:
王鹏道:选择论文题目、设计论文版面字体、分配成员任务、总结任利伟:一、问题提出、关键、分析。
二、模型假设、三、模型建立孙祎:四、模型求解、五、模型的检验、拓展及延伸
2014年11月24日
摘要
为了求解3个商人和3个随从的过河问题,用数学分析方法,建立数学模型,并且加以求解,展示动态规划思想的应用步骤。
最后利用计算机蝙程进行求解,获得过河问题的完整求解过程;有效地求解类似多步决策问题的作用。
关键词:多步决策计算机求解状态转移律图解法
一、 问题的提出
随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货,但是乘船渡河的方案由商人决定.商人们怎样才能安全过河?
二、 问题的关键
解决的关键集中在商人和随从的数量上,以及小船的容量上,该问题就是考虑过河步骤的安排和数量上。
各个步骤对应的状态及决策的表示法也是关键。
三、 问题的分析
在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。
由于船上人数限制,这需要多步决策过程,必须考虑每一步船上的人员。
动态规划法正是求解多步决策的有效方法。
它要求把解的问题一层一层地分解成一级一级、规模逐步缩小的子问题。
直到可以直接求出其解的子问题为止。
分解成所有子问题按层次关系构成一棵子问题树.树根是原问题。
原问题的解依赖于子问题树中所有子问题的解。
四、 模型假设
记第k 次过河前A 岸的商人数为X K ,
随从数为Y K k=1,2,⋯
X K ,Y K =0,1,2,3,将二维向量S K =(X K ,Y K )定义为状态.把满足安全渡河条件下的状态集合称为允许状态集合。
记作S 。
则
S={(X K ,Y K )|(X K =0,Y K =0,1,2,3),(X K =3,Y K =0,1,2,3),(X K =Y K =1)(X K =Y K =2)} 记第k 次过河船上的商人数为U K
随从数为V K
将二维向量D K =(U K ,V K )定义为决策.由小船的容量可知允许决策集合(记作D)为
D={(U K ,V K )|U K +V K =l,2}={(O,1);(O,2);(1,O);(1,1);(2,O)}
五、 模型建立:
动态规划法正是求解多步决策的有效方法。
它要求把解的问题一层一层地分解成一级一级、规模逐步缩小的子问题。
直到可以直接求出其解的子问题为止。
分解成所有子问题按层次关系构成一棵子问题树.树根是原问题。
原问题的解依赖于子问题树中所有子问题的解。
用动态规划法分析三名商人的过河问题。
可得如下的递归树:
(注解:当K为奇数时,船在B岸;当K为偶数时,船在A岸。
)
通过分析该递归树,知道求解关键在于正确地写出基本的状态转移关系式和恰当的边界条件。
因为k为奇数时,船是从A岸驶向B岸,k为偶数时。
船是由B岸驶回A岸。
所以
状态S
K 随决策D
K
变化的规律是
S
K+1
=S
K
+(-1)K D
K
,k=l,2,⋯,
称之为状态转移律,这样,制定过河方案就归结为如下的多步决策问题:每一步,船由A岸驶向B岸或B岸驶回A岸,都要对船上的人员(商人U
K
,随从
V K 各几人)作出决策,在保证安全的前提下即两岸的商人数X
K
都不比随从数Y
K
少,
用有限步使人员全部过河.用状态(变量)S
K 表示某一岸的人员状况,决策(变量)D
K
表示船上的人员状况,可以找出状态S
K 随决策D
K
变化的规律.这样安全过河问题
就转化为:
求决策D
K ∈D(k=1,2,……,n),使得状态S
K
∈S,按照状态转移律,由初始
状态S
1=(3,3),经有限步n到达状态S
K+1
=(O,O)。
S
K+1
=S
K
+(-1)K D
K
,k=l,2,3,其中D
K
∈D={(U
K
,V
K
)|U
K
+V
K
=l,2},{其中S
K
∈
(X
K
,Y
K
)|(X
K
=0,Y
K
=1,2,3);(X
K
=3,Y
K
=0,1,2,3);(X
K
=Y
K
=1,2)},S
n+1
=(0,0) 这就是三个商人的过河问题模型。
六、模型求解:
a)穷举法:先建立编程的基本过程,然后考虑模型,再编写程序
b)然后就可以得出结果了
主程序流程图
c) 图解法:状态s=(x,y) 16个格点 允许状态 10个●点
允许决策 移动1或2格; k 奇,左下移;右下移
总共需要11步
七、模型的检验
用2名商人和2名随从的过河问题的解决思路,检验3名商人和3名随从的过河问题。
八、 模型的拓展和延伸
通过三名商人和三名随从的过河问题的解决方案,可以进一步计算四名商人和四名随从的过河问题,通过计算机编程可以设计m 名商人和n 名随从的过河问题。
这需要用多步决策
n +11
九、总结
这是通过数学分析的方法解决实用问题,经过问题提出、问题假设、问题分析、模型建立、模型求解、模型检验的过程,解决商人过河问题。
然后扩展延伸到n个商人的问题。
学习数学建模以来,重新认识了学习数学的乐趣,也重新认识了数学,本以为数学是单调的,枯燥的,学习了之后,发现数学是普遍存在我们生活之中的。
解决现实中的问题,很多都需要数学。
沉浸在数学的世界里,发现学习是有趣的;相比于机械的认识各个组织器官,建立一个数学模型解决问题是十分有趣的。
参考文献:
(1)傅清祥.《数据结构与算法》.王晓东.北京:电子工业出版社 1998.(2)姜启瑟.《数学建模》(第二版).北京:高等教育出版社,2000.
(3)运筹学教材编写组.《运筹学》(修订版).北京:清华大学出版社。
2001.。