3名(或多名)商人各带一名随从乘船渡河,只有一条小船,且此船只能容纳2人,由他们自己划行,随从们密约,在河的任意岸,一旦随从人数比商人多,就杀商人,此密约被商人知道,如何乘船渡河的大权掌握在商人们手中,那么商人们应怎样安排每次乘船方案,才能安全渡河呢? function foot=merchant
%%%%%%%%%%%%%%%%%%%%%% 程序开始需要知道商人数,仆人数,船的最大容量
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]; %生成一个决策向量后立刻将他扩充为三维(再末尾加“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];