马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题描述:板材(原材料)为矩形件,现在有一个约束条件,考虑到公差(间隙),将大小为L*W的板材切割时处理为(L+2r)*(W+2r)来进行切割,要切割的矩形件(尺寸为l*w)处理为(l+2r)*(w+2r),其中r为间隙(即,公差)。如下图一所示,进行处理。这样就可以将公差约束条件下的板材切割问题转化为无约束条件下的板材切割问题,相当于在(L+2r)×(W+2r)的矩形板材上切割尺寸为(l+2r)×(w+2r)的矩形件。
界面如下:就是可以输入板材长宽,要切割成的板材长宽,还可以输入公差。在点击开始计算后,可以求出并显示出排列的最大毛坯数,板材利用率来。还可以生成排样图,如下:
要用动态规划算法实现,我这里有参考代码,function Fl(x,y,a,b:integer;f:Tsty):integer; //动态规划算法及递归算法排样的主函数
var
ax,ay,i,j,qx,qy,k:integer; q:Tsty;
begin
ax:=0;ay:=0;i:=0;j:=0;qx:=0;qy:=0;k:=0;
setlength(f,(x+1),(y+1));//数组f[][]用于记录板材状态
setlength(q,(x+1),(y+1));//数组q[][]用于记录拼接上的条带状态
for i:=0 to x do
begin
for j:=0 to y do
f[i][j]:=0;
end;
for i:=0 to x do
begin
for j:=0 to y do
q[i][j]:=0;
end;
for i:=b to x do//二次循环基于动态规划算法,求取板材每个状态拼接条带的决策
begin
for j:=b to y do
begin
if(j>=a) then
ax:=f[i][j-a]+(i div b);
if(i>=a) then
ay:=f[i-a][j]+(j div b);
f[i][j]:=Max(ax,ay);
if ax>ay then
q[i][j]:=1;
end;
end;
i:=x;j:=y;
while (i>=b) and (j>=b) do//递归算法基于最优性原理,逆序递归出切割决策
begin
if (q[i][j]=1) and (j>=a) then
j:=j-a;
if (q[i][j]=0) and (i>=a) then
i:=i-a;
end;
result:=f[x][y];//返回板材的最终状态
end;
但是我不知道这个函数要添加在哪里,编译出来老是有错误,而且不知道如何画出排样图。
求各位大神帮忙看看,急急急急急!!!!感激不尽~~~~~ |