如何用穷举法求解截断切割问题?

 

    这一问题选自1997年全国大学生数学建模竞赛 B题。问题简单叙述如下:

    某些工业部门(如贵重石材加工等)采用截断切割的加工方式从一个长方体中加工出一个已知尺寸、位置预定的长方体(这两个长方体的对应表面是平行的),通常要经过六次截断切割. 已知待加工长方体和成品长方体的长、宽、高分别为1014.519324, 二者左侧面、正面、底面之间的距离分别为679 (单位均为厘米)若切割费用为每平方厘米1元。试为这些部门设计一种安排各面加工次序的方案,使加工费用最少。

    首先考虑各种不同切割方式的数学描述. 将左、右、前、后、上、下相应的切割面编号为 123456。于是,一个切割方式就是各加工面 { 1, 2, 3, 4, 5, 6 }的一个全排列,记为:。将所有不同的切割方式组成的集合记为

   

 

 

    现在考虑使用任一种切割方式的费用的描述。由于这种切割方式在操作过程中总共要进行六次切割,记六次切割的面积依次为

       , , , , ,

      

则,六次切割的总费用为

                                

    由此可知,截断切割问题实际上是在可行域  上求目标函数的最小值。由于这一问题规模不是很大,可以用穷举法求解。

    设计算法如下

    第一步:列出所有可能的切割方案,即720个操作数(720×6阶的矩阵)

    第二步:计算每一种切割方案的总费用( 720 个费用数据)

    第三步:从720个费用数据中选出最小值;

    第四步:列出费用最少的全部操作方案,结束。

    在这一算法中,比较困难的是第二步的算法实现. 有关细节考虑如下:

    1. 待加工长方体的长、宽、高为1014.519用向量记为

                                                 

    2. 成品长方体的长、宽、高为324,它距待加工长方体左侧面、正面、底面之间的距离分别为679。由此我们可以计算出切割左,右,前,后,上,下各面的切割厚度

 

数据,用向量记为

                                          

    3.   有六个数据,在切割过程中,将待加工的长方体切割为成品长方体要经历六种状态,每一状态均为从前一状态长方体的长、宽、高数据中的某一个减去对应的切割厚度数据而形成的新长方体。被减数只有三个而减数有六个,其.对应关系列表为

4-7

 

对应

对应

对应

被减数指标

1

2

3

减数指标

12

34

56

例如当切割左面或切割右面时,都应该从长、宽、高数据中的第一个数减去切割厚度数据。

    4. 切割面积的计算。每一次切割面的面积实际上是本次切割状态中半成品长、宽、高数据中不改变的两个数据的乘积。

    程序如下

    l1=[1 2 3 4 5 6];k=0;                   %设置

    for j1=1:6,v1=l1(j1);l2=l1;l2(j1)=[];            %  中选取v1并设置

       for j2=1:5,v2=l2(j2);l3=l2;l3(j2)=[];           %  中选取v2并设置

          for j3=1:4,v3=l3(j3);l4=l3;l4(j3)=[];        %  中选取v3并设置

             for j4=1:3,v4=l4(j4);l5=l4;l5(j4)=[];    %  中选取v4并设置

               for j5=1:2,v5=l5(j5);v6=l5(3-j5);   %  中选取v5v6

               k=k+1;p(k,:)=[v1 v2 v3 v4 v5 v6];     %[v1 v2 v3 v4 v5 v6]赋于P

    end,end,end,end,end

    clear l1 l2 l3 l4 l5 j1 j2 j3 j4 j5 v1 v2 v3 v4 v5 v6

    l0=[10 14.5 19];h=[6 1 7 5.5 6 9];u=[1 1 2 2 3 3];

    for k=1:720

    v=p(k,:);l=l0;s=0;                       %提取P的第k行数据

    for j=1:6

        i=v(j);l(u(i))=l(u(i))-h(i);                %模拟截割第i面并减去相应的厚度

        ll=l;ll(u(i))=[];s=s+ll(1)*ll(2);            %累加计算本次截割面的费用

    end

    q(k)=s;                            %将六次截割的总面积赋值给Q

    end

    clear h j i k l l0 ll s u v

    an=min(q);find(q==an);p(ans,:),            %寻求Q中的最小者

    an

    运行程序后,操作数有两组

     6     3     1     5     4     2

     6     3     5     1     4     2

切割费用为:   374达到最小值。对应的切割方案如下

4-8

费用最少的切割方案

所需切割费用

底面,前面,左面,上面,后面,右面

底面,前面,上面,左面,后面,右面

374

374

 

转载于:https://www.cnblogs.com/orangebook/p/3270184.html

你可能感兴趣的:(python)