商人过河实验报告参考模板Word下载.docx
《商人过河实验报告参考模板Word下载.docx》由会员分享,可在线阅读,更多相关《商人过河实验报告参考模板Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
05
06
07
08
09
010
011
11
22
33
44
55
66
77
88
99
1010
110
111
112
113
114
115
116
117
118
119
1110
允许的决策向量:
01
10
20
21
30
31
32
40
41
42
50
51
60
过河步骤:
第1步:
0商5仆过河,0商1仆返回
第2步:
5商1仆过河,1商1仆返回
第3步:
3商3仆过河,1商1仆返回
第4步:
第5步:
3商3仆过河,完成
过河过程中状态变化:
步骤此岸商此岸仆方向彼岸商彼岸仆
1116==>
-8-3
117<
==-8-4
266==>
-3-3
77<
==-4-4
344==>
-1-1
55<
==-2-2
422==>
33<
==00
500==>
对于经典的3对商仆、小船容量为2人时的问题,运行程序求得结果如下
11对商仆,小船容量为6人时,运行程序求得结果如下:
图311对商仆、小船容量为6时的求解结果
事实上,11对商仆时的状态空间如图:
2
4
6
8
10
11
可行状态
图412对商仆时的状态空间
显然的船容量必须至少保证状态转移能够沿对角线方向向下移动,问题才会有解。
船容量为2时可以使状态转移沿对角线移动,但不能持续向下移动,船容量至少为4才可使状态能够沿对角线向下移动。
下面说明何时需要状态空间沿对角线移动。
当商仆对数为6时,状态空间为:
图56对商仆时的状态空间
此时状态中心(3,3)距离边界状态(6,3)的距离为3,船容量至少为4才可避免状态转移沿对角线下行,而船容量为4已经是状态转移沿对角线移动的条件,即当商仆对数大于等于6时,船容量至少为4,问题有解。
不难说明,当商仆对数为4或5时,所需的最小船容量为3。
综上,使问题有解的商仆对数与船容量之间的关系如下:
表1商仆对数与船容量的关系
商仆对数
小船容量
1、2、3
≥2
4、5
≥3
≥6
≥4
从图中可以看出,商仆对数为3,容量为2,3,4,5,6的时候,均可以安全过河。
当容量为2时并且有4种方式。
通过计算机运行此c++程序,当题目中给定出任意数量的商人,随从,以及规定出任意船的容量,都可以判断出“商人们能否安全渡河?
”以及解决“如果能,那么安全渡河的方案是什么?
”的问题。
从而使这个模型更具有一定的推广价值。
.附件
n=input('
输入商人数目:
'
);
m=input('
输入仆人数目:
h=input('
输入船的最大容量:
m0=0;
n0=0;
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,:
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&
t<
N%搜索可行的策略
k=1;
sa=[];
sb=[];
fori0=1:
le%第n次允许的策略集逐次搜索
s0=q(i0,:
iff0==1
break
fori=1:
LD%由s0搜索D后得到允许的状态
s1=s0+(-1)^t*D(i,:
ifs1==[m0,n0]
sa=[m0,n0];
sb=D(i,:
f0=1;
forj=2:
LS-1%搜索对比S后允许状态
ifs1==S(j,:
)
ifk==1
sa(k,:
)=s1;
sb(k,:
)=D(i,:
k=k+1;
ifk>
1%对重复状态删除处理
f1=0;
forii=1:
k-1
ifs1==sa(ii,:
f1=1;
iff1==0
end
q=sa;
le=size(q,1);
Q1(1:
le,t*2-1:
t*2)=q;
Q2(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;
sbb=Q2(:
k*2-1:
k*2);
saa=Q1(:
k1*2-1:
k1*2);
2*N
saa2=saa1-(-1)^k*sbb(i,:
forj=1:
ifsaa2==saa(j,:
saa1=saa2;
sbb1=sbb(i,:
SA(k1,:
)=saa1;
SB(k,:
)=sbb1;
end
SA(tr,:
)=[m0n0];
SB(1,:
)=[m,n]-SA(1,:
%输出
SC=ones(size(SA))*3-SA;
nStep=ceil(size(SB,1)/2);
fprintf('
\n允许的状态向量:
\n'
disp(S);
\n允许的决策向量:
\n过河步骤:
fori=1:
nStepfprintf('
第%i步:
%i商%i仆过河'
i,SB(2*i-1,:
));
ifi<
,%i商%i仆返回\n'
SB(2*i,:
else
,完成\n\n'
\n步骤此岸商此岸仆方向彼岸商彼岸仆\n'
nStep
%3i%4i%8i==>
%4i%8i\n'
i,SA(2*i-1,:
),SC(2*i-1,:
%4i%8i<
==%4i%8i\n'
SA(2*i,:
),SC(2*i,:
友情提示:
范文可能无法思考和涵盖全面,供参考!
最好找专业人士起草或审核后使用,感谢您的下载!