matlab用穷举法解决问题

例1

% 将350cm的条材切割成72,55,43的三种型号成品每种最少一根,余料最小切割方式
tot_len = 350;len1=72;len2=55;len3=43;
mat=[]; %mat存储所有有的切割组合
n1 = tot_len/len1; %最多切72的可以切割多少根
for k1=1:n1
    n2=fix((tot_len-k1*len1)/len2); %切完k1根,还可以切割多少55的
    for k2=1:n2
        k3=fix((tot_len-k1*len1-k2*len2)/len3); %切完k2根,还可以切割多少43的
        if k3>0
            remain = tot_len - k1*len1 - k2*len2 - k3*len3;
            mat=[mat;k1,k2,k3,remain];
        end
    end
end
[min_remain,index]=min(mat(:,4))  %[min_remain,index]=8 1   index=8  有多少行我们是不知道的mat[]的行只有一个分号
qiege_solu=[len1,len2,len3;mat(index,1:3)],min_remain   %mat(index,1:3)=1   1   5

% %===================
% mat =
% 
%      1     1     5     8
%      1     2     3    39
%      1     3     2    27
%      1     4     1    15
%      2     1     3    22
%      2     2     2    10
%      3     1     1    36
%      4     1     0    36

例2

%350条材 72,55,43,87,91,70,82,73,67,90
%有152种组合
data = [72,55,43,87,91,70,82,73,67,90];
n=length(data);num=5;tot_len=350;
mat=[]; %存放所有满足条件的切割组合
for i=1:2^n   %152
    str=dec2bin(i,n);  %十进制变成N位二进制(字符串形式)
    x=str-'0';  %二进制字符串转0-1数组矩阵
    if sum(x)==num & dot(data,x)<=tot_len    %dot为内积函数
        mat=[mat;x];    %将x的所有组合放入
    end
end
len_mat=mat*data';      %相当于将矩阵的每一行进行内积之后组成一个72行1列的矩阵
[tot_qiege,index]=max(len_mat); %寻找余料最少组合
qiege_solu=[data;mat(index,:)],remain=tot_len-tot_qiege    

你可能感兴趣的:(matlab,穷举法)