當前位置:編程學習大全網 - 編程語言 - 利用MATLAB編程實現:三名商人(求程序)

利用MATLAB編程實現:三名商人(求程序)

% n為商人數,m為仆人數,h為每次過河的最多人數

clear

n=3;m=3;h=2;

m0=0;n0=0;

LS=0; % 允許的狀態集合S與個數LS

LD=0; % 允許的決策集合D與個數LD

for i=0:n

for j=0:m

if i>=j&n-i>=m-j|i==n|i==0

LS=LS+1;S(LS,:)=[i j];

end

if i+j>0&i+j<=h&(i>=j|i==0)

LD=LD+1;D(LD,:)=[i j];

end

end

end

% 用搜尋法找出符合條件的渡河方案

N=15;

Q1=inf*ones(2*N,2*N);

Q2=inf*ones(2*N,2*N);

t=1;

le=1;

q=[m n];

f0=0; % 判斷循環終止標記

while f0~=1&t<N %搜索可行的策略

k=1;

sa=[];

sb=[];

for i0=1:le % 第n次允許的策略集逐次搜索

s0=q(i0,:);

if f0==1

break

end

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 % 對重復狀態刪除處理

f1=0;

for ii=1:k-1

if s1==sa(ii,:)

f1=1;

break

end

end

end

if f1==0

sa(k,:)=s1;

sb(k,:)=D(i,:);

k=k+1;

break

end

end

end

end

end

q=sa;

le=size(q,1);

Q1(1:le,t*2-1:t*2)=q;

Q2(1:le,t*2-1:t*2)=sb;

t=t+1;

end

% 在可行方案集合中逆向搜尋唯壹方案

tr=t-1;saa1=sa;

SA=zeros(tr,2);SB=zeros(tr,2);

for k=tr:-1:2

k1=k-1;f0=0;

sbb=Q2(:,k*2-1:k*2);

saa=Q1(:,k1*2-1:k1*2);

for i=1:2*N

saa2=saa1-(-1)^k*sbb(i,:);

for j=1:2*N

if saa2==saa(j,:)

saa1=saa2;

sbb1=sbb(i,:);

f0=1;

break

end

end

if f0==1

break

end

end

SA(k1,:)=saa1;

SB(k,:)=sbb1;

end

SA(tr,:)=[m0 n0];

SB(1,:)=[m,n]-SA(1,:);

% 輸出

SC = ones(size(SA))*3 - SA;

nStep = ceil( size(SB,1) / 2 );

fprintf('\n過河步驟:\n');

for i = 1 : nStep

fprintf('第%i步:%i商%i仆過河', i, SB(2*i-1,:));

if i < nStep

fprintf(',%i商%i仆返回\n', SB(2*i,:));

else

fprintf(',完成\n\n');

end

end

fprintf('過河過程中狀態變化:\n步驟 此岸商 此岸仆 方向 彼岸商 彼岸仆\n');

for i = 1 : nStep

fprintf('%3i %4i%8i ==> %4i%8i\n', i, SA(2*i-1, :), SC(2*i-1, :));

if i < nStep

fprintf(' %4i%8i <== %4i%8i\n', SA(2*i, :), SC(2*i, :));

end

end

  • 上一篇:所有成語故事的圖片大全
  • 下一篇:求c語言編寫個人財務管理程序 緊急~
  • copyright 2024編程學習大全網