商人过河数学模型.docx
《商人过河数学模型.docx》由会员分享,可在线阅读,更多相关《商人过河数学模型.docx(9页珍藏版)》请在冰豆网上搜索。
商人过河数学模型
商人过河数学模型
专业信息与计算科学
班级113010102
罗彪
学号***********
一、问题重述
3名商人各带一名随从乘船渡河,一只小船只能容纳二人,由他们自己划行。
随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。
但是如何乘船渡河的大权掌握在商人们手中。
商人们怎样才能安全过河呢?
二、问题分析
商随过河问题可以视为一个多步决策过程,通过多次优化,最后获取一个全局最优的决策方案。
对于每一步,即船由此岸驶向彼岸或由彼岸驶向此岸,都要对船上的人员作出决策,在保证两岸的商人数不少于随从数的前提下,在有限步使全部人员过河。
用状态变量表示某一岸的人员状况,决策变量表示船上的人员状况,可以找出状态随决策变化的规律,问题转化为在状态的允许变化围(即安全渡河条件),确定每一步的决策,达到安全渡河的目标。
三、模型假设
1.每个商人和随从都会划船;
2.只有一条船,且每条船上最多只能乘坐两个人;
3.所有商人与随从之间没有矛盾,不会出现两人不愿意坐一条船的现象;
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
输入船的最大容量:
2
ans=
00
11
01
03
02
22
11
31
30
32
31
33
Matlab程序
functionfoot=chouxiang
%程序开始需要知道商人数,仆人数,船的最大容量
sr=input('输入商人数目:
');
pr=input('输入仆人数目:
');
c=input('输入船的最大容量:
');
ifpr>sr
sr=input('输入商人数目:
');
pr=input('输入仆人数目:
');
c=input('输入船的最大容量:
');
end
%状态数组生成
zt=1;%状态数组存放在矩阵“A”中,zt为插入新元素的行标初始为1
fori=sr:
-1:
0
forj=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;
fori=0:
c
forj=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);
fori=1:
2*k
forj=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);
ifsize(aa,1)==m
break;
end
forj=1:
size(a,1)
pp=a(j,1);
ifv(k,pp)~=0
ifT(pp)>(P(k)+v(k,pp))
T(pp)=(P(k)+v(k,pp));
lmd(pp)=k;
end
end
end
mi=min(T(a));
ifmi==inf
break;
else
d=find(T==mi);
d=d
(1);
P(d)=mi;
T(d)=inf;
k=d;
S(d)=1;
end
end
iflmd(y)==inf
foot='cannotreach';
return;
end
foot
(1)=y;
g=2;h=y;
while
(1)
ifh==x
break;
end
foot(g)=lmd(h);
g=g+1;
h=lmd(h);
end
foot=A(foot,:
);
foot(:
3)=[];
五、模型评价与推广
1.模型的优点:
采用了较为成熟的数学理论建立模型,可行度比较高;
模型的求解运用了强大的matlab软件,结果可信度高,便于推广;
2.模型的缺点:
没有找到商人数﹑随从数及船的容量之间的数量关系;没有考虑到实际生活中,在安全渡河的前提下,商人过河的优先级应高于随从。
3.该商人、随从过河模型可以完美解决此类商仆过河的决策问题,并且该模型还可推广至解决m个商人和n个随从过河,以及小船的最大载重人数改变时的问题,只需适当地改变相关的语句即可轻松实现模型的转换。