数学建模研究商人过河问题.docx
《数学建模研究商人过河问题.docx》由会员分享,可在线阅读,更多相关《数学建模研究商人过河问题.docx(17页珍藏版)》请在冰豆网上搜索。
![数学建模研究商人过河问题.docx](https://file1.bdocx.com/fileroot1/2023-7/8/7a7d38f1-4c67-4cf2-9b4b-0d9947aaebaf/7a7d38f1-4c67-4cf2-9b4b-0d9947aaebaf1.gif)
数学建模研究商人过河问题
数学建模试验一陈述【1】
试验标题:
研讨商人过河问题
一.试验目标:
编写一个程序(可所以C,C++或Mathlab)实现商人安然过河问题.
二.试验情形:
Turboc2.0..Matlab6.0以上
三.试验请求:
请求该程序不但能找出一组安然过河的可行筹划,还可以得到所有的安然过河可行筹划.并且该程序具有必定的可扩大性,即不但可以实现3个商人,3个侍从的过河问题.还应能实现
n个商人,n个侍从的过河问题以及n个不合对象且每个对象有m个元素问题(解释:
对于3个商人,3个侍从问题分离对应于n=2,m=3)的过河问题.从而给出课后习题5(n=4,m=1)的全部安然过河筹划.
四.试验步调:
第一步:
问题剖析.这是一个多步决议计划进程,涉及到每一次船上的人员以及要斟酌此岸和此岸上残剩的商人数和侍从数,在安然的前提下(两岸的侍从数不比商人多),经有限步使全部人员过河.
第二步:
剖析模子的组成.记第k次渡河前此岸的商人数为
侍从数为
(具有可扩大性),将
界说为状况,状况聚集成为许可状况聚集(S).S={
}记第k次渡船的商人数为
侍从数为
决议计划为
安然渡河前提下,决议计划的聚集为许可决议计划聚集.许可决议计划聚集记作D,所以D={
|1
随决议计划
变更的纪律是
此式为状况转移律.制订安然渡河筹划归结为如下的多步决议计划模子:
求决议计划
使状况
按照转移律,由初始状况
经有限n步到达
第三步:
模子求解.
#include"stdio.h"
#include"string.h"
#include
#include
#include
usingnamespacestd;
#include"conio.h"
FILE*fp;/*设立文件指针,以便将它用于其他函数中*/
structa{
longm,s;
structa*next;
};/*数组类型a:
记载各类情形下船上的商人和家丁数,m:
代表商人数s:
代表家丁数*/
structa*jj,head;/*head为头指针的链表单元(船上的人数的各类情形的链表)*/
intn,total=0,js=0;/*total暗示船上各类情形总数*/
structaim{
longm1,s1,m2,s2;
intn;
structaim*back,*next;};/*用于树立双向的指针链表,记入相符的情形,m1,s1暗示要过岸的商人数和家丁数;m2,s2暗示过岸了的商人数和家丁数,n暗示往返的次数*/
intk1,k2;
voidfreeit(structaim*p){
structaim*p1=p;
p1=p->back;
free(p);
if(p1!
=NULL)
p1->next=NULL;
return;
}/*释放该单元格,并将其上的单元格的next指针还原*/
intdeterm(structaim*p)
{structaim*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)return1;
elsereturn-1;/*显然假如达到前提就解释ok了*/
return0;}/*断定函数*/
intsign(intn){
if(n%2==0)return-1;
return1;}/*符号函数*/
voidcopyit(structaim*p3,structaim*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->next=p3;
}/*复制内容函数,将p中的内容写入p3所指向的链表单元中*/
voidprint(structaim*p3){
structaim*p=p3;
js++;
while(p->back){p=p->back;}
printf("\n第%d种办法:
\n",js);
fprintf(fp,"\n第%d种办法:
\n",js);
intcount=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<<"一共有"<}/*打印函数,将p3所指的内容打印出来*/
voidtrans(structaim*p){
structaim*p3;/*p3为申请的构造体指针*/
structa*fla;
inti,j,f;
fla=&head;
p3=(structaim*)malloc(sizeof(structaim));
f=sign(p->n);
for(i=0;ifla=fla->next;
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(ielse{
freeit(p3);
break;}}
intcount1=0;
if(j==1){if(icount1++;
continue;}
else{print(p3);
freeit(p3);
break;}
//cout<printf("%d",count1);
printf("\n");
}
if(j==0)trans(p3);
}
return;
}/*转移函数,即将人转移过河*/
/*n=0*/
voidmain()
{structaim*p,*p1;intj,a,e,f;
structa*flag;/*flag是用与记载头指针*/
FILE*fpt;
if((fpt=fopen("c:
result.dat","w+"))==0){
printf("can'tcreatit\n");
exit(0);}
fp=fpt;
system("cls");
printf("问题描写:
三个商人各带一个侍从乘船过河,一只划子只能容纳X人,由他们本身荡舟.三个商人窃听到侍从们谋害,在河的随意率性一岸上,只要侍从的人数比上人多,就杀失落商人.但是若何乘船渡河的决议计划权在商人手里,商人们若何安插渡河筹划确保自身安然?
\n");
printf("\n");
p=(structaim*)malloc(sizeof(structaim));
p->back=NULL;
p->next=NULL;
p->s2=0;
p->m2=0;
p->n=1;/*设立初始头指针*/
printf("pleaseinputthetotalofpeopleontheboard\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=(structa*)malloc(sizeof(structa));
jj->m=e;
jj->s=f;
flag->next=jj;
jj->next=NULL;
flag=jj;
}
/*********************************/
printf("pleaseinputthetotalofmerchantandsalventasfollow:
mechant,salvent;\n");
fprintf(fp,"\npleaseinputthetotalofmerchantandsalventasfollow:
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,03,2:
:
1,14,2:
:
0,12,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
1,1:
:
3,20,0:
:
4,3一共有12步完成
第2种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,12,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
2,1:
:
2,21,0:
:
3,31,1:
:
3,20,0:
:
4,3一共有14步完成
第3种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,12,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
0,2:
:
4,10,0:
:
4,3一共有12步完成
第4种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,12,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,20,1:
:
4,2
1,1:
:
3,20,0:
:
4,3一共有12步完成
第5种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,12,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,20,1:
:
4,2
0,2:
:
4,10,0:
:
4,3一共有12步完成
第6种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,12,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,21,0:
:
3,3
1,1:
:
3,20,1:
:
4,20,2:
:
4,10,0:
:
4,3一共有14步完成
第7种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,12,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,21,0:
:
3,3
1,1:
:
3,20,0:
:
4,3一共有12步完成
第8种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,14,0:
:
0,34,1:
:
0,2
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
1,1:
:
3,20,0:
:
4,3一共有12步完成
第9种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,14,0:
:
0,34,1:
:
0,2
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
2,1:
:
2,21,0:
:
3,31,1:
:
3,20,0:
:
4,3一共有14步完成
第10种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,14,0:
:
0,34,1:
:
0,2
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
0,2:
:
4,10,0:
:
4,3一共有12步完成
第11种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,14,0:
:
0,34,1:
:
0,2
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,20,1:
:
4,2
1,1:
:
3,20,0:
:
4,3一共有12步完成
第12种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,14,0:
:
0,34,1:
:
0,2
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,20,1:
:
4,2
0,2:
:
4,10,0:
:
4,3一共有12步完成
第13种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,14,0:
:
0,34,1:
:
0,2
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,21,0:
:
3,3
1,1:
:
3,20,1:
:
4,20,2:
:
4,10,0:
:
4,3一共有14步完成
第14种办法:
4,3:
:
0,03,2:
:
1,14,2:
:
0,14,0:
:
0,34,1:
:
0,2
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,21,0:
:
3,3
1,1:
:
3,20,0:
:
4,3一共有12步完成
第15种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
1,1:
:
3,20,0:
:
4,3一共有12步完成
第16种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
2,1:
:
2,21,0:
:
3,31,1:
:
3,20,0:
:
4,3一共有14步完成
第17种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,10,2:
:
4,10,3:
:
4,00,1:
:
4,2
0,2:
:
4,10,0:
:
4,3一共有12步完成
第18种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,20,1:
:
4,2
1,1:
:
3,20,0:
:
4,3一共有12步完成
第19种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,20,1:
:
4,2
0,2:
:
4,10,0:
:
4,3一共有12步完成
第20种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,21,0:
:
3,3
1,1:
:
3,20,1:
:
4,20,2:
:
4,10,0:
:
4,3一共有14步完成
第21种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,13,2:
:
1,1
2,1:
:
2,22,2:
:
2,11,1:
:
3,22,1:
:
2,21,0:
:
3,3
1,1:
:
3,20,0:
:
4,3一共有12步完成
第22种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,14,2:
:
0,1
4,0:
:
0,34,1:
:
0,22,1:
:
2,22,2:
:
2,10,2:
:
4,1
0,3:
:
4,00,1:
:
4,21,1:
:
3,20,0:
:
4,3一共有14步完成
第23种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,14,2:
:
0,1
4,0:
:
0,34,1:
:
0,22,1:
:
2,22,2:
:
2,10,2:
:
4,1
0,3:
:
4,00,1:
:
4,22,1:
:
2,21,0:
:
3,31,1:
:
3,2
0,0:
:
4,3一共有16步完成
第24种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,14,2:
:
0,1
4,0:
:
0,34,1:
:
0,22,1:
:
2,22,2:
:
2,10,2:
:
4,1
0,3:
:
4,00,1:
:
4,20,2:
:
4,10,0:
:
4,3一共有14步完成
第25种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,14,2:
:
0,1
4,0:
:
0,34,1:
:
0,22,1:
:
2,22,2:
:
2,11,1:
:
3,2
2,1:
:
2,20,1:
:
4,21,1:
:
3,20,0:
:
4,3一共有14步完成
第26种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,14,2:
:
0,1
4,0:
:
0,34,1:
:
0,22,1:
:
2,22,2:
:
2,11,1:
:
3,2
2,1:
:
2,20,1:
:
4,20,2:
:
4,10,0:
:
4,3一共有14步完成
第27种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,14,2:
:
0,1
4,0:
:
0,34,1:
:
0,22,1:
:
2,22,2:
:
2,11,1:
:
3,2
2,1:
:
2,21,0:
:
3,31,1:
:
3,20,1:
:
4,20,2:
:
4,1
0,0:
:
4,3一共有16步完成
第28种办法:
4,3:
:
0,03,2:
:
1,13,3:
:
1,02,2:
:
2,14,2:
:
0,1
4,0:
:
0,34,1:
:
0,22,1:
:
2,22,2:
:
2,11,1:
:
3,2
2,1:
:
2,21,0:
:
3,31,1:
:
3,20,0:
:
4,3一共有14步完成
第29种办法:
4,3:
:
0,04,1:
:
0,24,2:
:
0,13,2:
:
1,13,3:
:
1,0
2,2:
:
2,13,2:
:
1,12,1:
:
2,22,2:
:
2,10,2:
:
4,1
0,3:
:
4,00,1:
:
4,21,1:
:
3,20,0:
:
4,3一共有14步完成
第30种办法:
4,3:
:
0,04,1:
:
0,24,2:
:
0,13,2:
:
1,13,3:
:
1,0
2,2:
:
2,13,2:
:
1,12,1:
:
2,22,2:
:
2,10,2:
:
4,1
0,3:
:
4,00,1:
:
4,22,1:
:
2,21,0:
:
3,31,1:
:
3,2
0,0:
:
4,3一共有16步完成
第31种办法:
4,3:
:
0,04,1:
:
0,24,2:
:
0,13,2:
:
1,13,3:
:
1,0
2,2:
:
2,13,2:
:
1,12,1:
:
2,22,2:
:
2,10,2:
:
4,1
0,3:
:
4,00,1:
:
4,20,2:
:
4,10,0:
:
4,3一共有14步完成
第32种办法:
4,3:
:
0,04,1:
:
0,24,2:
:
0,13,2:
:
1,13,3:
:
1,0
2,2:
:
2,13,2:
:
1,12,1:
:
2,22,2:
:
2,11,1:
:
3,2
2,1:
:
2,20,1:
:
4,21,1:
:
3,20,0:
:
4,3一共有14步完成
第33种办法:
4,3:
:
0,04,1:
:
0,24,2:
:
0,13,2:
:
1,13,3:
:
1,0
2,2:
:
2,13,2:
:
1,12,1:
:
2,22,2:
:
2,11,1:
:
3,2
2,1:
:
2,20,1:
:
4,20,2:
:
4,10,0:
:
4,3一共有14步完成
第34种办法:
4,3:
:
0,04,1:
:
0,24,2:
:
0,13,2:
:
1,13,3:
:
1,0
2,2:
:
2,1