怎样用MATLAB解决状态转移问题(例如商人过河问题)

怎样用MATLAB解决状态转移问题(例如商人过河问题),第1张

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解决状态转移问题(例如商人过河问题)、有三个商人和三个随从准备渡河,只有一条船,并且每次只能载两个人,三个随从秘密商量,只要在河的任何一、问题:商人怎样安全渡河等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9868624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存