商人过河实验报告参考模板.docx
《商人过河实验报告参考模板.docx》由会员分享,可在线阅读,更多相关《商人过河实验报告参考模板.docx(12页珍藏版)》请在冰豆网上搜索。
商人过河实验报告参考模板
数学模型实验—实验报告6
学院:
工商学院专业:
电气二类(计算机)姓名:
辛文辉尚磊张亨
学号:
___201248401920124840912012484055____实验时间:
__3.18____实验地点:
b3
一、实验项目:
Matlab程序设计
安全渡河问题可以看成一个多步决策过程。
每一步,即船由此岸驶向彼岸或从彼岸驶回此岸,都要对船上的人员(商人随从各几人)作出决策,在保证安全的前提下(两岸的商人数都不比随从数少),在有限步内使人员全部过河。
用状态(变量)表示某一岸的人员状况,决策(变量)表示船上的人员状况,可以找出状态随决策变化的规律。
问题转化为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到渡河的目的。
此类智力问题经过思考,可以拼凑出一个可行方案。
但是,我们现在希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。
二、实验目的和要求
a.了解Matlab程序设计有关基本操作
b.掌握有关程序结构
三、实验内容
允许的状态向量
00
01
02
03
04
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
02
03
04
05
06
10
11
20
21
22
30
31
32
33
40
41
42
50
51
60
过河步骤:
第1步:
0商5仆过河,0商1仆返回
第2步:
5商1仆过河,1商1仆返回
第3步:
3商3仆过河,1商1仆返回
第4步:
3商3仆过河,1商1仆返回
第5步:
3商3仆过河,完成
过河过程中状态变化:
步骤此岸商此岸仆方向彼岸商彼岸仆
1116==>-8-3
117<==-8-4
266==>-3-3
77<==-4-4
344==>-1-1
55<==-2-2
422==>11
33<==00
500==>33
对于经典的3对商仆、小船容量为2人时的问题,运行程序求得结果如下
11对商仆,小船容量为6人时,运行程序求得结果如下:
图311对商仆、小船容量为6时的求解结果
事实上,11对商仆时的状态空间如图:
0
2
4
6
8
10
0
2
4
6
8
10
11
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,:
)=[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
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
end
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);
fprintf('\n允许的决策向量:
\n');
disp(S);
fprintf('\n过河步骤:
\n');
fori=1:
nStepfprintf('第%i步:
%i商%i仆过河',i,SB(2*i-1,:
));
ifi));
else
fprintf(',完成\n\n');
end
end
fprintf('过河过程中状态变化:
\n步骤此岸商此岸仆方向彼岸商彼岸仆\n');
fori=1:
nStep
fprintf('%3i%4i%8i==>%4i%8i\n',i,SA(2*i-1,:
),SC(2*i-1,:
));
ififprintf('%4i%8i<==%4i%8i\n',SA(2*i,:
),SC(2*i,:
));
end
end
友情提示:
范文可能无法思考和涵盖全面,供参考!
最好找专业人士起草或审核后使用,感谢您的下载!