⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qiongjufa.m

📁 数学建模中常用的穷举法程序
💻 M
字号:
%求出所有排列
A=zeros(7776,5);
l=0;
for i=1:6
    for j=1:6
        for k=1:6
            for m=1:6
                for n=1:6
                    l=l+1;
                    A(l,1)=i;
                    A(l,2)=j;
                    A(l,3)=k;
                    A(l,4)=m;
                    A(l,5)=n;
                end
            end
        end
    end
end
%令不满足任意槽高排列h1h2h3h4h5至少三个槽高互不相同条件的排列槽高全为0
for i=1:7776
    n1=0;n2=0;n3=0;n4=0;n5=0;n6=0;
    for j=1:5
        if A(i,j)==1
            n1=n1+1;
        elseif A(i,j)==2
            n2=n2+1;
        elseif A(i,j)==3
            n3=n3+1;
        elseif A(i,j)==4
            n4=n4+1;
        elseif A(i,j)==5
            n5=n5+1;
        elseif A(i,j)==6
            n6=n6+1;
        end
    end
    if n1>3|(n2>3)|(n3>3)|(n4>3)|(n5>3)|(n6>3)
        A(i,:)=zeros(1,5);
    elseif (n1==3&(n2==2|n3==2|n4==2|n5==2|n6==2))|(n2==3&(n1==2|n3==2|n4==2|n5==2|n6==2))|(n3==3&(n2==2|n1==2|n4==2|n5==2|n6==2))
        A(i,:)=zeros(1,5);
    elseif (n4==3&(n2==2|n3==2|n1==2|n5==2|n6==2))|(n5==3&(n2==2|n3==2|n4==2|n1==2|n6==2))|(n6==3&(n2==2|n3==2|n4==2|n5==2|n1==2))
        A(i,:)=zeros(1,5);
    end
end
%令不满足任意槽高排列h1h2h3h4h5相邻槽高之差不能为5条件的槽高排列全为0
for i=1:7776
    if abs(A(i,1)-A(i,2))==5|abs(A(i,2)-A(i,3))==5|abs(A(i,3)-A(i,4))==5|abs(A(i,4)-A(i,5))==5
        A(i,:)=zeros(1,5);
    end
end
%删除槽高全为0排列,得到实际槽高排列A0
k=0;
for i=1:7776
    if A(i,:)~=0
        k=k+1;
        B(k,:)=A(i,:);
    end
end
B
k
%将B进行按槽高和的奇偶性分为奇类琐具集V1,偶类琐具集V2
v1=0;v2=0;
for i=1:k
    if rem(sum(B(i,:)),2)~=0
        v1=v1+1;
        V1(v1,:)=B(i,:);
    elseif rem(sum(B(i,:)),2)==0
        v2=v2+1;
        V2(v2,:)=B(i,:);
    end
end
v1
v2
%穷举出所有互开对,并给出每个锁具存在的互开对数
n1=0;e1=zeros(1,2940);c=0;
for i1=1:2940
    for j1=1:2940
        a=V1(i1,:)==V2(j1,:);
        c=sum(a);
        if c==4
            for m=1:5
                if a(1,m)==0&abs(V1(i1,m)-V2(j1,m))==1
                    n1=n1+1;
                    e1(i1)=e1(i1)+1;
                end
            end
        end
    end         
end                
n1
%具有相同互开对数的锁具个数
k=zeros(2,15);
for i=1:2940
    if e1(i)==1
        k(1,1)=k(1,1)+1;
    elseif e1(i)==2
        k(1,2)=k(1,2)+1;
    elseif e1(i)==3
        k(1,3)=k(1,3)+1;
    elseif e1(i)==4
        k(1,4)=k(1,4)+1;
    elseif e1(i)==5
        k(1,5)=k(1,5)+1;
    elseif e1(i)==6
        k(1,6)=k(1,6)+1;
    elseif e1(i)==7
        k(1,7)=k(1,7)+1;
    elseif e1(i)==8
        k(1,8)=k(1,8)+1;
    elseif e1(i)==9
        k(1,9)=k(1,9)+1;
    elseif e1(i)==10
        k(1,10)=k(1,10)+1;
    elseif e1(i)==11
        k(1,11)=k(1,11)+1;
    elseif e1(i)==12
        k(1,12)=k(1,12)+1;
    elseif e1(i)==13
        k(1,13)=k(1,13)+1;
    elseif e1(i)==14
        k(1,14)=k(1,14)+1;
    elseif e1(i)==15
        k(1,15)=k(1,15)+1;
    end
end
k(2,:)=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15];
k

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -