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

作者&投稿:幸儿 (若有异议请与网页底部的电邮联系)
商人过河问题matlab程序~

function jueche=guohe

%%%%%%%%%%%%%%%%%%%%%%
程序开始需要知道商人和仆人数;
n=input('输入商人数目: ');
nn=input('输入仆人数目: ');
nnn=input('输入船的最大容量: ');
if nn>n
n=input(''输入商人数目:');
nn=input('输入仆人数目:');
nnn=input('输入船的最大容量:');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 决策生成
jc=1; %决策向量放在矩阵d中,jc为插入新元素的行标初始为1;
for i=0:nnn

for j=0:nnn
if (i+j0) % 满足条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)=[];

我把
sa=[];sb=[];
改成
sa=ones(40,2);
sb=ones(40,2);
能运行。不知道符合你要求吗。改后的程序在附件中有

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)=[];

写一个搜索才可以哦。

matlab中,脉冲传递函数变成状态空间表达式
答:先把离散传递函数表示出来,然后用ss转换成状态空间的形式:>> z=tf('z');>> G=(2*z^2+z+2)/(z^3+6*z^2+11*z+6) Transfer function: 2 z^2 + z + 2---z^3 + 6 z^2 + 11 z + 6 Sampling time: unspecified>> ss(G) a = x1 x2 x3 x1 -6 ...

关于matlab的应用
答:问题大概是机器正常工作时不同部件有几组特征值,如转速等等.当机器有故障时,特征值将改变,如何应用matlab的某些功能来判断是哪种故障.(这种问题也许是最简单的,但我不会,有了解的请加... 问题大概是机器正常工作时不同部件有几组特征值,如转速等等.当机器有故障时,特征值将改变,如何应用 matlab的某些功能来判断...

请教关于MATLAB语言的HMM工具箱的使用问题
答:我学它的时候老师讲HMM主要解决三个问题类型,评估问题,解码问题和机械学习。em(BW)算法用于解决第三个问题类型,用观测数据来训练模型参数。用哪个function得看你作业是属于哪种类型。而且要看你的模型是哪种,单纯的left to right模型的话状态转移矩阵中只保存相同状态的转移概率和对下一个状态的转移...

关于MATLAB用频域法中的DFT函数求解零状态响应的题目
答:只从编程的角度给你提个建议:1、t、e和fh没有事先定义数据类型和大小;2、w(p)=(p-1)/100;是矩阵运算,应用点除,改为w(p)=(p-1)./100;希望对你有帮助。

matlab中已知状态方程,怎么求等效传递函数与零极点模型
答:matlab中已知状态方程,求等效传递函数与零极点模型:B,C;dt=Ax+Bu y=Cx+Du 要求其传递函数和零极增益、tf和zpk的帮助文档一般已知状态方程dx/,D)tfun=tf(sys)zpm=zpk(sys)楼主可以看看ss,可以使用如下代码 sys=ss(A

windows7系统打开Matlab提示Getting status for files怎么解决
答:最近有用户到本站反馈说碰到这样一个情况,就是在吊卡爱使用Matlab的时候,提示Getting status for files,导致无法正常使用,该怎么办呢,本教程将给大家带来windows7系统打开Matlab提示Getting status for files的具体解决方法。1、首先,确保你已正确下载、安装Matlab软件。安装后,请打开软件;2、打开软件...

.如何利用Matlab来设定校正环节的参数?
答:可以使用MATLAB的调节器工具箱来设定校正环节的参数。调节器工具箱提供了一系列的函数,用于构建、设计、实现和分析控制系统。它可以帮助用户快速构建现有控制系统模型,实现仿真,优化控制参数和状态变量,从而确定最佳的校正环节参数。

matlab怎么使用?
答:MATLAB基本的使用方法 1. 读取图像:用imread函数读取图像文件,文件格式可以是TIFF、JPEG、GIF、BMP、PNG等。比如 2. >> f = imread('chestxray.jpg');读进来的图像数据被保存在变量f中。尾部的分号用来抑制输出。如果图片是彩色的,可以用rgb2gray转换成灰度图:>> f = rgb2gray(f);然后可...

怎么用matlab判断一个系统是否是临界稳定状态
答:方法很简单,用下面两句代码画根轨迹图:G=zpk(-1,[0 1 -5],1)rlocus(G)然后在根轨迹上单击,会出现Datatip,然后拖动至虚轴即可知道临界稳定的增益约为6.61(用Routh判据可以确定临界增益K=20/3),那么,由根轨迹的走向可知,K>=6.61系统稳定。一点疑问:题中的要求是“开环增益”,而...

用MATLAB实现,系统的传函G(s)=s^3+4s^2+5/s^4+2s^2+7S^2+s+1,将其...
答:clc clear num=[1 4 0 5];den=[1 2 7 1 1];[A,B,C,D]=tf2ss(num,den);sys=ss(A,B,C,D)zpm=zpk(sys)doc下tf,ss,zpk,tf2ss,ss2tf等