数学建模研究商人过河问题.docx

上传人:b****5 文档编号:28163504 上传时间:2023-07-08 格式:DOCX 页数:17 大小:34.19KB
下载 相关 举报
数学建模研究商人过河问题.docx_第1页
第1页 / 共17页
数学建模研究商人过河问题.docx_第2页
第2页 / 共17页
数学建模研究商人过河问题.docx_第3页
第3页 / 共17页
数学建模研究商人过河问题.docx_第4页
第4页 / 共17页
数学建模研究商人过河问题.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数学建模研究商人过河问题.docx

《数学建模研究商人过河问题.docx》由会员分享,可在线阅读,更多相关《数学建模研究商人过河问题.docx(17页珍藏版)》请在冰豆网上搜索。

数学建模研究商人过河问题.docx

数学建模研究商人过河问题

数学建模试验一陈述【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;i

fla=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(i

else{

freeit(p3);

break;}}

intcount1=0;

if(j==1){if(i

count1++;

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1