商人过河matlab程序以及解析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

商人过河m a t l a b程序以

及解析

The latest revision on November 22, 2020

数学建模作业

班级:数学131

姓名:丁延辉

学号:

(二)商人过河Matlab代码

三个商人三个随从

z=zeros(30,3);%z为由(a,b,c)的列向量组成的3行30列数组,初始化为0矩阵,a,b,c代表此刻此岸的商人,仆人数量以及船的运行状态,c=1表示即将向彼岸运行

m=zeros(1,20);%m为一维行向量,初始化为1矩阵,用于在后面的程序中判断第k次选择的乘船方案

d=[0,1,1;0,2,1;1,0,1;1,1,1;2,0,1];%共有5种可以选择的乘船方案,最后面一列全为1,即用于在后面表示使得z(k,3)的取值保持随着k的奇偶性保持着0-1变换.

z(1,:)=[3,3,1];%初始状态为[3,3,1]

k=1;

m(k)=1;%第一次默认的乘船方案为决策1——d(1)

flag=1;%用于在后面判断是否成功找到方案

answer=0;%用于在后面判断是否找到答案

whilek>0%保持k>0

ifm(k)>5

flag=0;

break;

end

p=0;

z(k+1,:)=z(k,:)+(-1)^k*d(m(k),:);%每一次的运算规则都是

z(k+1)=z(k)-(-1)^k*d(m(k),:),d(m(k),:)表示决策方案

a=z(k+1,1);%将当前情况的矩阵数值复制给a商人,b仆人

b=z(k+1,2);

c=z(k+1,3);

if(a==3&&(b==0||b==1||b==2||b==3))||(a==1&&b==1)||(a==2&&b= =2)||(a==0&&(b==0||b==1||b==2||b==3))%判断(a,b)是否符合限定情况

forj=1:k%判断是否此岸a,b,c与之前有重复,如果是,结束此次循环,重新选择乘船方案

ifa==z(j,1)&&b==z(j,2)&&c==z(j,3)

ifm(k)~=5%决策方案只有5种,所以m(k)<=5,

m(k)=m(k)+1;%因为有重复,所以换下一种决策方案

else

while(m(k)==5)&&(k>1)

k=k-1;%回溯,这一步骤已经把所有决策取尽,无可用解法,于是将后退一步,同时换下一种决策方案

end%while循环的目的是防止前面几步的决策都是5,导致k=k-

1,m(k)=m(k)+1后数组越界,一直找到前面不是m(k)=5的步骤

m(k)=m(k)+1;

end

p=1;

break;

else

p=0;

end

end

ifp==1%程序在跳出内层for循环之后,因为要换成决策方案,所以同时跳出,直接进入下一次while循环,

continue;

end

ifa==0&&b==0%判断是否达到目标情况

answer=1;

fprintf('Successfullyfound!\n每一次的此岸人员分布:商人仆人\n')

fori=1:100

fprintf('第%2d次%d%d\n',i,z(i,1),z(i,2))

ifz(i,1)==0&&z(i,2)==0

break;

end

end%如果不是,进入下一步骤,计算z(k+2)

ifm(k)~=5

m(k)=m(k)+1;%这是正常的进入下一次,所以仍从d1乘船决策1开始

else

while(m(k)==5)&&(k>1)

k=k-1;

end;

m(k)=m(k)+1;

end

continue;

else

k=k+1;%如果不是,进入下一步骤,计算z(k+2)

m(k)=1;%这是正常的进入下一次,所以仍从d1乘船决策1开始continue;

end

else

ifm(k)~=5

m(k)=m(k)+1;%如果没有符合限定情况,结束该次循环,改变上一次的乘船方案

else

while(m(k)==5)&&(k>1)

k=k-1;

end

m(k)=m(k)+1;%回溯,这一步骤已经把所有决策取尽,无可用解法,于是将后退一步,同时换下一种决策方案

continue;

end

end

end

ifanswer==0&&flag==0

fprintf('NoAnswer!\n')

end

相关文档
最新文档