商人过河数学模型

合集下载

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

数学建模—商人们怎样安全过河
商品便宜这种现象吗?比如洁银牙膏50g装的每支 1.50元,120g装的每支3.00元,二者单位重量的价 格比是1.2:1,试用比例方法构造模型解释这种现 象。
(1)分析商品价格C与商品重量w的关系。 (2)给出单位重量价格c与w的关系,并解释其
实际意义。
提示:
决定商品价格的主要因素:
生产成本、包装成本、其他成本。
•一般思维:
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分钟。问他步行了多长时间?
“数学软件与数学建模”选修课之二
数学模型简介
马新生
浙江教育学院数学系 xsma@
“数学软件与数学建模”选修课之二
数学模型简介
2.1 模型2-商人们怎样安全过河 2.2 模型3-照明问题 2.3 数学模型介绍
模型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第三步:模型求解。

游戏中的数学模型

游戏中的数学模型

Q4= 0
1 0
0
0
0
1
0
0
0
0
1 0 0
0 1 0
0 0 0
Q5=
1
0
1
0
0
Q6=
0 1
Q7=
0 0 0 1 0 0 0 1 可以证明, Dü rer空间(简称D空间)中任何一个元 素都可以用Q1,Q2,…,Q8来线性表示,但它们能 0 0 1 0 否构成D空间的一组基呢? 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1
类似于矩阵的加法和数乘,定义魔方的加法和数乘。
易验证,D 对加法和数乘封闭,且构成一线性空间。 记 M ={所有的4×4数字方} ,则其维数为16。 而D是M的子空间,则D是有限维的线性空间。 根据线性空间的性质,如果能得到D的一组基, 则任一个Durer方均可由这组基线性表示。
Durer魔方的维数和生成集
140 110 50 70 20
160 90 60
120 130 30
a11 a12 a13 a14
b11 b12 b13 b14
A=
a21 a22 a23 a24 a31 a32 a33 a34 a41 a42 a43 a44
B=
b21 b22 b23 b24 b31 b32 b33 b34 b41 b42 b43 b44
(i)可取状态:根据题意,并非所有状态都是允许的,例如 (0,1,1,0)就是一个不可取的状态。本题中可取状态(即系 统允许的状态)可以用穷举法列出来,它们是: 人在此岸 人在对岸 (1,1,1,1) (0,0,0,0) (1,1,1,0) (0,0,0,1) (1,1,0,1) (0,0,1,0) (1,0,1,1) (0,1,0,0) (1,0,1,0) (0,1,0,1) 总共有十个可取状态,对一般情况,应找出状态为可取的充 要条件。 (ii)可取运算:状态转移需经状态运算来实现。在实际问题 中,摆一次渡即可改变现有状态。为此也引入一个四维向量 (转移向量),用它来反映摆渡情况。例如 (1,1,0,0) 表示人带狗摆渡过河。根据题意,允许使用的转移向量只能 有(1,0,0,0,)、(1,1,0,0)、(1,0,1,0)、 (1,0,0,1)四个。

基于商人过河游戏的数学建模-最新教育文档

基于商人过河游戏的数学建模-最新教育文档

基于商人过河游戏的数学建模1提出问题文献[1]给出一个智力游戏:“三名商人各带一个随从渡河,一只小船只能容纳二人,由他们自己划行。

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

但是如何乘船的大权掌握在商人们手中。

商人怎样才能安全渡河呢?”此类智力问题当然可以通过一番思考,拼凑出一个可行的方案来。

文献[1]中通过图解法给出了解答,但是当商人数与随从数发生变化,船能容纳的人数不是二人时,图解法就会变得繁复而难以解决问题。

因此,将上述游戏改为n名商人各带一个随从过河,船每次至多运p个人,至少要有一个人划船,由他们自己划行。

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

但是如何乘船的大权掌握在商人们手中。

商人怎样才能安全渡河的问题。

除此之外,考虑了随着船载人数的增多,以及商人与仆人的对数增多到多少时,会影响商人的安全渡河的问题。

2问题分析由于这个虚拟的游戏已经理想化了,所以不必再作假设。

我们希望能找出这类问题的规律性,建立数学模型,并通过计算机编程进行求解。

安全渡河游戏可以看做是一个多步决策过程,分步优化,船由此岸驶向彼岸或由彼岸驶回此岸的每一步,都要对船上的商人和随从做出决策,在保证商人安全的前提下,在无限步内使全部人员过河。

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

