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

合集下载

商人过河问题数学建模

商人过河问题数学建模

做业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日。

11对商仆过河问题数学建模.

11对商仆过河问题数学建模.

数学建模论文商仆过河问题摘要本文针对商人安全渡河的问题,采用多步决策的过程建立数学模型,求解得到了在随从没有杀人越货的情况下的渡河方案。

对于本题而言,在11名商人、11名随从、船的最大容量为6人的情况下,首先定义了渡河前此岸的状态,并设安全渡河条件下的状态集定义为允许状态集合,接着得到渡河方案的允许决策集合,然后得到状态随渡河方案变化的规律,利用matlab 7.0,win 7软件,编译运行程序得到了一种商人安全渡河的方案,并输出了允许的状态向量和允许的决策向量。

但是,本文不仅仅是为了拼凑出一个可行方案,而是希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。

一 .问题的提出当今社会每个人都想当王者,谁都想成为富翁,所以就在这个问题中仆人们也想成为商人。

仆人们密约,在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,十一名商人各带一个随从乘船渡河,一只小船只能容纳六人,由他们自己划行。

在河的任意一岸,一旦随从的人数比商人多,商人就有危险.但是如何乘船渡河的大权掌握在商人们手中。

商人们怎样才能安全渡河呢?同时,推广到M名商人带M名随从又如何?二. 模型假设3 模型假设(1)每个商人和随从都会划船;(2)只有一条船,且每条船上最多只能乘坐六个人;(3)所有商人与随从之间没有矛盾,不会出现有人不愿意同坐一条船的现象;(4)船在渡河的过程中不受外界环境的影响。

三.问题符号说明3符号说明A初始状态下,商人和随从所在的一岸;B初始状态下,商人和随从欲到达的一岸;S 商仆对数K 船最多载人的数目四 .问题分析安全渡河问题可以看成一个多步决策过程。

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

用状态(变量)表示某一岸的人员状况,决策(变量)表示船上的人员状况,可以找出状态随决策变化的规律。

数学建模 商人过河

数学建模 商人过河

