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


     

        这一问题选自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

     

  • 相关阅读:
    刚装的ESET NOD32无法更新
    借ISA东风,安全发布多个网站
    ASP.NET写入XML访问被拒绝
    ADOBE CS3 序列号
    IEPLUS(IE增强性插件)
    joomla 1.5 笔记
    joomla与drupal内核差异分析
    Drupal修改默认后台地址(D6)
    drupal7指定menu高亮问题
    Drupal6 邮件群发到指定角色
  • 原文地址:https://www.cnblogs.com/orangebook/p/3270184.html
Copyright © 2020-2023  润新知