问题转化为在状态的允许范围内,确定每一步的决策,最后获取一个全局最优方案的决策方案,达到渡河的目标。

除此以外,我们还要找出,随着船载人数的增加,商人与仆人对数达到多少时,会影响到商人不能安全过河。

这里要对船载人数进行限制,因为船载人数过多时,此智力游戏会变得相当繁复,就会失去作为游戏的本来意义。

3模型构成记第k次渡河前此岸的商人数为,随从数为,,,。

将二维向量定义为过程的状态。

安全渡河条件下的状态集合称为允许状态集合,记作S。

当时,;当时,。

记第k次渡船上的商人数为uk,随从数为vk,将二维向量定义为决策。

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

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

数学建模实验一陈说之吉白夕凡创作实验题目:研究商人过河问题一、实验目的:编写一个法式(可以是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->next=p3;}/*复制内容函数, 将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++){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<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,13,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,34,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种方法: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,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,13,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,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 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,12,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,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,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,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,12,1::2,2 0,1::4,2 0,2::4,1 0,0::4,3一共有14步完成第34种方法: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,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,01,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种方法: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,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,00,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,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步完成第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步完成。

商人过河

商人过河

s=[3,3];m=[0,0];d=zeros(1,2);k=1;l=0; d=3*ones(1,2); while any(s~=0) k=k+1 %渡河 d1=[0,2;1,1;2,0]'; %每种渡河的方案 for i=d1 s1=s; m1=m; s1=s1-i‘; m1=m1+i'; if all(s1==0) l=l+1; d=[d;i']; s=s1; m=m1; else if all(s1>=0) & all(m1>=0) if (s1(1)==0 | s1(1)>=s1(2)) & (m1(1)==0 | m1(1)>=m1(2)) & any(i'~=d(end,:)) %back d2=[0 1;1 0;1 1]'; for j=d2 s2=s1; m2=m1; s2=s2+j‘; m2=m2-j'; if all(s2>=0) & all(m2>=0) if (s2(1)==0 | s2(1)>=s2(2)) & (m2(1)==0 | m2(1)>=m2(2)) l=l+1; d=[d;i']; d=[d;j']; m=m2; s=s2; l=l+1; break end; end; end break end; end; end; end;end d(2:end,:)
答案
商人过河问题
• 三名商人个带一个随从乘船渡河,一只小船 支能容纳二人,由他们自己划行,随从们密约, 在河的任一岸,一旦随从的人数比商人多,就 杀人越货.但是如何乘船渡河的大权掌握在 商人们手中,那么商人们应该怎样才能安全 渡河呢? • 对于这类智力问题可以通过逻辑思维判断 得出解决方案.也可以通过计算机枚举种种 可能,得到合理的解.(考虑过 表示出发岸边的人数; %m--表示河对岸的人数; %d--表示过河的每种决策 clear all s=[3,3];m=[0,0];

数学建模 商人过河

数学建模   商人过河

数学建模商人过河(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】。

操作过程中需借助栈结构实现,具体如下图所示:
此岸人数已经全部转移到彼岸,任务圆满完成,商人们安全过河。

数学模型实验商人过河

数学模型实验商人过河

《数学模型实验》实验报告姓名:王佳蕾学院:数学与信息科学学院地点:主楼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)。

(二)程序设计(三)运行结果、六、 结论体会:安全渡河问题可以看成一个多步决策过程。

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

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

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

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

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

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

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

建立模型记第k 次过河前此岸的商人数为x k , 随从数为y k, k = 1, 2, 3…, x k ,yk = 0, 1, 2, 3定义状态:将二维向量s k = ( x k , y k ) 定义为状态将安全渡河状态下的状态集合定义为允许状态集合,记为S = {(x,y) | x=0,y=0,1,2,3; x=y=1; x=y=2; x=3,y=0,1,2,3}记第k 次渡河船上的商人数为u k,随从数为v k定义决策:将二维向量d k = (u k , v k) 定义为决策允许决策集合记作D = {(u,v) | 1 ≤ u+v ≤ 2, u,v = 0,1,2}因为小船容量为2,所以船上人员不能超过2,而且至少要有一个人划船,由此得到上式。

由我们定义的状态s k和决策d k,我们可以发现它们之间是存在联系的:•k 为奇数是表示船由此岸划向彼岸,k 为偶数时表示船由彼岸划回此岸••状态s k是随着决策d k变化的,规律为:•s k+1 = s k + (-1)k d k我们把上式称为状态转移律,因此渡河方案可以抽象为如下的多步决策模型:求决策d k∈D(k = 1,2,…,n) , 使状态s k∈S 按照转移率,初始状态s1 = (3,3) 经有限步n 到达状态s n+1= (0,0)到这里,整个数学模型就已经非常清晰了,接下来要做的就是求解模型得出结果。

商人过河问题数学建模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名随从的情况(小船同前)。

商人过河问题课件

商人过河问题课件

y
3
(0,0) (3,0) (0,1) (3,1) (0,2) (3,2) (0,3) (3,3)
2
1
O
1
2
3
x
(1,1) (2,2)
y
3
2.根据允许 决策集合确
2
定状态转移
路线的长度
1
为1格或2格。
1 2 3
O
x
3.根据状态转移律确定路线方向:
y
3
驶向彼岸
2
驶回此岸
1
O
1
2
3
x
4.将(3,3)点经允许状态点移至(0,0)点。 y
第二步:定义决策 由于船至多载2人,则允许决策集D为
D={(u,v)| u+v = 1,2}
当k为奇数时,船从此岸驶向彼岸,此岸商 仆数减少,减少数目为船上商仆数,即
sk+1=sk-dk
当k为偶数时,船从彼岸驶回此岸,此岸商 仆数增加,增加数目为船上商仆数,即
第三步:找规律
sk+1=sk+dk
综上有
两岸的商仆数目为一个状态; 每次决策都使状态发生转移;
问题转化为: 1.在安全渡河的条件下,找到所 有允许的状态。
2.确定每步决策,使状态按条件 要求进行转移。
三、模型的建立:
设此岸商人数为x,仆人数为y, ( x, y = 0,1,2,3 ),
定义第k次渡河前的商人数xk与仆人数yk构成的二维 向量sk =(xk , yk )为状态,则在安全渡河条件下的状态 为允许状态。 允许状态
二、模型分析:
研究对象:商人与仆人安全过河
题目要求:
1.船至多载二人 2.船需有人划去,有人划回 3.有商人时,仆人数不大于商人数

商人过河问题数学建模之欧阳光明创编

商人过河问题数学建模之欧阳光明创编

作业1、2:欧阳光明(2021.03.07)商人过河一、问题重述问题一: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,而且至少要有一个人划船,由此得到上式。

由我们定义的状态和决策,我们可以发现它们之间是存在联系的:为奇数是表示船由此岸划向彼岸,为偶数时表示船由彼岸划回此岸状态是随着决策变化的,规律为:我们把上式称为状态转移律,因此渡河方案可以抽象为如下的多步决策模型:求决策, 使状态按照转移率,初始状态经有限步后到达状态。

到这里,整个数学模型就已经非常清晰了,接下来要做的就是求解模型得出结果。

四、模型求解在这个模型的求解中,我将会使用两种方法,一种是数学图解法,用于解决和当前题目一样的规模比较小的问题,优点是比较简便,但是对于规模比较大的问题就无能为力了,比如说有50个商人携带50个随从过河,第二种方法是通过计算机编程,使用程序来解决该问题,即使问题规模增大,我们也可以利用计算机强大的计算能力来解决。

4、1数学图解法我们首先在平面坐标系中画出如下方格,方格中的点表示状态起始状态(下图绿色点) , 终止状态(下图红色点)允许决策表示的是在方格中的移动,根据允许决策的定义,它每次的移动范围为1~2格,并且为奇数时向左或下方或左下方移动,位偶数时向右或上方或右上方移动。

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

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

乙至甲
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,

(完整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)。

商人过河数学模型
专业信息与计算科学班级姓名罗彪学号
1、问题重述3名商人各带一名随从乘船渡河,一只小船只能容纳二人,由他们自己划行。

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

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

商人们怎样才能安全过河呢?
2、问题分析商随过河问题可以视为一个多步决策过程,通过多次优化,最后获取一个全局最优的决策方案。

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

用状态变量表示某一岸的人员状况,决策变量表示船上的人员状况,可以找出状态随决策变化的规律,问题转化为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到安全渡河的目标。

3、模型假设1、每个商人和随从都会划船;2、只有一条船,且每条船上最多只能乘坐两个人;3、所有商人与随从之间没有矛盾,不会出现两人不愿意坐一条船的现象;
4、船在渡河的过程中不受外界环境的影响。

4、模型的建立与求解1、模型建立~第k次渡河前此岸的商人数,~第k次渡河前此岸的随从数, =0,1,2,3;
k=1,2,… …=(, , ck )~过程的状态,其中, , ck 分别表示对应
时刻此岸的商人,仆人数以及船的行进方向,其中c取值1表示
即将向彼岸运行,为0表示即将向此岸运行S ~ 允许状态集合,
S={(x , y)| x=0, y=0,1,2,3; x=3 ,y=0,1,2,3; x=y=1,2}~第k
次渡船上的商人数~第k次渡船上的随从数=(, )~决策,D={(u , v)| ,, =0,1,2} ~允许决策集合k=1,2,… …因为k为奇数时船从此岸驶向彼岸,k为偶数时船从彼岸驶向此岸,所以状态随决策的变化规律是=+~状态转移律求∈D(k=1,2, …n), 使∈S, 并按转移
律由=(3,3,1)到达状态=(0,0,0(1))。

2、模型求解本模型使用MATLAB软件编程求解,运行结果如下>> chouxiang输入商人数
目:3输入仆人数目:3输入船的最大容量:2ans = 0 011 01 03 022211313 0323133Matlab程序function foot=chouxiang %程序
开始需要知道商人数,仆人数,船的最大容量sr=input(输入商人数目:);pr=input(输入仆人数目:);c=input(输入船的最大容量:); if pr>srsr=input(输入商人数目:);pr=input(输入仆人数
目:);c=input(输入船的最大容量:); end %状态数组生成
zt=1; % 状态数组存放在矩阵“A”中,zt为插入新元素的行标初
始为1for i=sr:-1:0 for j=pr:-1:0 if ((i>=j)&((sr-i)>=(pr-j)))|((i==0)|(i==sr))
%(i>=j)&((sr-i)>=(pr-j)))|((i==0)|(i==sr))为可以存在
的状态的约束条件 A(zt,1:3)=[i,j,1]; % 表示此岸安全
A(zt+1,1:3)=[i,j,0]; zt=zt+2; end j=pr;end;end;%决策生成
jc=1; for i=0:c for j=0:c if (i+j<=c)&(i+j>0)
% 满足条件 D={(u,v)|1<=u+v<=c,u,v=0,1,2}
d(jc,1:3)=[i,j1]; %表示从此岸到彼岸 d(jc+1,1:3)=[-i,-j,-1]; %表示从彼岸到此岸 jc=jc+2; end end j=0; end %将状态数
组生成抽象矩阵 k=(1/2)*size(A,1);
CX=zeros(2*k,2*k);a=size(d,1); for i=1:2*k for j=1:a
c=A(i,:)+d(j,:)
; x=find((A(:,1)==c(1))&(A(:,2)==c(2))&(A(:,3)==c(3))) ; v(i,x)=1; % x为空不会改变v的值 end end %dijstra方
法x=1; y=size(A,1);m=size(v,1);T=zeros(m,1); T=T、^-
1;lmd=T; P=T; S=zeros(m,1); S(x)=1; P(x)=0;
lmd(x)=0;k=x;while(1)
a=find(S==0); aa=find(S==1); if size(aa,1)==m break; end for j=1:size(a,1)
pp=a(j,1); if v(k,pp)~=0 if T(pp)>(P(k)+v(k,pp))
T(pp)=(P(k)+v(k,pp)); lmd(pp)=k; end end end
mi=min(T(a)); if mi==inf break; else d=find(T==mi);
d=d(1); P(d)=mi; T(d)=inf; k=d; S(d)=1; endendif
lmd(y)==inf foot=can not reach; return;endfoot(1)=y;g=2;
h=y;while(1)
if h==x break; end foot(g)=lmd(h); g=g+1;
h=lmd(h);end foot=A(foot,:);foot(:,3)=[];
5、模型评价与推广1、模型的优点: 采用了较为成熟的数学理论建立模型,可行度比较高;模型的求解运用了强大的matlab 软件,结果可信度高,便于推广;2、模型的缺点: 没有找到商人数﹑随从数及船的容量之间的数量关系;没有考虑到实际生活中,在安全渡河的前提下,商人过河的优先级应高于随从。

3、该商人、随从过河模型可以完美解决此类商仆过河的决策问题,并且该模型还可推广至解决m个商人和n个随从过河,以及小船的最大载重人数改变时的问题,只需适当地改变相关的语句即可轻松实现模型的转换。

相关文档
最新文档