商人过河问题matlab程序

商人过河问题matlab程序,第1张

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+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=1y=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)=0lmd(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=2h=y

while(1)

if h==x

break

end

jueche(g)=lmd(h)

g=g+1

h=lmd(h)

end

jueche=A(jueche,:)

jueche(:,3)=[]

你百度“LMD程序”

然后有个什么残翼天使的博客 他的程序能用

要是需要CSDN下载 你可以百度“鬼哥CSDN”

具体实现,你可以知网下载 “程军圣”论文 貌似他搞的比较多


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

原文地址: http://outofmemory.cn/yw/11492997.html

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

发表评论

登录后才能评论

评论列表(0条)

保存