数学建模论文.docx
《数学建模论文.docx》由会员分享,可在线阅读,更多相关《数学建模论文.docx(11页珍藏版)》请在冰豆网上搜索。
数学建模论文
商人仆人过河
摘要
针对M对商仆乘船过河,一只船最多载N人的过河问题,运用状态转移方程建立过河问题模型,并通过matlab程序实现了解决M对商仆过河问题的最优结果(即用最少的步骤实现商仆安全过河)。
通过以11对商仆,一只船最多载7人为例得出最优结果为最少通过7步就可以把11对商仆安全的送到对岸。
该模型可以解决所有M对商仆乘船过河,一只船最多载N人的过河问题,并且用最少的步骤实现商仆安全过河。
1.问题的提出
有M对商仆乘船过河,一只船最多载N人,由商人和仆人自己划船渡河,在河的任意一岸,一旦仆人数多于商人数,仆人就可将商人杀死,谋取利益,但是乘船渡河的主动权掌握在商人们手中,商人们如何安排渡河方案,才能安全渡河?
2.模型的假设
1.商人和仆人都会划船,并且能熟练地划船,保证安全。
2.天气条件很好,没有大风大浪。
3.船的质量很好,船桨的使用能力足够很多次的运载商人和仆人。
3.模型符号说明
◆M:
商仆的对数,N:
一只船最多载的人数。
◆设(x,y)是状态向量,表示任一岸的商人和仆人数,并且x,y分别要大于等于0,小于等于M。
◆设(m,n)是运载向量,表示运载的商人数和仆人数,0<=m<=N,0<=n<=N,0<=m+n<=N。
◆设用S表示所有的可取状态向量的集合。
◆设用d表示所有运载向量的集合。
◆设用
表示从此岸到彼岸,作减;用
表示从彼岸到此岸,作加。
Sk:
表示第k步可取状态向量(sk属于s);dk:
表示第k步可取转移向量(dk属于d);
◆
4.问题的分析
商仆安全渡河问题可以视为一个多步决策过程,多步决策是指决策过程难以一次完成,而是多步优化,最后获取一个全局最优方案的决策方法。
对于每一步,即船由此岸驶向彼岸,或者船由彼岸驶向此岸的决策,不仅会影响到该过程的效果,而且还会影响到下一步的初始状态,从而对整个过程都会有影响。
所以,在每一次过河时,就不能只从这一次过河本身考虑,还要把它看成是整个过河过程中的一个部分。
在对船上的人员做决策时,要保证两岸的商人数不能少于仆人数,用最少的步伐使人员全部过河。
应用状态向量和运载向量,找出状态随运载变化的规律,此问题就转化为状态在允许范围内(即安全渡河条件),确定每一次该如何过河,从而达到渡河的目标。
解决的关键集中在商人和随从的数量上,以及小船的容量上,该问题就是考虑过河步骤的安排和数量上。
各个步骤对应的状态及决策的表示法也是关键。
5.模型的建立及求解
问题中有M对商仆乘船过河,一只船最多载N人,由于M,N是个未知量,为了更容易理解我们以11对商仆乘船过河,一只船最多载7人为例来把问题数量化:
即用数学语言来表示。
设第k次渡河前此岸的商人数为xk,随从数为yk,k=1,2,…,xk,yk=0,1,2,3,将二维向量Sk=(xk,yk)定义为状态。
安全渡河条件下的状态集合称为允许状态集合,记为S,则允许状态集合为:
S={(x,y)|x=0或3,y=0,1,2,3,x=y=1,2}
(1)
又设第k次渡船上的商人数为uk,随从数为vk,将二维向量dk=(uk+vk)定义为决策。
则允许决策集合为:
D={(u,v)|u+v=1,2}
(2)
因为k为奇数时船从此岸驶向彼岸,k为偶数时船由彼岸驶向此岸,所以状态Sk随着决策dk变化的规律即状态转移规律是:
Sk+1=Sk+(-1)kdk(3)
这样,制定安全渡河方案归结为如下的多步决策问题:
求决策dk∈D(k=1,2,…,n),使状态Sk∈S按照规律(3),由初始状态S1=(3,3)经有限步(设为n)到达状态Sn+1=(0,0)。
(注解:
当K为奇数时,船在B岸;当K为偶数时,船在A岸。
)通过分析该递归树,知道求解关键在于正确地写出基本的状态转移关系式和恰当的边界条件。
因为k为奇数时,船是从A岸驶向B岸,k为偶数时。
船是由B岸驶回A岸。
所以状态SK随决策DK变化的规律是KSK+1=SK+(-1)DK,k=l,2,,称之为状态转移律,这样,制定过河方案就归结为如下的多步决策问题:
每一步,船由A岸驶向B岸或B岸驶回A岸,都要对船上的人员(商人UK,随从VK各几人)作出决策,在保证安全的前提下即两岸的商人数XK都不比随从数YK少,用有限步使人员全部过河.用状态(变量)SK表示某一岸的人员状况,决策(变量)DK表示船上的人员状况,可以找出状态SK随决策DK变化的规律.这样安全过河问题就转化为:
求决策DK∈D(k=1,2,……,n),使得状态SK∈S,按照状态转移律,由初始状态S1=(3,3),经有限步n到达状态SK+1=(O,O)。
模型的解答
下面通过程序给出这个多步决策问题的最优解(即通过最少的步骤使得商人能安全过河),程序见附件。
以11对商仆乘船过河,一只船最多载7人为例运行程序,结果如下:
初始状态:
X0=
1111
状态为:
SA=
115
116
55
66
06
07
00
决策为:
SB=
06
01
61
11
60
01
07
结果说明(过河过程分析)
可以得出经过7步的渡河就能达到11对商仆安全渡河的目标及满足渡河的次数最少的条件。
渡河的整个过程如下所示:
去6仆人
(开始渡河)—————→(11商人11仆人)—————→
回1仆人去6商人去1仆人
(11商人5仆人)—————→(11商人6仆人)—————→
回1商人1仆人去6商人
(5商人5仆人)—————→(6商人6仆人)—————→
回1仆人去7仆人
(0商人6仆人)—————→(0商人7仆人)—————→(渡河成功)
结论
11对商仆乘船过河,一只船最多载7人,最少通过7步就可以把11对商仆安全的送到对岸。
程序运行结果见附件
6.模型的优缺点
模型的优缺点:
✓通过状态转移可以简单明了解决M对商仆乘船过河,一只船最多载N人的按过河问题,并且运用matlab强大功能计算出过河最优结果。
✓该模型可以解决所有M对商仆乘船过河,一只船最多载N人的问题,并且求的结果是最优的,即通过最少的步骤商人能安全过河。
但对于商人数和仆人数不相等的时候有待改进。
7总结
这是通过数学分析的方法解决实用问题,经过问题提出、问题假设、问题分析、模型建立、模型求解、模型检验的过程,解决商人过河问题。
然后扩展延伸到n个商人的问题。
学习数学建模以来,重新认识了学习数学的乐趣,也重新认识了数学,本以为数学是单调的,枯燥的,学习了之后,发现数学是普遍存在我们生活之中的。
解决现实中的问题,很多都需要数学。
沉浸在数学的世界里,发现学习是有趣的;相比于机械的认识各个组织器官,建立一个数学模型解决问题是十分有趣的.
8.参考文献
1)王沫然.MATLAB与科学计算(第二版).北京:
电子工业出版社,2004
2)数学建模案例分析白其峥主编北京:
海洋出版社,2000
3)韩中庚.数学建模方法及其应用[M].北京:
高等教育出版社,2005
4)姜启源,数学模型(第二版),北京:
高等教育出版社,1992
5)数学建模案例分析白其峥主编北京:
海洋出版社,2000
6)运筹学(第三版)《运筹学》教材编写组编,清华大学出版社,2005
7)韩中庚.数学建模竞赛——获奖论文精选与点评,北京:
科学出版社,2007
8)傅清祥.《数学结构与方法》》王晓东:
北京工业出版社,1998.
9)谭浩强.《程序设计(第二版)》.北京:
清华大学出版社,2002
10)汪国强.《数学建模优秀案例选编》.广州:
华南理工大学出版社,2001
11)叶其孝.《大学生数学建模竞赛辅导材料
(一)》.长沙:
华南教育出版社,1998
12)李尚志.《数学建模竞赛教程》.南京:
江苏教育出版社,1996
9.附件
附件一
Matlab程序:
functionguohe
n=input('输入商人数目:
');
m=input('输入仆人数目:
');
h=input('输入船的最大容量:
');
ifm~=n
input('商人和仆人不相等,请输入相等的人数!
按enter键继续!
');
n=input('输入商人数目:
');
m=input('输入仆人数目:
');
h=input('输入船的最大容量:
');
end
m0=0;n0=0;
tic
LS=0;%允许的状态集合S与个数LS
LD=0;%允许的决策集合D与个数LD
fori=0:
n
forj=0:
m
ifi>=j&n-i>=m-j|i==n|i==0
LS=LS+1;S(LS,:
)=[ij];
end
ifi+j>0&i+j<=h&(i>=j|i==0)
LD=LD+1;D(LD,:
)=[ij];
end
end
end
%用搜寻法找出符合条件的渡河方案
%……………………………………………………………………………………………$$
N=15;
Q1=inf*ones(2*N,2*N);
Q2=inf*ones(2*N,2*N);
t=1;
le=1;
q=[mn];
f0=0;%判断循环终止标记
whilef0~=1&tk=1;
sa=[];
sb=[];
fori0=1:
le%第n次允许的策略集逐次搜索
s0=q(i0,:
);
iff0==1
break
end
fori=1:
LD%由s0搜索D后得到允许的状态
s1=s0+(-1)^t*D(i,:
);
ifs1==[m0,n0]
sa=[m0,n0];
sb=D(i,:
);
f0=1;
break
end
forj=2:
LS-1%搜索对比S后允许状态
ifs1==S(j,:
)
ifk==1
sa(k,:
)=s1;
sb(k,:
)=D(i,:
);
k=k+1;
break
end
ifk>1%对重复状态删除处理
f1=0;
forii=1:
k-1
ifs1==sa(ii,:
)
f1=1;
break
end
end
end%……
iff1==0
sa(k,:
)=s1;
sb(k,:
)=D(i,:
);
k=k+1;
break
end
end
end%…………………
end%………………………………
end%……………………………………………
q=sa;
le=size(q,1);
Q1(1:
le,t*2-1:
t*2)=q;
Q2(1:
le,t*2-1:
t*2)=sb;
t=t+1;
end%………………………………………………………$$
%在可行方案集合中逆向搜寻唯一方案
%……………………………………………………………………………………………¥¥
tr=t-1;saa1=sa;
SA=zeros(tr,2);SB=zeros(tr,2);
fork=tr:
-1:
2
k1=k-1;f0=0;
sbb=Q2(:
k*2-1:
k*2);
saa=Q1(:
k1*2-1:
k1*2);
fori=1:
2*N
[a,b]=size(saa1)
[c,d]=size(sbb(i,:
))
ifb==d&&a==c
s=1
saa2=saa1-(-1)^k*sbb(i,:
);
forj=1:
2*N
ifsaa2==saa(j,:
)
saa1=saa2;
sbb1=sbb(i,:
);
f0=1;
break
end
end
iff0==1
break
end
else
s=0
break
end
end
ifb==d&&a==c
SA(k1,:
)=saa1;
SB(k,:
)=sbb1;
end
end
SA(tr,:
)=[m0n0];
SB(1,:
)=[m,n]-SA(1,:
);
%………………………………………………………………………………………………¥¥
ifs==1
disp'初始状态:
'
X0=[m,n]
disp'状态为:
'
SA
disp'决策为:
'
SB
toc
else
disp('此条件下商人不能安全过河!
!
')
end
end
附件二
Matlab程序运行结果(以11对商仆,一只船只能载7人)
输入商人数目:
11
输入仆人数目:
11
输入船的最大容量:
7
初始状态:
X0=
1111
状态为:
SA=
115
116
55
66
06
07
00
决策为:
SB=
06
01
61
11
60
01
07