如何用穷举法求解截断切割问题?
这一问题选自1997年全国大学生数学建模竞赛 B题。问题简单叙述如下:
某些工业部门(如贵重石材加工等)采用截断切割的加工方式从一个长方体中加工出一个已知尺寸、位置预定的长方体(这两个长方体的对应表面是平行的),通常要经过六次截断切割. 已知待加工长方体和成品长方体的长、宽、高分别为10、14.5、19和3、2、4, 二者左侧面、正面、底面之间的距离分别为6、7、9 (单位均为厘米)。若切割费用为每平方厘米1元。试为这些部门设计一种安排各面加工次序的方案,使加工费用最少。
首先考虑各种不同切割方式的数学描述. 将左、右、前、后、上、下相应的切割面编号为 1、2、3、4、5、6。于是,一个切割方式就是各加工面 { 1, 2, 3, 4, 5, 6 }的一个全排列,记为:。将所有不同的切割方式组成的集合记为
|
|
现在考虑使用任一种切割方式的费用的描述。由于这种切割方式在操作过程中总共要进行六次切割,记六次切割的面积依次为 , , , , ,
则,六次切割的总费用为
由此可知,截断切割问题实际上是在可行域 上求目标函数的最小值。由于这一问题规模不是很大,可以用穷举法求解。 设计算法如下 第一步:列出所有可能的切割方案,即720个操作数(720×6阶的矩阵); 第二步:计算每一种切割方案的总费用( 720 个费用数据); 第三步:从720个费用数据中选出最小值; 第四步:列出费用最少的全部操作方案,结束。 在这一算法中,比较困难的是第二步的算法实现. 有关细节考虑如下: 1. 待加工长方体的长、宽、高为10、14.5、19用向量记为
2. 成品长方体的长、宽、高为3、2、4,它距待加工长方体左侧面、正面、底面之间的距离分别为6、7、9。由此我们可以计算出切割左,右,前,后,上,下各面的切割厚度 |
数据,用向量记为
3. 有六个数据,在切割过程中,将待加工的长方体切割为成品长方体要经历六种状态,每一状态均为从前一状态长方体的长、宽、高数据中的某一个减去对应的切割厚度数据而形成的新长方体。被减数只有三个而减数有六个,其.对应关系列表为
表4-7
|
对应 |
对应 |
对应 |
被减数指标 |
1 |
2 |
3 |
减数指标 |
1,2 |
3,4 |
5,6 |
例如当切割左面或切割右面时,都应该从长、宽、高数据中的第一个数减去切割厚度数据。
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); %从 中选取v5与v6
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 |