您的位置:首页 > 其它

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

2013-08-20 14:48 351 查看
这一问题选自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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: