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

三个商人各带一名随从欲经过一条河流,只有一小船在河岸且一次最多能载两人过河,随从暗自商议再和的任一岸只要人数多于商人则杀死商人逃离,问商人怎样抉择才能安全渡河?(用MATLAB解决,并能显示其中一河岸的状态)

第1个回答  2010-06-05
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(2*k,2*k);
a=size(d,1);

for i=1:2*k
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个回答  2010-06-03
写一个搜索才可以哦。

怎样用MATLAB解决状态转移问题(例如商人过河问题)
function jueche=guohe 程序开始需要知道商人和仆人数;n=input(‘输入商人数目:’,’12’);nn=input(‘输入仆人数目:’,’12’);nnn=input(‘输入船的最大容量:’,’20’);if nn>n n=input(‘输入商人数目:’,’23’);nn=input(‘输入仆人数目:’,’23’);nnn=input(‘输入船的最大容...

商人过河问题matlab程序
程序开始需要知道商人和仆人数;n=input('输入商人数目: ');nn=input('输入仆人数目: ');nnn=input('输入船的最大容量: ');if nn>n n=input(''输入商人数目:');nn=input('输入仆人数目:');nnn=input('输入船的最大容量:');end 决策生成 jc=1; %决策向量放在矩阵d中,jc为插入新...

利用MATLAB编程实现:三名商人(求程序)
for i=1:LD % 由s0搜索D后得到允许的状态 s1=s0+(-1)^t*D(i,:);if s1==[m0,n0]sa=[m0,n0];sb=D(i,:);f0=1;break end for j=2:LS-1 % 搜索对比S后允许状态 if s1==S(j,:)if k==1 sa(k,:)=s1;sb(k,:)=D(i,:);k=k+1;break end if k>1 % ...

商人过河问题,想要得到所有的安全过河方案,怎么运行成功 matlab
改成 sa=ones(40,2);sb=ones(40,2);能运行。不知道符合你要求吗。改后的程序在附件中有

能将狼羊菜过河matlab 程序代码发给我吗? 谢谢! 我的邮箱carolinalee@yea...
下面首先计算邻接矩阵,由于摆渡一次就改变现有的状态,为此再引入一个四维状态转 移向量,用它来反映摆渡情况。用1 表示过河,0 表示未过河。例如,(1,1,0,0)表示 人带狗过河。状态转移只有四种情况,用如下的向量表示。(1,0,0,0),(1,1,0,0),(1,0,1,0),(1,0,0...

用matlab编程求解动物过河问题,急!!!
1:小狮子和小老虎 2号船:大狮子和大老虎 3号船:小狗熊和大狗熊

商人们怎么安全过河???
商人想要过河,首先要设商人为A、B、C所带随从分别为a、b、c。首先需要商人A带着随从a渡河,然后a留在对岸,然后A将船划回来。bc两名随从接着划船渡河,c将船划回来5AB两名商人划船渡河,Bb主仆二人划船回来,BC两名商人划船渡河即可全部渡河。商人过河的其他解析。商人过河为一个很经常遇到的过河...

数学建模 三对夫妻过河问题,,十万火急啊 我的朋友告诉我,你是个高手...
如果用MATLAB的话,需要有详细的建模和编程,很麻烦的。你上有关的网站上查下作个分析就可以了。推荐个网站 www.codeproject.com 如果外文好的话,可以上这个网站找一些相关的资料。

数学建模 三对夫妻过河问题,,十万火急啊
首先让一对夫妻先过,然后妻子把船划过来,接走第二对夫妻的妻子,第二对夫妻的妻子划船接过丈夫,第二对夫妻的妻子继续接第三对夫妻的妻子,第三对的妻子划船接自己的丈夫过河 三对改成四对也是一样的

农夫过河问题
先把羊带过去,再把菜带去,把羊带回来,而后把狗带上船,把羊放在那儿,最后再去接羊!OK啦!

相似回答