数学建模课程作业
论文题目:
对商人过河问题的研究
指导教师:黄光辉
小组成员:黄志宇(20156260)车辆工程04班
牛凯春(20151927)电气工程05
班
文逸楚(20150382)工商管理
02
班
一、问题重述
3名商人带3名随从乘一条小船过河,小船每次只能承载至多两人。随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。乘船渡河的方案由商人决定,商人们如何才能安全渡河呢?
二、问题分析
本题针对商人们能否安全过河问题,需要选择一种合理的过河方案。对该问题可视为一个多步决策模型,通过对每一次过河的方案的筛选优化,最终得到商人们全部安全过到河对岸的最优决策方案。对于每一次的过河过程都看成一个随机决策状态量,商人们能够安全到达彼岸或此岸我们可以看成目标决策允许的状态量,通过对允许的状态量的层层筛选,从而得到过河的目标。
三、模型假设
1. 过河途中不会出现不可抗力的自然因素。
2. 当随从人数大于商人数时,随从们不会改变杀人的计划。
3.船的质量很好,在多次满载的情况下也能正常运作。
4. 随从会听从商人的调度,所有人都到达河对岸。
四、符号说明第k 次渡河前此岸的商人数
第k 次渡河前此岸的随从数
过程的状态向量
允许状态集合
第k 次渡船上的商人数
第k 次渡船上的随从数
决策向量
允许决策集合
五、模型建立
本题为多步决策模型,每一次过河都是状态量的转移过程。
用二维向量表示过程的状态,其中分别表示对应时刻此岸的商人,仆人数以及船的行进方向,其中则允许状态集合:
=
又将二维向量定义为决策,则允许的决策合集为:
因为k 为奇数时船从此岸驶向彼岸,k 为偶数时船从彼岸驶向此岸,所以状态随决策的变化规律是
该式称为状态转移律。
求决策,使, 并按照转移律,由经过有限步n 到达状态
六、模型求解
本模型使用MATLAB 软件编程,通过穷举法获得决策方案如下(完整matlab 程序详见附录):
初始状态:
X0=
3
状态为:
S =
3
3
3
3
1
2
决策为:
D =
0可用图片表示为:3y [**************]1s n +12
2
1
2
[1**********]
七、模型推广
该商人和随从过河模型可以完美解决此类商人过河的决策问题,并且该模型还可推广至解决m 个商人和n 个随从过河,以及小船的最大载重人数改变时的问题,只需适当地改变相关的语句即可轻松实现模型的转换。
如当商人数和随从数均为4,小船最大载重人数为2时,只需将程序的参数修改为m=4,n=4,h=2即可。
若需求更多人数,则推广过程只需要将其中的(x,y)(限定范围)改成相对应的情况即可。
例如,商人基于仆人数都为4时允许状态集合,S={(x, y)|x=0,y=0,1,2,3,4;x=4,y=0,1,2,3,4;x=y=1,2,3}。由程序结果可得该问题无解。
八、模型评价
1. 本文通过matlab 编程,运用穷举法找出解决方案,并且程序可推广至m 个商人n 个随从的问题,具有实用性。
2. 本文存在的不足是程序只能求解出一种解决方案,无法列出所有解决方法。
附录
matlab 源程序
clear all
%n 为商人数,m为仆人数,h为每次过河的最多人数%n=3;m=3;h=2;%初始状态及数据
m0=0;n0=0;
tic
LS=0;%允许的状态集合S 与个数LS
LD=0;%允许的决策集合D 与个数LD
for i=0:n
for j=0:m
if i>=j&n-i>=m-j|i==n|i==0
LS=LS+1;S(LS,:)=[ij];
end
if i+j>0&i+j=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;%判断循环终止标记
while f0~=1&t
k=1;
sa=[];
sb=[];
for i0=1:le%第n 次允许的策略集逐次搜索
s0=q(i0,:);
if f0==1
break
end
for i=1:LD%由s0搜索D 后得到允许的状态
s1=s0+(-1)^t*D(i,:);
if s1==[m0,n0]
sa=[m0,n0];
sb=D(i,:);
f0=1;
break
end
for j=2:LS-1%搜索对比S 后允许状态%
if s1==S(j,:)
if k==1
sa(k,:)=s1;
sb(k,:)=D(i,:);
k=k+1;
break
end
if k>1%对重复状态删除处理%f1=0;
for ii=1:k-1
if s1==sa(ii,:)
f1=1;
break
end
end
end
if f1==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;
S=zeros(tr,2);D=zeros(tr,2);for k=tr:-1:2
k1=k-1;f0=0;
sbb=Q2(:,k*2-1:k*2);
saa=Q1(:,k1*2-1:k1*2);
for i=1:2*N
saa2=saa1-(-1)^k*sbb(i,:);for j=1:2*N
if saa2==saa(j,:)
saa1=saa2;
sbb1=sbb(i,:);
f0=1;
break
end
end
if f0==1
break
end
end
S(k1,:)=saa1;
D(k,:)=sbb1;
end
S(tr,:)=[m0n0];
D(1,:)=[m,n]-SA(1,:);disp '初始状态:'X0=[m,n]
disp '状态为:'
S
disp '决策为:'
D
toc