function jueche=guohe
%%%%%%%%%%%%%%%%%%%%%%
程序开始需要知道商人和仆人数;
n=input(‘输入商人数目:’,’12’);
nn=input(‘输入仆人数目:’,’12’);
nnn=input(‘输入船的最大容量:’,’20’);
if nn>n
n=input(‘输入商人数目:’,’23’);
nn=input(‘输入仆人数目:’,’23’);
nnn=input(‘输入船的最大容量:’,’34’);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 决策生成
jc=1; %决策向量放在矩阵d中,jc为插入新元素的行标初始为1;
for i=0:nnn
for j=0:nnn
if (i+j<=nnn)&(i+j>0) % 满足条D={(u,v)|1<=u+v<=nnn,u,v=0,1,2}
d(jc,1:3)=[i,j,1];%生成一个决策向量立刻扩充为三维;
d(jc+1,1:3)=[-i,-j,-1]; % 同时生成他的负向量;
jc=jc+2; % 由于生成两个决策向量,则jc要向下移动两个; end
end
j=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 状态数组生成
kx=1; % 状态向量放在A矩阵中,生成方法同矩阵生成;
for i=n:-1:0
for j=nn:-1:0
if ((i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))
% (i>=j)&((n-i)>=(nn-j)))|((i==0)|(i==n))为可以存在的状态的约束条件
A(kx,1:3)=[i,j,1]; %生成状态数组集合D `
A(kx+1,1:3)=[i,j,0];
kx=kx+2;
end
end
j=nn;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 将状态向量生成抽象矩阵
k=(1/2)size(A,1);
CX=zeros(2k,2k);
a=size(d,1);
for i=1:2k
for j=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);
if size(aa,1)==m
break;
end
for j=1:size(a,1)
pp=a(j,1);
if v(k,pp)~=0
if T(pp)>(P(k)+v(k,pp))
T(pp)=(P(k)+v(k,pp));
lmd(pp)=k;
end
end
end
mi=min(T(a));
if mi==inf
break;
else
d=find(T==mi);
d=d(1);
P(d)=mi;
T(d)=inf;
k=d;
S(d)=1;
end
end
if lmd(y)==inf
jueche='can not reach';
return;
end
jueche(1)=y;
g=2; h=y;
while(1)
if h==x
break;
end
jueche(g)=lmd(h);
g=g+1;
h=lmd(h);
end
jueche=A(jueche,:);
jueche(:,3)=[];
一个商人和一个随从过河,随从留下,商人乘船回来。(返回前:左边2个商人2个随从,右边是1个商人,1个随从;返回后:左边3个商人2个随从,右边是1个随从。)
整数的乘法运算满足:
交换律,结合律, 分配律,消去律。随着数学的发展, 运算的对象从整数发展为更一般群。群中的乘法运算不再要求满足交换律。 最有名的非交换例子,就是哈密尔顿发现的四元数群。 但是结合律仍然满足。
问题分析:由已知得、人可以划船而其他都不能划船只能被运送,所以人始终都得在船上来回运输。由常识可知狼会吃羊而不吃菜、假设狼不能吃此商人,羊会吃菜。只有四者都安全渡过河而没有被吃掉才算成功渡河。逻辑推理:首先人的在船上,而为了使得在岸上剩余之物能够安全相处,所以第一次:人就得把羊先运送到对岸,第二次空身返回到此岸,第三次把狼与羊中的任何一个(假设是狼)运送到对岸,为保对岸的安全就必须把第一次运到对岸的羊运送回去,即第四次人同狼一同回到此岸,第五次是把上次所剩的那一种(羊)运到对岸,因为此时对岸是安全的,第六次商人空身回到此岸,第七次再把羊运送到对岸则可以使得狼、羊、菜安全渡河,且符合船的限制条件。有推理可以看出,河此岸与对岸的类别与数量都在随着运送次数的改变而改变。一次渡河即为一次决策。可以用状态表示某一岸的人员状况,决策量表示船上的运送状况。可以找出状态随决策的的变化规律,问题转化为:状态在允许的变化范围内(安全渡河)确定每一步的决策达到安全渡河的目的。模型构成:记第次渡河后此岸的人狼羊菜的数量与种类为一四维向量=0、1、2、……0表示不在此岸,1表示在此岸。为整数且分别代表人狼羊菜。则在此岸可以安全相处的状态量为S={(1,1,1,1),(0,1,0,1),(1,0,1,0)(0,0,1,0),(0,0,0,1),(0,1,0,0),(1,0,1,1),(1,1,0,1),(1,1,1,0),(0,0,0,0)其中初始量为=(1,1,1,1)最终经过n次安全渡河后的状态为最终状态=(0,0,0,0)。决策量用四维向量=()表示第k次渡河时船上所载的个数及种类,其中分别表示船上时的人、狼、羊、菜。有条件010表示无(不在船上)1表示有(在船上)安全前提下允许的决策集合有:D={(1,1,0,0)(1,0,1,0)(1,0,0,1)(1,0,0,0)}有以上推理可以归纳出状态量与决策量的关系式为:按照以上关系式确定的状态量经过n次转运可以使得初始量=(1,1,1,1)最终达到终止量=(0,0,0,0)且每次决策取自允许决策量D中,每次达到的状态量为安全状态量。Wen08170
以上就是关于怎样用MATLAB解决状态转移问题(例如商人过河问题)全部的内容,包括:怎样用MATLAB解决状态转移问题(例如商人过河问题)、有三个商人和三个随从准备渡河,只有一条船,并且每次只能载两个人,三个随从秘密商量,只要在河的任何一、问题:商人怎样安全渡河等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)