实验01讲评参考答案建立数学模型4学时Word文档格式.docx
- 文档编号:22936527
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:52
- 大小:2.74MB
实验01讲评参考答案建立数学模型4学时Word文档格式.docx
《实验01讲评参考答案建立数学模型4学时Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验01讲评参考答案建立数学模型4学时Word文档格式.docx(52页珍藏版)》请在冰豆网上搜索。
{\itt}/h'
ylabel('
{\itx},{\ity}/mg'
text(2,1100/exp(a*2),'
{\itx}({\itt})'
text(3,-(1100*a*(1/exp(a*3)-1/exp(b*3)))/(a-b),'
{\ity}({\itt})'
程序2:
用fplot和匿名函数
fplot(@(t)[1100/exp(a*t),-(1100*a*(1/exp(a*t)-1/exp(b*t)))/(a-b)],[025]);
2.(编程,验证)商人们怎样安全过河p8~9
三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行。
随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。
但是如何乘船的大权掌握在商人们手中。
商人们怎样才能安全渡河呢?
[模型构成]
决策:
每一步(此岸到彼岸或彼岸到此岸)船上的人员。
在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。
xk第k次渡河前此岸的商人数
yk第k次渡河前此岸的随从数xk,yk=0,1,2,3;
k=1,2,
过程的状态sk=(xk,yk)
允许状态集合S={(x,y)x=0,y=0,1,2,3;
x=3,y=0,1,2,3;
x=y=1,2}
uk第k次渡船上的商人数
vk第k次渡船上的随从数uk,vk=0,1,2;
决策dk=(uk,vk)
允许决策集合D={(u,v)u+v=1,2}
状态转移律sk+1=sk+(-1)kdk
[多步决策问题]
求dkD(k=1,2,,n),使skS,并按转移律由s1=(3,3)到达sn+1=(0,0)。
2.1(编程)求允许决策集合D和允许状态集合S
D是2行多列矩阵,每一列是一个决策。
S是2行多列矩阵,每一列是一种状态。
①编写一个命令文件的程序求D和S,并输出。
②S的第一列是[3,3]'
,最后一列是[0,0]'
。
★编写的程序和运行结果:
程序:
clc;
%求允许决策集合D(2×
n1,n1种决策)
D=[];
foru=0:
2
forv=0:
ifu+v==1||u+v==2
D=[D,[u;
v]];
end
end
%求允许状态集合S(2×
n2,n2种状态)
S=[];
forx=3:
-1:
fory=3:
ifx==0||x==3||x==y
S=[S,[x;
y]];
end%首列状态(商人数,仆从数)'
=(3,3)'
,末列为(0,0)'
D,S
运行结果:
2.2(验证)给出一个商人们安全过河的方案
程序(输入时,不必把注释也输入):
程序运行结果:
①读懂以上程序。
②将题2.1的程序放到上面的程序中(去掉最后多余的输出语句),运行程序。
对照答案,如不一致,请检查程序。
☆给出运行的完整程序和运行结果(参考[9]图1):
functionriver()
[D,S1]=DS();
S2=S1;
SS=[];
%初始允许状态集合S1,S2
s1=S1(:
1);
S1(:
1)=[];
%始发状态s1=[3;
3],用过的状态移出
i=1;
SS(:
i)=s1;
%SS存放有效状态转移的路径
k=true;
%k=true时,从此岸到彼岸;
否则从彼岸到此岸
while~isempty(S2)%目标状态集合非空
[s2,S2]=fun(s1,S2,k,D);
ifk&
&
s2
(1)==0&
s2
(2)==0%有解
i+1)=s2;
disp([1:
i+1;
SS(:
1:
i+1)]);
return;
ifs2
(1)==-1%新状态s2无效
ifi==1%不能再回退
disp('
无解!
'
i=i-1;
%回退
s1=SS(:
i);
else
i=i+1;
i)=s2;
%s1进入路径
s1=s2;
S=S1;
S1=S2;
S2=S;
k=~k;
disp('
function[s2,S2]=fun(s1,S2,k,D)
foru=D%决策遍历
s2=s1+(-1)^k*u;
%状态转移s1->
s2
fori=1:
size(S2,2)
ifs2==S2(:
i)%是否新允许状态
S2(:
i)=[];
s2=[-1;
-1];
%从s1走不通
function[D,S]=DS()
给出程序的运行结果:
3.(求解)商人们怎样安全过河(修改)p9
对第2题的问题改动,用类似的方法求解。
3.1在第2题中修改商人数和随从数
有四名商人各带一个随从,其它同第2题。
修改第2题中的程序求解。
★修改的程序部分和完整程序的运行结果(安全过河的方案):
forx=4:
fory=4:
ifx==0||x==4||x==y
end%首列状态(商人数,仆从数)'
=(4,4)'
3.2在3.1题中修改船容纳的人数
船能容纳3人。
修改3.1题中的程序求解。
3
ifu+v>
=1&
u+v<
=3
4.(编程)安全过河问题(人、猫、鸡、米)p21习题5
人带着猫、鸡、米过河,除需要人划船之外,船至多能载猫、鸡、米三者之一,而当人不在场时猫要吃鸡、鸡要吃米。
试设计一个安全过河方案。
模仿商人过河问题的程序编写程序解决本问题。
★程序:
functionrive()
D=[[1,0,0,0]'
[1,1,0,0]'
[1,0,1,0]'
[1,0,0,1]'
];
j=1;
fora=2^3+2^2+2^1+1:
s=[fix(a/2^3);
mod(fix(a/2^2),2);
mod(fix(a/2),2);
mod(a,2)];
%取二进制数字
ifs
(1)&
(s
(2)&
s(4)||s(3))||~s
(1)&
(~s
(2)&
~s(4)||~s(3))
S(:
j)=s;
j=j+1;
end%s=[人,猫,鸡,米]
end%首列状态=(1,1,1,1)'
,末列为(0,0,0,0)'
S1=true(1,size(S,2));
%S1为船在此岸时,当前未走过的状态集合标记。
S2=S1;
%S2(船在彼岸)类同。
S1
(1)=false;
%状态1做起始状态
SB=1;
SE=[];
SS=[];
sn=-1;
%状态转移SB→SE,走过的“状态转移对”存入SS
while~isempty(SB)%回溯法
ifsn==-1,SM=S2;
elseSM=S1;
end%确定目标状态
fori=SB%状态转移SB→SE
ford=D
sj=S(:
i)+sn*d;
forj=1:
size(S,2)
ifall(sj==S(:
j))&
SM(j)%有效的状态并且没走过
SS=[SS,[i;
j]];
%将i→j存入SS
SE=[SE,j];
%到达的新状态存入SE
SM(j)=false;
%标记已走过的状态
end))%安全完成过河
show(SS,S);
%输出,程序运行结束
break;
ifsn==-1,S2=SM;
elseS1=SM;
end%更新
sn=-sn;
SB=SE;
SE=[];
%准备走下一步
functionshow(SS,S)%输出
SD=SS(2,end);
i=SS(1,end);
forj=size(SS,2)-1:
1
ifSS(2,j)==i
SD=[i,SD];
i=SS(1,j);
SD=[1,SD];
disp([1:
length(SD);
S(:
SD)]);
★程序的运行结果
5.(选做,编程)商人们怎样安全过河(自编)
2.3中的程序有一定难度,所以给出了参考程序,初学MATLAB的同学可能想不到用其中的一些语句。
第2题给出的是求解商人们安全过河问题的一种算法程序,还有其它的算法程序,比如回溯法、递归算法等。
①按照自己的理解和想法,改写2.3中的程序。
②或用别的算法编写解决商人们安全过河的程序。
★程序和运行结果:
解1(递归)
程序
globalmarkDSHOW;
%全局变量
mark=2*ones(4);
mark(1,:
)=0;
mark(4,:
%mark(i,j)=0为允许状态
mark(2,2)=0;
mark(3,3)=0;
D=[01;
02;
10;
11;
20];
%允许决策集合
mark(4,4)=2;
SHOW=[];
fun([3,3],-1);
disp([[3,3];
SHOW]);
return
functionf=fun(s,t)
ifs==0
f=1;
fork=1:
5
s1=s+t*D(k,:
i=s1
(1)+1;
j=s1
(2)+1;
ifall(s1>
=0)&
all(s1<
=3)&
(mark(i,j)==0||mark(i,j)==t)
ifmark(i,j)==0%标记状态(i-1,j-1)的使用情况
mark(i,j)=-t;
else
mark(i,j)=2;
end
iffun(s1,-t)
SHOW=[s1;
SHOW];
ifs==3
无解'
f=0;
运行结果
33
31
32
30%船停靠彼岸,先把所有随从渡过彼岸
11
22
02%船停靠彼岸,再把所有商人渡过彼岸
03%船停靠此岸,此岸只有随从,彼岸只有商人
01
02
00%船停靠彼岸,最后把所有随从渡过彼岸
三个阶段:
(3,3,船停此岸)→(3,0,船停彼岸)→(0,3,船停此岸)→(0,0,船停彼岸)
第一阶段:
所有随从渡过彼岸(商人不动);
第二阶段:
使所有商人渡过彼岸,并将随从渡回此岸;
第三阶段:
所有随从渡过彼岸(商人不动)。
解2(借用栈)
思路
定义状态:
此岸的商人数,随从数,小船停靠在此岸或彼岸。
从初始状态开始,找到一个决策得到下一个状态,再从新状态开始,找到一个决策得到下一个状态,...。
在这个过程中,出现过的状态将不可再用。
若从某个状态开始,所有决策都得不到新状态,则返回上一状态,并从下一个决策开始,试探是否能得到新的状态。
直到到达状态(0,0),或无解。
算法
1.给出允许状态集合;
%用4阶方阵mark标记,其中mark(i,j)=0表示(i-1,j-1)为允许状态,mark(i,j)=2表示(i-1,j-1)为不可达状态
2.给出允许决策集合;
%D=[01;
20]
3.初始状态进栈;
%包括:
当前状态,出发标记(-1/1为从此岸/彼岸出发),选择第几个决策
4.初始状态标记;
%mark(i,j)=-1/1表示从此岸/彼岸出发转移到状态(i-1,j-1)已走过,mark(i,j)=2表示上述两种情况都出现或不可达状态
5.循环直到栈空或到达状态(0,0)
5.1出栈,将出栈的状态作为当前状态,并选择下一个决策;
%原决策失败,回溯
5.2循环直到决策都用过或到达最终状态
5.2.1由当前状态、出发标记和决策得到转移到的新状态;
5.2.2若新状态是允许状态且没走过,则执行5.2.2.1;
否则选择下一个决策
5.2.2.1标记新状态的访问信息;
%mark(i,j)=-1/1/2
5.2.2.2当前状态重新进栈(改变了决策);
%存储决策过程
5.2.2.4将新状态作为当前状态,置出发标记,选择第1个决策;
6.若有解,则输出决策过程;
否则输出“无解”;
sp=1;
st(sp,:
)=[3,3,-1,0];
%进栈,(3,3)为当前状态,-1表示小船停靠此岸,决策0(未做决策)
%标记为不可达状态
s0=[3,3];
whilesp>
0&
any(s0>
0)%栈未空且s0中至少有一个元素>
s0=st(sp,[1,2]);
ss=st(sp,3);
%当前状态,ss=-1/1小船停靠此岸/彼岸
d=st(sp,4);
%之前用过的决策,该决策失败
sp=sp-1;
%出栈
d=d+1;
%试探下一个决策
whiled<
6&
0)
s1=s0+ss*D(d,:
%下一个状态,不包括小船停靠状态
i=s1
(1)+1;
j=s1
(2)+1;
%状态转换为下标
ifall(s1>
(mark(i,j)==0||mark(i,j)==-ss)
ifmark(i,j)==0%标记状态(i-1,j-1)的使用情况
mark(i,j)=ss;
else
mark(i,j)=2;
end
sp=sp+1;
%进栈
st(sp,:
)=[s0,ss,d];
%当前状态重新进栈,改变了决策
s0=s1;
ss=-ss;
d=1;
%下一个状态作当前状态,选择第1个决策
else%决策d失败
d=d+1;
ifs0==0
disp([[1:
sp+1]'
[st(1:
sp,1:
2);
s0]]);
%有解
else
133
231
332
430
531
611
722
802
903
1001
1102
1200
解3
%求允许状态集合S
forx=0:
fory=0:
if(x==0&
(y>
=0&
y<
=3))...
||(x==3&
||(x==1&
y==1||x==2&
y==2)
SA=S;
%从此岸(A)到彼岸(B)渡河前此岸的允许状态集合
SB=S;
%从彼岸(B)到此岸(A)渡河前此岸的允许状态集合
%求允许决策集合D
k=1;
%第1次渡河
s=[3;
3];
%第1次渡河前的状态
Snum
(1)=1;
%第1次渡河前的状态总数
SA(:
end)=[];
SB=SA;
%去掉状态(3,3)
whileSnum(k)>
Snum(k+1)=0;
%第k+1次渡河前的状态总数初始化
k1=size(s,2)-Snum(k)+1;
k2=size(s,2);
fori=k1:
k2
xk=s(1,i);
yk=s(2,i);
xk1=xk+(-1)^k*d
(1);
yk1=yk+(-1)^k*d
(2);
if(-1)^k==1
size(SB,2)
ifxk1==SB(1,j)&
yk1==SB(2,j)
s=[s,SB(:
j)];
SB(:
j)=[];
Snum(k+1)=Snum(k+1)+1;
size(SA,2)
ifxk1==SA(1,j)&
yk1==SA(2,j)
s=[s,SA(:
SA(:
k=k+1;
Snum
s(:
Snum
(1))
m=Snum
(1);
11
disp(s(:
m+1:
m+Snum(k+1)));
m=m+Snum(k+1);
解4
i)=[3;
%开始S(:
1)=[3,3]'
whileS(1,i)~=0||S(2,i)~=0%当s(:
i)=[0,0]'
完成
D(:
i)=round(2*rand(2,1));
%随机取0,1,2给决策D(:
i)
d=D(:
ifd
(1)+d
(2)~=1&
d
(1)+d
(2)~=2%成立则不是允许决策
continue;
%重新选取决策
i+1)=S(:
i)+(-1)^i*D(:
%得到下一个状态S(:
i+1)
s=S(:
i+1);
if(s
(1)==1&
s
(2)~=1)||(s
(1)==2&
s
(2)~=2)||(s
(1)>
3||s
(1)<
0)||(s
(2)>
3||s
(2)<
0)%成立则不是允许状态
ifi==10^5%等于此循环次数判无解
return;
fori=1:
size(S,2)%添加状态的第3行元素,-1为船在此岸,1时在彼岸
i)=[S(:
(-1)^i];
end%区分过程中的不同状态
size(SS,2)-1%去掉状态转移过程中多余的状态
a=0;
forj=i+1:
size(SS,2)%找出与第i状态相同的最后一个状态
ifany
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 01 讲评 参考答案 建立 数学模型 学时
![提示](https://static.bdocx.com/images/bang_tan.gif)