商人过河问题,想要得到所有的安全过河方案,怎么运行成功 matlab 5

>>clearallm=3;n=3;t=2;%n为商人数,m为仆人数,t为每次过河的最多人数d=0;s=0;fori=0:mforj=0:nifi>=j&m-i>=n-j... >> clear all
m=3;
n=3;
t=2;
% n为商人数,m为仆人数,t为每次过河的最多人数
d=0;
s=0;
for i=0:m
for j=0:n
if i>=j&m-i>=n-j|i==n|i==0
s=s+1;
S(s,:)=[i j];
end
%生成状态数组集合S
if i+j>0&i+j<=t&(i>=j|i==0)
d=d+1;
D(d,:)=[i j];
end
% 满足条件D={(u,v)|1<=u+v<=t,u,v=0,1,2}
end
end
p=20;
%假定要求在20步内实现安全过河
h=1;
l=1;
q=[m n];
f=0;
%判别是否允许决策集合
while f~=1&h<p
%判断是否可行,判断条件为f不等于1且步骤数小于20
k=1;
sa=[];
sb=[];
for i0=1:l
s0=q(i0,:);
if f==1
break
end
for i=1:d %第h步s随决策d的变化
s1=s0+(-1)^h*D(i,:);
if s1==[0,0]
sa=[0,0];
sb=D(i,:);
f=1;
break
end
for j=2:s-1 %经过决策后允许状态
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 i1=1:k-1
if s1==sa(i1,:)
f1=1;
break
end
end
end
if f1==0
sa(k,:)=s1;
sb(k,:)=D(i,:);
k=k+1;
break
end
end
end
end
h=h+1;
end
end
fprintf('\n过河步骤:\n');
for i = 1 : h
fprintf('第%d步:%d商人%d仆人过河', i, sb(2*i-1,:));
if i < h
fprintf(',%d商人%d仆人返回\n', sb(2*i,:));
else
fprintf(',完成\n\n');
end
展开
 我来答
wxhhq0226
2013-07-04 · TA获得超过1697个赞
知道小有建树答主
回答量:496
采纳率:66%
帮助的人:531万
展开全部

我把

sa=[];
sb=[];

改成

sa=ones(40,2);

sb=ones(40,2);

能运行。不知道符合你要求吗。改后的程序在附件中有

追问
程序可能有其他错误,而且不用20步,题目是“三名商人各带一个随从乘船渡河,只有一只小船且每次只能渡两人,河的任一岸商人数为零或者商人数大于等于随从数。”
参照程序;
http://zhidao.baidu.com/question/511914128.html
这个程序只得到了一种最优的过河方案,我想要得到所有的方案
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
paykka
2025-08-05 广告
传统跨境收款存在线下排队、费用高昂、到账延迟、流程繁琐等诸多痛点。Paykka 通过线上化和本地化服务,有效解决了这些问题,优化了用户的收款体验,让跨境收款更加便捷高效。... 点击进入详情页
本回答由paykka提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式