数学建模社区-数学中国

标题: 商人过河问题的MATLAB编程 [打印本页]

作者: 亚特兰蒂斯    时间: 2010-6-23 01:03
标题: 商人过河问题的MATLAB编程
clear all % 080817
clc         % n为商人数,m为仆人数,h为每次过河的最多人数
n=3;m=3;h=2; %初始状态及数据
m0=0;n0=0;
tic
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,:);
%………………………………………………………………………………………………¥¥
disp '初始状态:'
X0=[m,n]
disp '状态为:'
SA
disp '决策为:'
SB
toc





作者: sanbao    时间: 2010-6-23 10:08
好东西,分享了
作者: linmatsas    时间: 2010-6-23 10:31
哇……好厉害…………
作者: gaoguangbao    时间: 2010-8-11 15:07
好的啊,我正好刚学习了,看看。。。。
作者: 亚特兰蒂斯    时间: 2010-9-8 14:45
回复 gaoguangbao 的帖子


哈哈,快比赛了,加油 啊
作者: dalonso    时间: 2011-1-14 18:40
zhichizhichi
作者: zhangtonghui    时间: 2011-1-18 14:44
恩 楼主能发个M文件给我吗 谢谢 !!!!!
我的邮箱是zhangtonghui619@126.com
作者: 沙漠海滩    时间: 2012-4-29 20:03
什么东西啊,放在MATLAB上不能运算……
作者: ※fly★    时间: 2012-4-29 20:20
学习了!!!
作者: 唤起    时间: 2012-5-16 16:01
看不懂啊
作者: defy470    时间: 2012-6-13 13:19
商人过河问题的MATLAB编程http://www.madio.net/thread-99574-1-1.html
作者: 远行的小船儿666    时间: 2016-8-16 09:47
谢谢楼主分享

作者: 远行的小船儿666    时间: 2016-8-16 09:47
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞

作者: sunyang95    时间: 2016-8-18 11:33
感谢分享

作者: 山已几    时间: 2016-8-20 20:08
楼主好人一生平安





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5