数学建模课程作业论文题目:对商人过河问题的研究指导教师:黄光辉小组成员:黄志宇(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个随从过河,以及小船的最大载重人数改变时的问题,只需适当地改变相关的语句即可轻松实现模型的转换。

商人过河模型问题的求解

商人过河模型问题的求解

《数学建模实验》课程考试试题----商人安全过河数学建模与求解一.问题提出: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 】试验标题:研讨商人过河问题一.试验目标:编写一个程序(可所以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步完成。

商人过河的数学模型及编程解决【范本模板】

商人过河的数学模型及编程解决【范本模板】

14对商仆过河问题题目有14名商人各带一名仆人要过河,但船最多能载4人。

商人已获得仆人的阴谋:在河的任意一岸,只要仆人数超过商人数,仆人会将商人杀死并窃取货物。

安排如何乘船的权利权利在商人手上,试为商人制定一个安全的过河方案。

一.摘要n对商仆过河,一只船最多载m人,船上和岸上的仆人数都不能多于商人数,否则商人有危险。

安排合理的渡河方案,保证商人能安全渡河。

(可利用向量,矩阵,图解等方法)。

二.问题提出:有14对商仆乘船过河,一只船最多载4人,由商人和仆人自己划船渡河,在河的任意一岸,一旦仆人数多于商人数,仆人就可将商人杀死,谋取利益,但是乘船渡河的主动权掌握在商人们手中,商人们如何安排渡河方案,才能安全渡河?三.问题分析商仆安全渡河问题可以视为一个多步决策过程,多步决策是指决策过程难以一次完成,而是多步优化,最后获取一个全局最优方案的决策方法。

对于每一步,即船由此岸驶向彼岸,或者船由彼岸驶向此岸的决策,不仅会影响到该过程的效果,而且还会影响到下一步的初始状态,从而对整个过程都会有影响。

所以,在每一次过河时,就不能只从这一次过河本身考虑,还要把它看成是整个过河过程中的一个部分。

在对船上的人员做决策时,要保证两岸的商人数不能少于仆人数,用最少的步伐是人员全部过河.应用状态向量和运载向量,找出状态随运载变化的规律,此问题就转化为状态在允许范围内(即安全渡河条件),确定每一次该如何过河,从而达到渡河的目标。

现在我们都把它们数量化:即用数学语言来表示。

四.模型假设与符号假设(一)模型假设商人和仆人都会划船,天气很好,无大风大浪,船的质量很好,船桨足够很多次的运载商人和仆人。

(二)符号假设设(x,y)是状态向量,表示任一岸的商人和仆人数,且x,y分别要大于等于0,小于等于M。

1.设(m,n)是运载向量,表示运载的商人数和仆人数,0<=m<=N,0<=n<=N,0〈=m+n〈=N。

2.设用s表示所有的可取状态向量的集合。

数学建模案例作业

数学建模案例作业

数学建模案例作业作业1 商人过河问题三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行(六个人都会划船)。

随从们密谋,无论何时,一旦随从的人数比商人多,就杀人越货。

但是如何乘船渡河的决定权掌握在商人手中。

商人们怎样才能安全渡河?示意图如下: 随从:商人: 一、状态变量一次决策),(k k k y x S = 3,2,1=k 表示第k 次渡河时,此岸的商人数,随从数. 最初 )3,3(0=S 且为整数)3,0(≤≤k k y x)}0,0(),1,0(),2,0(),3,0(),0,1(),1,1(),2,1(),3,1(),0,2(),1,2(),2,2(),3,2(),0,3(),1,3(),2,3(),3,3{(=S要安全过河,需保证彼岸此岸都安全,及随从数不能大于商人数,所以安全的情况有10种,即)}0,0(),1,0(),2,0(),3,0(),1,1(),2,2(),0,3(),1,3(),2,3(),3,3{(=S ② 二、决策变量设),(k k k v u d =2,0(≤≤k k v u 且)21≤+≤k k v u 表示第k 次渡河时,船上的商人数和随从数 )}1,0(),0,1(),2,0(),1,1(),0,2{(=D与状态变量相结合,安全的情况有三种,即 )}1,0(),2,0(),1,1{((=D ③ 三、状态转移方程奇数次(此案到彼岸)k k k d S S -=+1 偶数次(彼岸到此案)k k k d S S +=+1 即k k k k d S S )1(1-+=+ ① 数学建模:由①确定的转移方程下,经过n 次决策,将初始状态转移到最终状态)0,0(=n S . 每次的决策取自③式,每次到达的状态在②中. 图解法:①从右上角移到左下角,每次最多移两步;②奇数次渡河往左下方,偶数次渡河往右下方。

建立平面直角坐标系如图:n S 过河方案:从A 点)3,3(0=S 出发到D 点)0,0(=n S 结束① 小船一次最多能载两人,所以每次最多移动两个格子② 由此岸即彼岸时人员减少,即奇数遍时向左下方行走;有彼岸及此岸时人员增加,即偶数遍时向右上方行走。

数学建模 商人过河

数学建模   商人过河

数学建模商人过河(hjh)
问题
随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货.
乘船渡河的方案由商人决定.商人们怎样才能安全过河?
分析问题
(1),数据及其关系?(2)如何存储?(3)过程中数据上的操作?
(4)操作过程中需借助什么结构实现?
解答
(1)数据:河两岸的商人数x∈(0,3)和随从人数y∈(0,3)
关系:线性关系
(2)存储:用二维数组来实现。

(3)操作:前进(过河)、后退(返回)
(4)操作过程中需借助栈结构实现
具体分析
此岸商人数与随从人数为C【x】【y】,彼岸商人数与随从人数为B【3-x】【3-y】,C与B数组中x必须大于等于y。

C与B数组中,各个数组中每相邻两个二维数组|x+y|之差不得超过2。

其中过河途中船上人数用数组A表示A【x1】【y1】,返回途中船上人数A【x2】【y2】。

x1,x2,y1,y2=0,1,2。

x1+y1=1或2;y2+x2=1或2。

从此岸来考察,要从最开始的C【3】【3】变到C【0】【0】。

1,C【3】【3】→C【3】【1】,C【3】【1】→C【3】【2】;
2,C【3】【2】→C【3】【0】,C【3】【0】→C【3】【1】;3,C【3】【1】→C【1】【1】,C【1】【1】→C【2】【2】;4,C【2】【2】→C【0】【2】,C【0】【2】→C【0】【3】;5,C【0】【3】→C【0】【1】,C【0】【1】→C【0】【2】;6,C【0】【2】→C【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第三步:模型求解。

建模作业

建模作业

一、商人过河问题 商人与随从人数增加或小船容量加大;考虑 4 名商人各带一随从的情况。
允许状态点如图红色标记所示,sk+1 = sk + ( − 1) dk 二、飞机加油问题dk = (uk ,vk )
1 1 8 4
8 3 4
5
8
地球为一圆体,现将其平均分为 8 份,如上图所示。 已知每架飞机加满油只能绕地球飞半周,飞机之间可以相互加油。 假设飞机加满油油量为 1。 1、 有三架飞机同时从同一出发点,设飞行方向为逆时针,编号为 1,2,3,编号为 1 的飞 机可以绕地球飞一周。 2、 飞到 1/8 圆处时,三架飞机均消耗油量 1/4,此时,3 号飞机分别给 1,2 号飞机各加 1/4 油,3 号飞机正好剩 1/4 油,可以保证其飞回原点,1,2 号飞机油箱加满。 3、 到 1/4 处,2 号飞机将 1/4 油加给 1 号飞机,2 号飞机剩 1/2 油,恰能飞回原点,此 时 1 号飞机油箱加满。 4、 1 号飞机飞到 1/2 处时, 4 号飞机从原点逆时针方向起飞, 与 1 号飞机在 3/4 处相遇。 4 号飞机加 1/4 油给 1 号飞机,此时 1,4 号飞机均剩油 1/4,此时 5 号飞机从原点沿 逆时针方向起飞,5 号飞机与 1,4 号飞机在 7/8 处相遇,5 号飞机分别给 1,4 号飞机 加 1/4 油,此时 1,4,5 号飞机均有 1/4 油,正好一起飞回原点,保证了 1 号飞机绕地 球飞行一周。

商人过河问题数学建模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、商人渡河数学模型
商人渡河是一类有趣的动态规划问题,其本质是一类路径规划问题,用数学模型可以描述为:
假设有n种物品,体积大小分别为W1,W2,……,Wn,以及一艘能承重V的船,每次船只能装载一些物品,要求在尽可能少的船次内,将物品搬运到对岸。

令Xij表示第i次船运载物品的状态,其中0≤Xij≤1,Xij=1表示船上装有第j个物品,Xij=0表示船上没有第j个物品,那么商人渡河问题就可以用下面的数学模型表示:
目标函数:
(1) Min Z=X11+X12+ (Xi)
约束条件:
(2) W1X11+W2X12+……+WnXin≤V
(3) X11+X12+……+Xin=1
(4) 0≤Xij≤1
其中,约束条件(2)表示第i次船运的负载不超过容量V,约束条件(3)表示每次船运必须装一些物品,约束条件(4)表示每次船运的物品的数量限制在0与1之间。

商人过河案例建模

商人过河案例建模

商人过河设有三名商人,各带一个随从,欲乘一小船渡河,小船只能容纳两人,须由他们自己划行。

随从们密约,在河的任何一岸,一旦随从的人数比商人多,就杀人越货。

而如何乘船渡河的大权掌握在商人们的手中。

商人们怎样才能安全渡河呢?因这已经是一个相当清晰的理想化问题,所以直接讨论其模型描述以及模型求解。

这里将其描述为一个动态决策问题:记第k次渡河前此岸的商人数为,随从数为, k=1,…,n。

将二维向量定义为状态,安全渡河条件下的状态集合称为允许状态集合,记作S, 。

记第k次渡船上的商人数为,随从数为, k=1,…,n。

将二维向量定义为决策。

考虑小船载人数的限制,应满足,而称为允许决策集合。

因为k为奇数时,船从此岸驶向彼岸;k为偶数时,船从彼岸驶回此岸,所以状态随决策的变化规律是(状态转移规律)。

求决策,使状态按照状态转移规律,由初始状态经有限步n到达状态。

接下来讨论模型的求解,设是某个可行的渡河方案所对应的状态序列,若存在某,且同为奇数或同为偶数,满足,则称所对应的渡河方案是可约的。

这时也是某个可行的渡河方案所对应的状态序列。

显然,一个有效的渡河方案应当是不可约的。

设渡河已进行到第k步,为当前的状态,记,,为保证构造的渡河方案不可约,则当前的决策除了应满足:1),且当k为奇数时,,当k为偶数时,;还须满足:2)当k为奇数时,;当k为偶数时,。

通过作图,可以得到两种不可约的渡河方案,如下图:思考题:(1)四名商人各带一名随从的情况(小船同前)。

(2)n名商人各带n名随从的情况(小船同前)。

数学建模—商人们怎样安全过河

数学建模—商人们怎样安全过河

乙至甲
8:09
8:19
8:00 x 8:10
8:20
8:30
X-8:00=0:09 x=8:09
甲至乙
5 一男孩和一女孩分别在离家 2 km 和 1 km 且方 向相反的两所学校上学,每天同时放学后分别 以4 km/h和 2 km/h 的速度步行回家。一小狗以 6 km/h的速度由男孩处奔向女孩,又从女孩处 奔向男孩,如此往返直至回到家中。问小狗奔 波了多少路程?
•一般思维:
36 18 10 4 2 1 18 9 5 2 11 36 2 2 2 22
•逆向思维:
每场比赛淘汰一名失败球队,只有一名冠军,即 就是淘汰了36名球队,因此比赛进行了36场。
3 某人家住T市在他乡工作,每天下班后乘火车于 6时抵达T市车站,它的妻子驾车准时到车站接他 回家。一日他提前下班搭早一班火车于5时半抵达 T市车站,随即步行回家,它的妻子像往常一样驾 车前来,在半路上遇到他接回家时,发现比往常 提前了10分钟。问他步行了多长时间?
河 小船(至多2人)
但是乘船渡河的方案由商人决定.
商人们怎样才能安全过河?
问题分析
多步决策过程
3名商人 3名随从
决策~ 每一步(此岸到彼岸或彼岸到此岸)船上的人员
要求~在安全的前提下(两岸的随从数不比商人多),经有限 步使全体人员过河.
模型构成
xk~第k次渡河前此岸的商人数 yk~第k次渡河前此岸的随从数 sk=(xk , yk)~过程的状态
y
状态s=(x,y) ~ 16个格点
3
允许状态 ~ 10个 点
允许决策 ~ 移动1或2格;
2
s1
d1
k奇,左下移; k偶,右上移.
d1,

数学建模作业_商仆过河

数学建模作业_商仆过河

不难说明,当商仆对数为 4 或 5 时,所需的最小船容量为 3。综上,使问题 有解的商仆对数与船容量之间的关系如下:
表 1 商仆对数与船容量的关系
商仆对数 1、2、3 4、5 ≥6
小船容量 ≥2 ≥3 ≥4
5.模型评价与改进
BFS 算法是最经典也是最简单的图搜索算法之一,对于状态空间规模很大, 但目标状态距离初始状态并不很远的问题有较好的求解能力,且保证求得最优 解。实际使用主流 PC 机测试问题规模为 101 数量级时的求解时间均为 0ms,即 使在 1000 对商仆, 船容量 200 人时的求解时间亦仅为 1592ms,此求解速度是完
6
可行状态
5
4
3
2
1
0
0
1
2
3
4
5
6
图 5
6 对商仆时的状态空间
此时状态中心(3,3)距离边界状态(6,3)的距离为 3,船容量至少为 4 才可
4
避免状态转移沿对角线下行,而船容量为 4 已经是状态转移沿对角线移动的条 件,即当商仆对数大于等于 6 时,船容量至少为 4,问题有解。
图 6 11 对商仆、小船容量为 4 时的求解结果
数学建模作业
班级 姓名
交工 092 班 仙玉印 200900534 李善仕 200900534 姜 璞 200900549
0
摘要
本文将经典的 3 对商仆过河问题推广至商仆对数为任意值、小船容量也为任 意值的一般问题,建立一般化的数学模型,并采用 BFS 算法编程求解,得到了此 问题的一般解法。 本问题实际为一个 NP 的图搜索问题,BFS 算法是经典的图搜索算法,本文 通过对 BFS 算法进行适当改进,合理压缩状态空间,使算法的时间复杂度大幅减 少, 能够在有限的极短时间内求得过河方案,并保证方案所需的船只往返次数为 最少,即求得的方案为最优方案。11 对商仆,船容量为 6 人时的最优方案为: ( 11,11 )->( 11,6 ) ->( 11, 7 ) ->( 6, 6 )->( 7, 7 ) ->( 4, 4 ) ->( 5, 5 ) ->( 2, 2 ) ->( 3, 3 ) ->( 0, 0 ) 括号内数字分别为此岸商人数和此岸仆人数,最少需要行船 9 次。 进一步讨论给出了使商仆过河问题有解的商仆对数与小船容量之间的数量 关系: 商仆对数 1、2、3 4、5 ≥6 小船容量 ≥2 ≥3 ≥4

(完整word版)商人过河问题数学建模

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

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

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

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

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

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

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

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

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

相关文档
最新文档