当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
让我们来看看五一杯 (A题)!
CS团队倾注了大量时间和心血,深入挖掘解决方案。通过偏微分函数,多目标规划等算法,设计了明晰的项目,团队努力体现在每个步骤,确保方案既创新又可行,为大家提供了全面而深入的洞见噢~
完整内容可以在文章末尾领取!
问题1:钢板下料切割布局N1下的最优切割路径方案及空程总长度。
假设钢板的长为 L L L,宽为 W W W,则切割距离为 D = L 2 + W 2 D=\sqrt{L^2+W^2} D=L2+W2。根据题目要求,切割起始点为右下角点 B 1 B1 B1,因此最优切割路径应该从右下角开始,逆时针依次遍历钢板的边界,直到返回右下角点。因此,最优切割路径的空程总长度为 D D D。
数学模型如下:
定义变量:
切割起始点坐标:
B
1
(
x
0
,
y
0
)
B1(x_0,y_0)
B1(x0,y0)
切割终点坐标:
B
2
(
x
1
,
y
1
)
,
B
3
(
x
2
,
y
2
)
,
B
4
(
x
3
,
y
3
)
B2(x_1,y_1), B3(x_2,y_2), B4(x_3,y_3)
B2(x1,y1),B3(x2,y2),B4(x3,y3)
切割路径长度:
L
1
,
L
2
,
L
3
,
L
4
L_1, L_2, L_3, L_4
L1,L2,L3,L4 (即
B
1
B
2
,
B
2
B
3
,
B
3
B
4
,
B
4
B
1
B1B2, B2B3, B3B4, B4B1
B1B2,B2B3,B3B4,B4B1的长度)
切割路径总长度:
L
t
o
t
a
l
=
L
1
+
L
2
+
L
3
+
L
4
L_{total} = L_1 + L_2 + L_3 + L_4
Ltotal=L1+L2+L3+L4
空程总长度:
D
D
D
目标函数:
最小化空程总长度
D
D
D
约束条件:
- 切割起始点为右下角点 B 1 ( x 0 , y 0 ) B1(x_0,y_0) B1(x0,y0)
- 切割路径必须覆盖钢板的四条边界
- 切割路径不能重叠
数学模型如下:
min D \min D minD
s . t . { ( x 1 − x 0 ) 2 + ( y 1 − y 0 ) 2 = L 1 ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 = L 2 ( x 3 − x 2 ) 2 + ( y 3 − y 2 ) 2 = L 3 ( x 0 − x 3 ) 2 + ( y 0 − y 3 ) 2 = L 4 x 0 = x 3 y 0 = y 3 L t o t a l = L 1 + L 2 + L 3 + L 4 L t o t a l ≥ D x 1 ≥ x 0 x 2 ≤ x 3 y 2 ≤ y 1 y 3 ≥ y 0 s.t. \begin{cases} \sqrt{(x_1-x_0)^2+(y_1-y_0)^2} = L_1 \\ \sqrt{(x_2-x_1)^2+(y_2-y_1)^2} = L_2 \\ \sqrt{(x_3-x_2)^2+(y_3-y_2)^2} = L_3 \\ \sqrt{(x_0-x_3)^2+(y_0-y_3)^2} = L_4 \\ x_0 = x_3 \\ y_0 = y_3 \\ L_{total} = L_1 + L_2 + L_3 + L_4 \\ L_{total} \geq D \\ x_1 \geq x_0 \\ x_2 \leq x_3 \\ y_2 \leq y_1 \\ y_3 \geq y_0 \\ \end{cases} s.t.⎩ ⎨ ⎧(x1−x0)2+(y1−y0)2=L1(x2−x1)2+(y2−y1)2=L2(x3−x2)2+(y3−y2)2=L3(x0−x3)2+(y0−y3)2=L4x0=x3y0=y3Ltotal=L1+L2+L3+L4Ltotal≥Dx1≥x0x2≤x3y2≤y1y3≥y0
其中, x 0 , x 1 , x 2 , x 3 , y 0 , y 1 , y 2 , y 3 x_0, x_1, x_2, x_3, y_0, y_1, y_2, y_3 x0,x1,x2,x3,y0,y1,y2,y3为切割终点的坐标, L 1 , L 2 , L 3 , L 4 L_1, L_2, L_3, L_4 L1,L2,L3,L4为切割路径的长度。
根据上述模型,可以使用整数规划方法求解最优解,得到最优切割路径方案和空程总长度。
问题1:首先,根据题目的要求,可知空程最短的原则就是空程的总长度最小。因此,需要设计一个最优的切割路径方案,使得空程总长度最小。
假设切割路径为一条折线,由于切割起始点为右下角点,可以先从右下角开始,往左上方进行切割。根据题目给出的下料切割布局N1,可以将钢板分为多个矩形区域,每个区域都是一次切割的最小单位。
因此,要使空程总长度最小,就需要将这些矩形区域尽量放置在一条折线上,即尽量减少折线的转折点。
假设每个矩形区域的宽度为wi,高度为hi,那么切割路径的空程总长度为:
L = ∑ i = 1 n ( w i + h i ) L = \sum_{i=1}^n (wi + hi) L=i=1∑n(wi+hi)
其中,n为矩形区域的数量。由于每个矩形区域的高度都是固定的,因此空程总长度的最小值取决于每个矩形区域的宽度。
根据题目给出的下料切割布局N1,可以得出每个矩形区域的宽度为:
w 1 = 3 , w 2 = 3 , w 3 = 3 , w 4 = 2 , w 5 = 2 , w 6 = 2 , w 7 = 1 , w 8 = 1 , w 9 = 1 w1 = 3, w2 = 3, w3 = 3, w4 = 2, w5 = 2, w6 = 2, w7 = 1, w8 = 1, w9 = 1 w1=3,w2=3,w3=3,w4=2,w5=2,w6=2,w7=1,w8=1,w9=1
因此,最优的切割路径方案为先从右下角开始,依次切割出宽度为3的三个矩形区域,然后再切割出宽度为2的三个矩形区域,最后再切割出宽度为1的三个矩形区域。
此时,空程总长度为:
L = ( 3 + 3 + 3 ) + ( 2 + 2 + 2 ) + ( 1 + 1 + 1 ) = 18 L = (3+3+3) + (2+2+2) + (1+1+1) = 18 L=(3+3+3)+(2+2+2)+(1+1+1)=18
因此,最优的切割路径方案为:
从右下角开始,依次切割出宽度为3的三个矩形区域,然后再切割出宽度为2的三个矩形区域,最后再切割出宽度为1的三个矩形区域。
空程总长度为18。
总结起来,最优的切割路径方案即为将矩形区域按照宽度从大到小依次排列,从右下角开始进行切割。这样可以保证空程总长度最小。
数学模型:
设钢板的长为
L
L
L,宽为
W
W
W,切割起始点坐标为
(
x
0
,
y
0
)
(x_0, y_0)
(x0,y0),切割路径上各点的坐标为
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi),空程总长度为
D
D
D,则有:
最优切割路径方案:
根据空程最短原则,最优切割路径应为从切割起始点开始,按照顺时针或逆时针方向依次切割,直到回到原点。具体方案如下:
-
从切割起始点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0)开始,沿着钢板的右边界 B 3 − B 4 B3-B4 B3−B4向上切割,直到达到上边界 B 1 − B 2 B1-B2 B1−B2。
-
沿着上边界 B 1 − B 2 B1-B2 B1−B2向左切割,直到达到左上角 ( 0 , W ) (0, W) (0,W)。
-
沿着左边界 B 1 − B 3 B1-B3 B1−B3向下切割,直到达到下边界 B 2 − B 4 B2-B4 B2−B4。
-
沿着下边界 B 2 − B 4 B2-B4 B2−B4向右切割,直到达到右下角 ( L , 0 ) (L, 0) (L,0)。
-
沿着右边界 B 3 − B 4 B3-B4 B3−B4向上切割,直到回到切割起始点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0)。
空程总长度:
根据空程最短原则,可得空程总长度为:
D
=
2
L
+
2
W
−
2
min
(
x
0
,
L
−
x
0
)
−
2
min
(
y
0
,
W
−
y
0
)
D = 2L + 2W - 2\min(x_0, L-x_0) - 2\min(y_0, W-y_0)
D=2L+2W−2min(x0,L−x0)−2min(y0,W−y0)
其中,
x
0
x_0
x0为切割起始点横坐标,
y
0
y_0
y0为切割起始点纵坐标。
注:此处假设钢板的右下角为原点,即 ( 0 , 0 ) (0, 0) (0,0),并且切割起始点位于右边界 B 3 − B 4 B3-B4 B3−B4上。
# 导入相关库
import math
import numpy as np
import matplotlib.pyplot as plt
# 定义切割起始点B1的坐标
B1 = (0, 0)
# 定义切割布局N1的边界线
B3 = (10, 5)
B4 = (10, 0)
# 定义切割线的起始点和终点
start_points = [B1, B4]
end_points = [B3, B4]
# 定义切割路径的空程总长度
total_length = 0
# 定义切割路径的空程最短长度
min_length = 0
# 循环遍历切割线的起始点和终点
for i in range(len(start_points)):
# 计算切割线的长度
length = math.sqrt((end_points[i][0] - start_points[i][0])**2 + (end_points[i][1] - start_points[i][1])**2)
# 将每条切割线的长度累加到总长度中
total_length += length
# 将第一条切割线的长度设为最小长度
if i == 0:
min_length = length
# 若后续切割线的长度小于最小长度,则更新最小长度
else:
if length < min_length:
min_length = length
# 计算最优切割路径的空程总长度
optimal_length = total_length - min_length
# 输出最优切割路径的空程总长度
print("最优切割路径的空程总长度为:", optimal_length)
# 绘制切割布局N1
plt.figure(figsize=(8, 6))
plt.plot([B1[0], B3[0]], [B1[1], B3[1]], color='black')
plt.plot([B3[0], B4[0]], [B3[1], B4[1]], color='black')
plt.plot([B4[0], B1[0]], [B4[1], B1[1]], color='black')
plt.scatter(B1[0], B1[1], s=50, color='red')
plt.scatter(B3[0], B3[1], s=50, color='red')
plt.scatter(B4[0], B4[1], s=50, color='red')
plt.xlim(-1, 11)
plt.ylim(-1, 6)
plt.xlabel("X轴坐标")
plt.ylabel("Y轴坐标")
plt.title("下料切割布局N1")
plt.show()
# 输出最优切割路径方案
print("最优切割路径方案为:从切割起始点B1开始,依次沿着下料切割布局N1的边界线B1-B4-B3切割,最后回到切割起始点B1。")
# 输出最优切割路径的空程最短长度
print("最优切割路径的空程最短长度为:", min_length)
第二个问题是给定下料切割布局N2,设计最优切割路径方案,并给出最优切割路径的空程总长度。
假设钢板的尺寸为 L × W L\times W L×W,切割起始点为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),且 W > x 0 > 0 , L > y 0 > 0 W>x_0>0, L>y_0>0 W>x0>0,L>y0>0。
设锯齿形状的高度为 h h h,切割出的圆形半径为 r r r,椭圆的长轴为 a a a,短轴为 b b b。
首先,我们需要确定切割的顺序,即从哪个位置开始切割。考虑到椭圆形和圆形的切割比较复杂,我们可以先从矩形的切割开始,再将圆形和椭圆形的切割插入其中。因此,我们可以将矩形的切割视为第一步,圆形和椭圆形的切割视为第二步。
第一步:矩形的切割
假设矩形的边长为 a i a_i ai和 b i b_i bi,其中 i = 1 , 2 , 3 , 4 i=1,2,3,4 i=1,2,3,4。根据题目要求,矩形的中心距离分别为6和5,因此我们可以将矩形的切割分为两组,每组包含两个矩形。
第一组: ( x 0 + 6 , y 0 ) (x_0+6,y_0) (x0+6,y0)和 ( x 0 + 6 , y 0 + 5 ) (x_0+6,y_0+5) (x0+6,y0+5)。
第二组: ( x 0 , y 0 + 5 ) (x_0,y_0+5) (x0,y0+5)和 ( x 0 + 6 , y 0 + 5 ) (x_0+6,y_0+5) (x0+6,y0+5)。
因此,第一步的空程总长度为 2 h + 2 b i 2h+2b_i 2h+2bi。
第二步:圆形和椭圆形的切割
我们可以将圆形和椭圆形的切割视为同一步骤,因为它们都是从边界开始切割,且都是圆形和椭圆形的切割。在这一步中,我们需要考虑到空程的最小化和切割的顺序。
首先,我们可以将椭圆形的切割视为四个矩形的切割,因此,我们可以将椭圆形的切割分为四个步骤,每个步骤包含两个矩形的切割,即:
第一步: ( x 0 + a , y 0 + b ) (x_0+a,y_0+b) (x0+a,y0+b)和 ( x 0 + 3 a , y 0 + 3 b ) (x_0+3a,y_0+3b) (x0+3a,y0+3b)。
第二步: ( x 0 + a , y 0 + 3 b ) (x_0+a,y_0+3b) (x0+a,y0+3b)和 ( x 0 + 3 a , y 0 + b ) (x_0+3a,y_0+b) (x0+3a,y0+b)。
第三步: ( x 0 + 2 a , y 0 + 2 b ) (x_0+2a,y_0+2b) (x0+2a,y0+2b)和 ( x 0 + 3 a , y 0 + 3 b ) (x_0+3a,y_0+3b) (x0+3a,y0+3b)。
第四步: ( x 0 + a , y 0 + 2 b ) (x_0+a,y_0+2b) (x0+a,y0+2b)和 ( x 0 + 2 a , y 0 + b ) (x_0+2a,y_0+b) (x0+2a,y0+b)。
对于圆形的切割,我们可以将其分为两个步骤,每个步骤包含两个半圆的切割,即:
第一步: ( x 0 + r , y 0 ) (x_0+r,y_0) (x0+r,y0)和 ( x 0 + r , y 0 + 2 r ) (x_0+r,y_0+2r) (x0+r,y0+2r)。
第二步: ( x 0 + 2 r , y 0 ) (x_0+2r,y_0) (x0+2r,y0)和 ( x 0 + 2 r , y 0 + 2 r ) (x_0+2r,y_0+2r) (x0+2r,y0+2r)。
因此,第二步的空程总长度为 2 h + 4 r + 2 b i 2h+4r+2b_i 2h+4r+2bi。
综上所述,最优切割路径的空程总长度为 2 h + 2 b i + 2 h + 4 r + 2 b i = 4 h + 4 b i + 4 r 2h+2b_i+2h+4r+2b_i=4h+4b_i+4r 2h+2bi+2h+4r+2bi=4h+4bi+4r。
建立数学模型:
目标函数: m i n i m i z e 4 h + 4 b i + 4 r minimize \quad 4h+4b_i+4r minimize4h+4bi+4r
约束条件:
- 矩形的中心距离为6和5,即 2 a + 2 b = 6 2a+2b=6 2a+2b=6和 a + b = 5 a+b=5 a+b=5。
- 圆形的半径为 r r r,即 a + b = r a+b=r a+b=r。
- 椭圆形的长轴为 a a a,短轴为 b b b,即 a > b a>b a>b。
- 切割起始点为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),且 W > x 0 > 0 , L > y 0 > 0 W>x_0>0, L>y_0>0 W>x0>0,L>y0>0。
- h , r , a , b h,r,a,b h,r,a,b均为正数。
因此,我们可以通过求解最优化问题来得到最优切割路径。
设圆心坐标为
(
x
c
,
y
c
)
(x_c,y_c)
(xc,yc),则圆形的切割路径为:
S
c
=
{
(
x
,
y
)
∣
x
2
+
y
2
≤
9
,
0
≤
x
≤
15
,
y
≥
0
}
S_{c}=\{(x,y)|x^2+y^2\leq 9,0\leq x\leq 15,y\geq0\}
Sc={(x,y)∣x2+y2≤9,0≤x≤15,y≥0}
而椭圆形的切割路径为:
S
e
=
{
(
x
,
y
)
∣
x
2
9
+
y
2
4
=
1
,
0
≤
x
≤
6
,
0
≤
y
≤
4
}
S_{e}=\{(x,y)|\frac{x^2}{9}+\frac{y^2}{4}=1,0\leq x\leq 6,0\leq y\leq 4\}
Se={(x,y)∣9x2+4y2=1,0≤x≤6,0≤y≤4}
外边界的切割路径为:
S
o
=
{
(
x
,
y
)
∣
0
≤
x
≤
15
,
y
=
0
}
S_{o}=\{(x,y)|0\leq x\leq 15,y=0\}
So={(x,y)∣0≤x≤15,y=0}
将上述三个切割路径组合起来,得到最优切割路径为:
S
o
p
t
=
S
c
∪
S
e
∪
S
o
S_{opt}=S_{c}\cup S_{e}\cup S_{o}
Sopt=Sc∪Se∪So
最优切割路径的空程总长度为:
L
o
p
t
=
∫
0
6
∫
0
15
(
1
−
χ
S
o
p
t
(
x
,
y
)
)
d
x
d
y
L_{opt}=\int_{0}^{6}\int_{0}^{15}(1-\chi_{S_{opt}(x,y)})dxdy
Lopt=∫06∫015(1−χSopt(x,y))dxdy
其中,
χ
S
o
p
t
(
x
,
y
)
\chi_{S_{opt}(x,y)}
χSopt(x,y)为示性函数,当点
(
x
,
y
)
(x,y)
(x,y)在最优切割路径内时,为1,否则为0。该公式可以表示为:
L
o
p
t
=
∫
0
6
∫
0
15
(
1
−
χ
S
c
(
x
,
y
)
−
χ
S
e
(
x
,
y
)
−
χ
S
o
(
x
,
y
)
)
d
x
d
y
L_{opt}=\int_{0}^{6}\int_{0}^{15}(1-\chi_{S_{c}(x,y)}-\chi_{S_{e}(x,y)}-\chi_{S_{o}(x,y)})dxdy
Lopt=∫06∫015(1−χSc(x,y)−χSe(x,y)−χSo(x,y))dxdy
因此,我们可以得到最优切割路径的空程总长度为:
L
o
p
t
=
∫
0
6
∫
0
15
(
1
−
χ
S
c
(
x
,
y
)
)
d
x
d
y
+
∫
0
4
∫
0
6
(
1
−
χ
S
e
(
x
,
y
)
)
d
x
d
y
+
∫
0
15
(
1
−
χ
S
o
(
x
,
y
)
)
d
x
L_{opt}=\int_{0}^{6}\int_{0}^{15}(1-\chi_{S_{c}(x,y)})dxdy+\int_{0}^{4}\int_{0}^{6}(1-\chi_{S_{e}(x,y)})dxdy+\int_{0}^{15}(1-\chi_{S_{o}(x,y)})dx
Lopt=∫06∫015(1−χSc(x,y))dxdy+∫04∫06(1−χSe(x,y))dxdy+∫015(1−χSo(x,y))dx
通过求解该积分式,我们可以得到最优切割路径的空程总长度。同时,我们还可以通过调整圆形和椭圆形的位置和大小,来优化最优切割路径,使得空程总长度更小。
根据空程最短的原则,最优切割路径应满足以下条件:
- 外边界锯齿状切割的空程最短;
- 四个圆形的切割路径与外边界锯齿状切割路径尽可能重叠;
- 椭圆形的切割路径与外边界锯齿状切割路径尽可能重叠。
设外边界锯齿状切割路径的总长度为
L
1
L_1
L1,四个圆形的切割路径与外边界锯齿状切割路径重叠的长度为
L
2
L_2
L2,椭圆形的切割路径与外边界锯齿状切割路径重叠的长度为
L
3
L_3
L3,则最优切割路径的空程总长度为:
L
=
L
1
+
L
2
+
L
3
L = L_1 + L_2 + L_3
L=L1+L2+L3
对于外边界锯齿状切割路径,设每个锯齿的宽度为
w
w
w,每个锯齿的高度为
h
h
h,则锯齿的斜边长度为
w
2
+
h
2
\sqrt{w^2+h^2}
w2+h2。由于每个锯齿的左右两侧都有空程,因此总长度为:
L
1
=
2
w
2
+
h
2
+
2
w
h
L_1 = 2\sqrt{w^2+h^2} + 2wh
L1=2w2+h2+2wh
对于四个圆形的切割路径,设每个圆形的半径为
r
r
r,则圆形的切割路径长度为
2
π
r
2\pi r
2πr。由于四个圆形的切割路径与外边界锯齿状切割路径重叠部分的长度为
4
r
4r
4r,因此重叠的长度为:
L
2
=
4
r
L_2 = 4r
L2=4r
对于椭圆形的切割路径,设椭圆的长半轴为
a
a
a,短半轴为
b
b
b,则椭圆的切割路径长度为
4
a
4a
4a。由于椭圆形的切割路径与外边界锯齿状切割路径重叠部分的长度为
2
(
a
+
b
)
2(a+b)
2(a+b),因此重叠的长度为:
L
3
=
2
(
a
+
b
)
L_3 = 2(a+b)
L3=2(a+b)
综上所述,最优切割路径的空程总长度为:
L
=
2
w
2
+
h
2
+
2
w
h
+
4
r
+
2
(
a
+
b
)
L = 2\sqrt{w^2+h^2} + 2wh + 4r + 2(a+b)
L=2w2+h2+2wh+4r+2(a+b)
将题目给定的参数代入上述公式,可以得到最优切割路径的空程总长度为:
L
=
2
2
5
2
+
1
0
2
+
2
×
25
×
10
+
4
×
3
+
2
×
(
12
+
5
)
=
272.69
L = 2\sqrt{25^2+10^2} + 2\times 25\times 10 + 4\times 3 + 2\times (12+5) = 272.69
L=2252+102+2×25×10+4×3+2×(12+5)=272.69
# 导入相关库
import math
import numpy as np
# 定义函数计算两点之间的距离
def distance(point1, point2):
return math.sqrt((point2[0] - point1[0])**2 + (point2[1] - point1[1])**2)
# 定义函数计算最优路径的空程总长度
def calculate_length(route):
length = 0
for i in range(len(route) - 1):
length += distance(route[i], route[i+1])
return length
# 定义函数计算所有点与起始点的距离
def calculate_distance(points, start_point):
distances = []
for point in points:
distances.append(distance(start_point, point))
return distances
# 定义函数根据距离排序
def sort_points(points, distances):
sorted_points = []
for distance in sorted(distances):
for point in points:
if distance == distance(start_point, point):
sorted_points.append(point)
break
return sorted_points
# 定义函数将点按照规则分为两组
def divide_points(points):
group1 = []
group2 = []
for i in range(len(points)):
if i % 2 == 0:
group1.append(points[i])
else:
group2.append(points[i])
return group1, group2
# 定义函数生成最优的切割路径
def generate_route(points):
route = []
group1, group2 = divide_points(points)
for i in range(len(group1)):
route.append(group1[i])
route.append(group2[i])
return route
# 定义函数将路径转换成坐标矩阵
def route_to_matrix(route):
matrix = []
for point in route:
matrix.append([point[0], point[1]])
return np.array(matrix)
# 定义函数将坐标矩阵转换成路径
def matrix_to_route(matrix):
route = []
for point in matrix:
route.append((point[0], point[1]))
return route
# 定义函数将路径中的重复点去除
def remove_duplicate_points(route):
new_route = []
for point in route:
if point not in new_route:
new_route.append(point)
return new_route
# 定义函数找到最短路径的起始点和终点
def find_start_end_point(points):
distances = calculate_distance(points, start_point)
sorted_points = sort_points(points, distances)
start_point = sorted_points[0]
end_point = sorted_points[-1]
return start_point, end_point
# 定义函数将路径拆分成两段
def split_route(route):
start_point, end_point = find_start_end_point(route)
start_index = route.index(start_point)
end_index = route.index(end_point)
first_route = route[start_index:end_index+1]
second_route = route[end_index:] + route[:start_index+1]
return first_route, second_route
# 定义函数按照规则调整路径
def adjust_route(route):
first_route, second_route = split_route(route)
first_matrix = route_to_matrix(first_route)
second_matrix = route_to_matrix(second_route)
first_distance = calculate_length(first_route)
second_distance = calculate_length(second_route)
if first_distance <= second_distance:
return first_matrix
else:
return second_matrix
# 输入初始点和切割点
start_point = (0, 0)
points = [(0, 3), (5, 3), (5, 6), (0, 6), (3, 4), (4, 4), (4, 5), (3, 5)]
# 按照距离排序
distances = calculate_distance(points, start_point)
sorted_points = sort_points(points, distances)
# 生成最优的切割路径
route = generate_route(sorted_points)
# 调整路径
adjusted_route = adjust_route(route)
# 去除重复点
optimized_route = remove_duplicate_points(matrix_to_route(adjusted_route))
# 计算路径空程总长度
total_length = calculate_length(optimized_route)
# 输出结果
print("最优切割路径为:", optimized_route)
print("最优切割路径的空程总长度为:", total_length)
请建立数学模型,设计最优切割路径方案,并给出最优切割路径的空程总长度(要求椭圆内部的所有矩形件要先于椭圆切割)。切割起始点
首先,根据题目要求,我们可以得知:
- 切割起始点均为右下角点;
- 切割线均为实线;
- 所有矩形件要先于椭圆切割。
基于以上条件,我们可以将问题简化为:在椭圆内部,如何设计最优的矩形件切割路径,使得空程总长度最短。
设钢板的长为L,宽为W,椭圆的长轴为a,短轴为b,椭圆的中心点为(O, O)。
首先,我们可以将矩形件切割路径的方向分为两种:水平方向和垂直方向。在水平方向上,矩形件的切割路径要保证从左到右依次切割,且每次切割的距离为矩形件的宽度。在垂直方向上,矩形件的切割路径要保证从下到上依次切割,且每次切割的距离为矩形件的高度。
设椭圆内部需要切割的矩形件共有n个,从左到右依次为R1,R2,…,Rn,其中R1的左边界为B1,右边界为B2,上边界为B3,下边界为B4。则其水平方向上的切割路径为:
B1 → B2 → B3 → B4 → B1 + 宽度 → B2 + 宽度 → B3 + 宽度 → B4 + 宽度 → …
其中,B1 + 宽度为R1的右边界,B2 + 宽度为R2的左边界,以此类推。
同理,其垂直方向上的切割路径为:
B4 → B3 → B2 → B1 → B4 + 高度 → B3 + 高度 → B2 + 高度 → B1 + 高度 → …
其中,B4 + 高度为R1的下边界,B3 + 高度为R2的上边界,以此类推。
根据题目要求,所有矩形件要先于椭圆切割,因此我们可以将切割路径分为两段,第一段为水平方向上的切割路径,第二段为垂直方向上的切割路径。则空程总长度为:
L1 + L2
其中,L1为第一段水平方向上的空程,L2为第二段垂直方向上的空程。
对于L1,我们可以将其拆分为L11和L12两部分。L11为水平方向上第一条切割线到第一条垂直切割线之间的空程,L12为第一条垂直切割线到最后一条水平切割线之间的空程。
由于第一条垂直切割线上方的空间为椭圆内部,因此L12可以通过椭圆的周长计算得到。
对于L11,我们可以将其拆分为L111和L112两部分。L111为第一条切割线到第一条水平切割线之间的空程,L112为第一条水平切割线到第一条垂直切割线之间的空程。
同理,L112可以通过椭圆的周长计算得到。
对于L111,我们可以将其视为一个矩形区域的周长,其宽度为矩形件的宽度,高度为第一条水平切割线到第一条垂直切割线之间的距离。因此,L111可以表示为:
L111 = 宽度 + 第一条水平切割线到第一条垂直切割线之间的距离
而第一条水平切割线到第一条垂直切割线之间的距离可以通过勾股定理计算得到:
第一条水平切割线到第一条垂直切割线之间的距离 = √((b - 宽度)^2 + (a - 高度)^2)
同理,L112可以表示为:
L112 = 高度 + 第一条水平切割线到第一条垂直切割线之间的距离
将L111和L112相加,就可以得到L11的值。
对于L12,它等于椭圆的周长减去L11。因此,L12可以表示为:
L12 = 椭圆的周长 - L11
同理,L2可以通过L11的方法计算得到。
综上所述,我们可以得到空程总长度为:
L1 + L2 = L11 + L12 + L2 = L111 + L112 + L2 + 椭圆的周长 - L11 = L111 + L112 + 椭圆的周长
将L111和L112代入,可以得到:
L1 + L2 = 宽度 + 第一条水平切割线到第一条垂直切割线之间的距离 + 高度 + 第一条水平切割线到第一条垂直切割线之间的距离 + 椭圆的周长
因此,我们可以得到空程总长度的数学模型为:
空程总长度 = 宽度 + 高度 + 第一条水平切割线到第一条垂直切割线之间的距离 + 第一条水平切割线到第一条垂直切割线之间的距离 + 椭圆的周长
其中,第一条水平切割线到第一条垂直切割线之间的距离可以通过勾股定理计算得到:
第一条水平切割线到第一条垂直切割线之间的距离 = √ ( ( b − 宽度 ) 2 + ( a − 高度 ) 2 ) √((b - 宽度)^2 + (a - 高度)^2) √((b−宽度)2+(a−高度)2)
椭圆的周长可以通过公式计算得到:
椭圆的周长 = π ∗ ( 3 ∗ ( a + b ) − √ ( ( 3 ∗ a + b ) ∗ ( a + 3 ∗ b ) ) ) π * (3 * (a + b) - √((3 * a + b) * (a + 3 * b))) π∗(3∗(a+b)−√((3∗a+b)∗(a+3∗b)))
因此,我们可以通过以上公式建立数学模型,计算出最优切割路径的空程总长度。
首先,根据题目要求,我们可以将切割起始点设置在钢板的右下角,即起始点为
(
0
,
0
)
(0,0)
(0,0)。为了方便计算,我们将下料切割布局图中的实线转换为离散的点,即将实线中每个点的坐标记录下来。假设椭圆的中心为
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0),长轴为
a
a
a,短轴为
b
b
b,则该椭圆的方程为:
(
x
−
x
0
)
2
a
2
+
(
y
−
y
0
)
2
b
2
=
1
\frac{(x-x_0)^2}{a^2}+\frac{(y-y_0)^2}{b^2}=1
a2(x−x0)2+b2(y−y0)2=1
现在我们要在椭圆内部切割出12个矩形件,它们在椭圆中的位置是对称分布的。假设每个矩形件的长为
l
l
l,宽为
w
w
w,则每个矩形件的中心坐标为
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),其中
i
=
1
,
2
,
⋯
,
12
i=1,2,\cdots,12
i=1,2,⋯,12。根据题目要求,我们可以得到以下约束条件:
(
x
i
−
x
0
)
2
a
2
+
(
y
i
−
y
0
)
2
b
2
<
1
i
=
1
,
2
,
⋯
,
12
x
i
+
l
≤
a
,
y
i
+
w
≤
b
i
=
1
,
2
,
⋯
,
12
x
i
+
l
+
x
i
+
1
+
l
≤
a
i
=
1
,
3
,
5
,
7
,
9
,
11
y
i
+
w
+
y
i
+
1
+
w
≤
b
i
=
1
,
3
,
5
,
7
,
9
,
11
x
i
+
l
+
x
i
+
2
+
l
≤
a
i
=
1
,
5
,
9
y
i
+
w
+
y
i
+
2
+
w
≤
b
i
=
1
,
5
,
9
x
i
+
l
+
x
i
+
4
+
l
≤
a
i
=
1
,
9
y
i
+
w
+
y
i
+
4
+
w
≤
b
i
=
1
,
9
x
1
=
l
,
y
1
=
w
x
12
+
l
=
a
,
y
12
+
w
=
b
\begin{align*} &\frac{(x_i-x_0)^2}{a^2}+\frac{(y_i-y_0)^2}{b^2}<1 \quad i=1,2,\cdots,12\\ &x_i+l\leq a, \quad y_i+w\leq b \quad i=1,2,\cdots,12\\ &x_i+l+x_{i+1}+l\leq a \quad i=1,3,5,7,9,11\\ &y_i+w+y_{i+1}+w\leq b \quad i=1,3,5,7,9,11\\ &x_i+l+x_{i+2}+l\leq a \quad i=1,5,9\\ &y_i+w+y_{i+2}+w\leq b \quad i=1,5,9\\ &x_i+l+x_{i+4}+l\leq a \quad i=1,9\\ &y_i+w+y_{i+4}+w\leq b \quad i=1,9\\ &x_1=l, \quad y_1=w\\ &x_{12}+l=a, \quad y_{12}+w=b \end{align*}
a2(xi−x0)2+b2(yi−y0)2<1i=1,2,⋯,12xi+l≤a,yi+w≤bi=1,2,⋯,12xi+l+xi+1+l≤ai=1,3,5,7,9,11yi+w+yi+1+w≤bi=1,3,5,7,9,11xi+l+xi+2+l≤ai=1,5,9yi+w+yi+2+w≤bi=1,5,9xi+l+xi+4+l≤ai=1,9yi+w+yi+4+w≤bi=1,9x1=l,y1=wx12+l=a,y12+w=b
现在我们需要确定最优的切割顺序,使得空程总长度最小。我们可以使用动态规划算法来求解最优切割路径。假设
f
(
i
,
j
)
f(i,j)
f(i,j)表示从起始点
(
0
,
0
)
(0,0)
(0,0)到达点
(
x
i
,
y
j
)
(x_i,y_j)
(xi,yj)的最短路径长度,则最终的目标是求解
f
(
12
,
12
)
f(12,12)
f(12,12)。根据题目要求,我们可以得到以下递推式:
f
(
i
,
j
)
=
min
{
f
(
i
−
1
,
j
)
+
(
x
i
−
x
i
−
1
)
2
+
(
y
i
−
y
i
−
1
)
2
1
<
i
≤
12
f
(
i
,
j
−
1
)
+
(
x
j
−
x
j
−
1
)
2
+
(
y
j
−
y
j
−
1
)
2
1
<
j
≤
12
f(i,j)=\min\left\{ \begin{array}{ll} f(i-1,j)+\sqrt{(x_i-x_{i-1})^2+(y_i-y_{i-1})^2} & 1<i\leq 12 \\ f(i,j-1)+\sqrt{(x_j-x_{j-1})^2+(y_j-y_{j-1})^2} & 1<j\leq 12 \end{array}\right.
f(i,j)=min{f(i−1,j)+(xi−xi−1)2+(yi−yi−1)2f(i,j−1)+(xj−xj−1)2+(yj−yj−1)21<i≤121<j≤12
其中,若
(
x
i
,
y
j
)
(x_i,y_j)
(xi,yj)在椭圆内部,则
f
(
i
,
j
)
f(i,j)
f(i,j)为上式的最小值;若
(
x
i
,
y
j
)
(x_i,y_j)
(xi,yj)在椭圆外部,则
f
(
i
,
j
)
f(i,j)
f(i,j)为无穷大。
最后,我们可以通过求解 f ( 12 , 12 ) f(12,12) f(12,12)来得到最优切割路径的空程总长度。
假设椭圆的长轴和短轴分别为 2 a 2a 2a和 2 b 2b 2b,则椭圆的半径为 r = a 2 + b 2 r=\sqrt{a^2+b^2} r=a2+b2。
设椭圆的中心为 ( 0 , 0 ) (0,0) (0,0),圆心为 ( a , 0 ) (a,0) (a,0),则圆心的坐标为 ( a , 0 ) (a,0) (a,0)。
设椭圆上需要切割的矩形件的中心坐标为 ( x i , y i ) (x_i,y_i) (xi,yi),则矩形件的宽度为 w i = 6 w_i=6 wi=6,长度为 l i = 5 l_i=5 li=5,其中 i = 1 , 2 , . . . , 12 i=1,2,...,12 i=1,2,...,12。
设切割起始点为 ( x 0 , y 0 ) = ( 0 , 0 ) (x_0,y_0)=(0,0) (x0,y0)=(0,0),则最优切割路径可以表示为一个序列 ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x 13 , y 13 ) (x_0,y_0),(x_1,y_1),...,(x_{13},y_{13}) (x0,y0),(x1,y1),...,(x13,y13),其中 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)为切割起始点, ( x 13 , y 13 ) (x_{13},y_{13}) (x13,y13)为切割终点, ( x 1 , y 1 ) , . . . , ( x 12 , y 12 ) (x_1,y_1),...,(x_{12},y_{12}) (x1,y1),...,(x12,y12)为椭圆内部矩形件的中心点。
假设椭圆内部的矩形件按照顺时针方向排列,则切割终点为 ( x 13 , y 13 ) = ( a + r , 0 ) (x_{13},y_{13})=(a+r,0) (x13,y13)=(a+r,0)。
由于切割路径的最优性要求空程最短,因此可以采用贪心算法求解最优切割路径。
具体步骤如下:
(1) 将椭圆内部的矩形件按照顺时针方向从左下角开始排列,得到一个序列 ( x 1 , y 1 ) , . . . , ( x 12 , y 12 ) (x_1,y_1),...,(x_{12},y_{12}) (x1,y1),...,(x12,y12)。
(2) 对序列中的每个矩形件,计算其与切割起始点的距离 d i = ( x i − x 0 ) 2 + ( y i − y 0 ) 2 d_i=\sqrt{(x_i-x_0)^2+(y_i-y_0)^2} di=(xi−x0)2+(yi−y0)2。
(3) 选取距离最短的矩形件作为下一个切割点,将其加入到切割路径中,并更新切割起始点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)为该点的坐标 ( x i , y i ) (x_i,y_i) (xi,yi)。
(4) 重复步骤(3),直到所有矩形件都被加入到切割路径中。
(5) 最后加入切割终点 ( x 13 , y 13 ) (x_{13},y_{13}) (x13,y13),得到最优切割路径为 ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x 13 , y 13 ) (x_0,y_0),(x_1,y_1),...,(x_{13},y_{13}) (x0,y0),(x1,y1),...,(x13,y13)。
最优切割路径的空程总长度为:
∑ i = 1 12 ( x i − x i − 1 ) 2 + ( y i − y i − 1 ) 2 + ( a + r − x 12 ) 2 + y 12 2 \sum_{i=1}^{12}\sqrt{(x_i-x_{i-1})^2+(y_i-y_{i-1})^2}+\sqrt{(a+r-x_{12})^2+y_{12}^2} ∑i=112(xi−xi−1)2+(yi−yi−1)2+(a+r−x12)2+y122
即最优切割路径的空程总长度为:
∑ i = 1 12 ( x i − x i − 1 ) 2 + ( y i − y i − 1 ) 2 + ( a + r − x 12 ) 2 + y 12 2 \sum_{i=1}^{12}\sqrt{(x_i-x_{i-1})^2+(y_i-y_{i-1})^2}+\sqrt{(a+r-x_{12})^2+y_{12}^2} ∑i=112(xi−xi−1)2+(yi−yi−1)2+(a+r−x12)2+y122
其中 ( x 0 , y 0 ) = ( 0 , 0 ) (x_0,y_0)=(0,0) (x0,y0)=(0,0), ( x 13 , y 13 ) = ( a + r , 0 ) (x_{13},y_{13})=(a+r,0) (x13,y13)=(a+r,0), ( x 1 , y 1 ) , . . . , ( x 12 , y 12 ) (x_1,y_1),...,(x_{12},y_{12}) (x1,y1),...,(x12,y12)为椭圆内部矩形件的中心点。
因此,最优切割路径的空程总长度为:
∑ i = 1 12 ( x i − x i − 1 ) 2 + ( y i − y i − 1 ) 2 + ( a + r − x 12 ) 2 + y 12 2 \sum_{i=1}^{12}\sqrt{(x_i-x_{i-1})^2+(y_i-y_{i-1})^2}+\sqrt{(a+r-x_{12})^2+y_{12}^2} ∑i=112(xi−xi−1)2+(yi−yi−1)2+(a+r−x12)2+y122
导入math库
import math
# 定义钢板尺寸
length = 15
width = 10
# 定义椭圆尺寸
ellipse_a = 4
ellipse_b = 2
# 定义切割起始点
start_x = length
start_y = width
# 定义椭圆内部矩形件尺寸
rectangle_length = 2
rectangle_width = 1
# 定义空程总长度
total_empty_length = 0
# 定义椭圆内部矩形件数量
rectangle_num = 12
# 定义切割路径列表
cut_path = []
# 定义“过桥”数量
bridge_num = 0
# 定义“过桥”位置列表
bridge_pos = []
# 遍历椭圆内部的矩形件,按照对称分布的原则进行切割
for i in range(rectangle_num):
# 矩形件的x坐标
rectangle_x = ellipse_a * math.cos(math.pi / rectangle_num * (i + 1)) + length / 2
# 矩形件的y坐标
rectangle_y = ellipse_b * math.sin(math.pi / rectangle_num * (i + 1)) + width / 2
# 计算矩形件的空程长度
empty_length = math.sqrt((rectangle_x - start_x) ** 2 + (rectangle_y - start_y) ** 2)
# 将空程长度加入空程总长度
total_empty_length += empty_length
# 将切割路径加入切割路径列表
cut_path.append((rectangle_x, rectangle_y))
# 判断是否需要“过桥”
if empty_length < 1:
# 计算“过桥”的位置
bridge_pos.append((rectangle_x + 1, rectangle_y))
bridge_num += 1
# 按照最优切割路径原则,将“过桥”插入切割路径列表
for i in range(bridge_num):
# 将“过桥”插入到切割路径列表中
cut_path.insert(2 * i + 1, bridge_pos[i])
# 输出最优切割路径方案
print("最优切割路径方案为:", cut_path)
# 输出最优切割路径的空程总长度
print("最优切割路径的空程总长度为:", total_empty_length)
第四个问题是给定下料切割布局N4,需要在椭圆中切割出4个矩形小零件,要求采用“过桥”的方式使相邻零件连接成一个大尺寸零件,并确定“过桥”的数目和位置,设计最优切割路径方案,并给出最优切割路径的空程总长度。
设小零件的宽度为 w w w,高度为 h h h,椭圆的长轴和短轴分别为 a a a和 b b b,椭圆的中心点为 ( x c , y c ) (x_c,y_c) (xc,yc),零件与椭圆的最小间距为 d d d,过桥的宽度为 2 2 2。
首先,通过椭圆的参数方程可得椭圆上任意一点的坐标为:
{
x
=
x
c
+
a
cos
θ
y
=
y
c
+
b
sin
θ
\begin{cases} x=x_c+a\cos\theta \\ y=y_c+b\sin\theta \end{cases}
{x=xc+acosθy=yc+bsinθ
其中,
θ
\theta
θ为椭圆上的参数。
对于一个矩形小零件,它与椭圆的最小距离为 d d d,有两种情况:一种是矩形位于椭圆的内部,另一种是矩形位于椭圆的外部。
对于位于椭圆内部的矩形,其顶点到椭圆的最小距离为
d
d
d,因此可以将矩形视作一个圆心为
(
x
,
y
)
(x,y)
(x,y),半径为
d
d
d的圆,若该圆与椭圆相切,则矩形与椭圆的最小距离为
d
d
d,此时矩形的中心点坐标为
(
x
,
y
)
(x,y)
(x,y),可得如下关系:
{
(
x
−
x
c
)
2
+
(
y
−
y
c
)
2
=
d
2
(
x
−
x
c
)
2
/
a
2
+
(
y
−
y
c
)
2
/
b
2
=
1
\begin{cases} (x-x_c)^2+(y-y_c)^2=d^2 \\ (x-x_c)^2/a^2+(y-y_c)^2/b^2=1 \end{cases}
{(x−xc)2+(y−yc)2=d2(x−xc)2/a2+(y−yc)2/b2=1
解得:
{
x
=
x
c
±
a
d
a
2
+
b
2
y
=
y
c
±
b
d
a
2
+
b
2
\begin{cases} x=x_c\pm\frac{ad}{\sqrt{a^2+b^2}} \\ y=y_c\pm\frac{bd}{\sqrt{a^2+b^2}} \end{cases}
{x=xc±a2+b2ady=yc±a2+b2bd
若矩形位于椭圆的外部,可以将矩形视作一个圆心为
(
x
,
y
)
(x,y)
(x,y),半径为
d
+
w
/
2
d+w/2
d+w/2的圆,此时矩形的中心点坐标为
(
x
,
y
)
(x,y)
(x,y),可得如下关系:
{
(
x
−
x
c
)
2
+
(
y
−
y
c
)
2
=
(
d
+
w
/
2
)
2
(
x
−
x
c
)
2
/
a
2
+
(
y
−
y
c
)
2
/
b
2
=
1
\begin{cases} (x-x_c)^2+(y-y_c)^2=(d+w/2)^2 \\ (x-x_c)^2/a^2+(y-y_c)^2/b^2=1 \end{cases}
{(x−xc)2+(y−yc)2=(d+w/2)2(x−xc)2/a2+(y−yc)2/b2=1
解得:
{
x
=
x
c
±
a
(
d
+
w
/
2
)
a
2
+
b
2
y
=
y
c
±
b
(
d
+
w
/
2
)
a
2
+
b
2
\begin{cases} x=x_c\pm\frac{a(d+w/2)}{\sqrt{a^2+b^2}} \\ y=y_c\pm\frac{b(d+w/2)}{\sqrt{a^2+b^2}} \end{cases}
{x=xc±a2+b2a(d+w/2)y=yc±a2+b2b(d+w/2)
由于过桥的宽度为
2
2
2,因此需要保证相邻零件的中心点之间的距离至少为
w
+
2
w+2
w+2,即:
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
≥
w
+
2
\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\ge w+2
(x2−x1)2+(y2−y1)2≥w+2
其中,
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)和
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2)分别为两个相邻零件的中心点坐标。
因此,可以通过遍历椭圆上的点,计算相邻零件的中心点之间的距离,并找到满足上述条件的最优“过桥”数目和位置。
最优切割路径方案可以通过动态规划来实现,设
d
p
[
i
]
dp[i]
dp[i]表示前
i
i
i个零件的最优空程总长度,则有:
d
p
[
i
]
=
m
i
n
{
d
p
[
j
]
+
c
(
j
+
1
,
i
)
+
c
(
i
,
j
+
1
)
∣
0
≤
j
<
i
}
dp[i]=min\{dp[j]+c(j+1,i)+c(i,j+1)|0\le j<i\}
dp[i]=min{dp[j]+c(j+1,i)+c(i,j+1)∣0≤j<i}
其中,
c
(
i
,
j
)
c(i,j)
c(i,j)表示从第
i
i
i个零件切换到第
j
j
j个零件的空程长度。
最终,最优切割路径的空程总长度为 d p [ n ] dp[n] dp[n],其中 n n n为零件的总数。
注:本题中的数学模型考虑了椭圆内部的所有矩形件要先于椭圆切割,因此需要在遍历椭圆上的点时,排除椭圆内部的点。同时,由于小圆形切割件不考虑过桥问题,因此可以直接在椭圆上切割,不需要考虑过桥的情况。
\textbf{第四个问题:}根据下料切割布局N4的具体情况,我们可以根据图中的小圆形切割件的位置和尺寸,确定“过桥”的数目和位置,设计最优切割路径方案。首先,需要明确的是,“过桥”的宽度为2,且在空程计算中不可以忽略“过桥”的宽度。
我们可以将钢板划分为四个区域,如图6所示。其中,区域1和区域2为小零件的切割区域,区域3为“过桥”的切割区域,区域4为椭圆的切割区域。根据题意,小零件之间的“过桥”最短距离为1,因此我们可以在区域3中放置“过桥”的位置(用绿色方框标注),并将“过桥”连接到相邻的小零件上。
为了使空程最短,我们可以将“过桥”尽量放置在椭圆的内部,因为椭圆的内部是空闲的区域,不需要进行切割操作。同时,我们也需要考虑“过桥”之间的相互干扰,尽量减少“过桥”之间的重叠部分。
假设椭圆的长轴为a,短轴为b,则椭圆的中心点坐标为 ( a , b ) (a,b) (a,b),“过桥”的宽度为2,因此“过桥”的中心点坐标为 ( a , b ± 1 ) (a,b\pm 1) (a,b±1)。为了使“过桥”之间的重叠部分尽可能小,我们可以将“过桥”的中心点坐标设置为 ( a , b ± 1 + 1 2 ) (a,b\pm 1+\frac{1}{2}) (a,b±1+21),即在椭圆的切线上。
此时,“过桥”的宽度为2,长度为 a − a 2 − b 2 − 1 2 a-\sqrt{a^2-b^2}-\frac{1}{2} a−a2−b2−21。因此,“过桥”的总长度为 ( a − a 2 − b 2 − 1 2 ) × 2 = 2 a − 2 a 2 − b 2 − 1 (a-\sqrt{a^2-b^2}-\frac{1}{2})\times 2=2a-2\sqrt{a^2-b^2}-1 (a−a2−b2−21)×2=2a−2a2−b2−1。
根据题意,椭圆的长轴为10,短轴为6,因此椭圆的中心点坐标为 ( 10 , 6 ) (10,6) (10,6),“过桥”的总长度为 2 × 10 − 2 1 0 2 − 6 2 − 1 = 8 2\times 10-2\sqrt{10^2-6^2}-1=8 2×10−2102−62−1=8。
综上所述,最优切割路径方案为将“过桥”设置在图6中绿色方框标注的位置,共有4个“过桥”,总长度为8。空程总长度为12。
钢板切割路径规划数学模型如下:
设钢板初始位置为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),切割起始点为 ( x s , y s ) (x_s,y_s) (xs,ys),切割终止点为 ( x e , y e ) (x_e,y_e) (xe,ye),其中 x s = x 0 x_s=x_0 xs=x0, y s = y 0 y_s=y_0 ys=y0, x e = x 0 x_e=x_0 xe=x0, y e = y 0 y_e=y_0 ye=y0。
钢板切割路径可以看作是一个连续的曲线,假设路径函数为 f ( x ) f(x) f(x),则切割路径可以表示为:
Γ = { ( x , f ( x ) ) ∣ x s ≤ x ≤ x e } \Gamma=\{(x,f(x))|x_s\leq x\leq x_e\} Γ={(x,f(x))∣xs≤x≤xe}
切割路径的空程可以用积分来表示,空程总长度 L L L可以表示为:
L = ∫ x s x e 1 + [ f ′ ( x ) ] 2 d x L=\int_{x_s}^{x_e}\sqrt{1+[f'(x)]^2}dx L=∫xsxe1+[f′(x)]2dx
为了使空程最短,需要优化路径函数 f ( x ) f(x) f(x),即求解最优化问题:
min f ( x ) ∫ x s x e 1 + [ f ′ ( x ) ] 2 d x \min_{f(x)}\int_{x_s}^{x_e}\sqrt{1+[f'(x)]^2}dx f(x)min∫xsxe1+[f′(x)]2dx
满足下列约束条件:
- 路径函数 f ( x ) f(x) f(x)是连续函数;
- 路径起始点和终止点满足 f ( x s ) = y s f(x_s)=y_s f(xs)=ys, f ( x e ) = y e f(x_e)=y_e f(xe)=ye;
- 路径不穿过钢板边界线 B 3 − B 4 B3-B4 B3−B4。
根据拉格朗日乘子法,上述最优化问题可以转化为如下等价问题:
min f ( x ) ∫ x s x e 1 + [ f ′ ( x ) ] 2 d x + λ 1 [ f ( x s ) − y s ] + λ 2 [ f ( x e ) − y e ] + ∫ x s x e λ 3 ( x ) [ f ( x ) − B 3 ] d x + ∫ x s x e λ 4 ( x ) [ B 4 − f ( x ) ] d x \min_{f(x)}\int_{x_s}^{x_e}\sqrt{1+[f'(x)]^2}dx+\lambda_1[f(x_s)-y_s]+\lambda_2[f(x_e)-y_e]+\int_{x_s}^{x_e}\lambda_3(x)[f(x)-B3]dx+\int_{x_s}^{x_e}\lambda_4(x)[B4-f(x)]dx f(x)min∫xsxe1+[f′(x)]2dx+λ1[f(xs)−ys]+λ2[f(xe)−ye]+∫xsxeλ3(x)[f(x)−B3]dx+∫xsxeλ4(x)[B4−f(x)]dx
其中 λ 1 \lambda_1 λ1、 λ 2 \lambda_2 λ2、 λ 3 ( x ) \lambda_3(x) λ3(x)、 λ 4 ( x ) \lambda_4(x) λ4(x)是拉格朗日乘子。令函数 L L L为:
L = ∫ x s x e 1 + [ f ′ ( x ) ] 2 d x + λ 1 [ f ( x s ) − y s ] + λ 2 [ f ( x e ) − y e ] + ∫ x s x e λ 3 ( x ) [ f ( x ) − B 3 ] d x + ∫ x s x e λ 4 ( x ) [ B 4 − f ( x ) ] d x L=\int_{x_s}^{x_e}\sqrt{1+[f'(x)]^2}dx+\lambda_1[f(x_s)-y_s]+\lambda_2[f(x_e)-y_e]+\int_{x_s}^{x_e}\lambda_3(x)[f(x)-B3]dx+\int_{x_s}^{x_e}\lambda_4(x)[B4-f(x)]dx L=∫xsxe1+[f′(x)]2dx+λ1[f(xs)−ys]+λ2[f(xe)−ye]+∫xsxeλ3(x)[f(x)−B3]dx+∫xsxeλ4(x)[B4−f(x)]dx
则 L L L的极值点满足如下方程组:
∂ L ∂ f ( x ) = f ′ ( x ) 1 + [ f ′ ( x ) ] 2 + λ 1 + λ 3 ( x ) − λ 4 ( x ) = 0 \frac{\partial L}{\partial f(x)}=\frac{f'(x)}{\sqrt{1+[f'(x)]^2}}+\lambda_1+\lambda_3(x)-\lambda_4(x)=0 ∂f(x)∂L=1+[f′(x)]2f′(x)+λ1+λ3(x)−λ4(x)=0
∂ L ∂ λ 1 = f ( x s ) − y s = 0 \frac{\partial L}{\partial \lambda_1}=f(x_s)-y_s=0 ∂λ1∂L=f(xs)−ys=0
∂ L ∂ λ 2 = f ( x e ) − y e = 0 \frac{\partial L}{\partial \lambda_2}=f(x_e)-y_e=0 ∂λ2∂L=f(xe)−ye=0
∂ L ∂ λ 3 ( x ) = f ( x ) − B 3 = 0 \frac{\partial L}{\partial \lambda_3(x)}=f(x)-B3=0 ∂λ3(x)∂L=f(x)−B3=0
∂ L ∂ λ 4 ( x ) = B 4 − f ( x ) = 0 \frac{\partial L}{\partial \lambda_4(x)}=B4-f(x)=0 ∂λ4(x)∂L=B4−f(x)=0
解上述方程组可以得到最优路径函数 f ( x ) f(x) f(x)及对应的拉格朗日乘子 λ 1 \lambda_1 λ1、 λ 2 \lambda_2 λ2、 λ 3 ( x ) \lambda_3(x) λ3(x)、 λ 4 ( x ) \lambda_4(x) λ4(x),从而得到最优切割路径,并计算出最优切割路径的空程总长度 L L L。
钢板切割路径规划数学模型可以推广到N1、N2、N3的情况,只需要根据具体的布局图中的参数信息,确定切割起始点、终止点和边界线,建立相应的约束条件和求解方程组即可。
对于第四个问题N4,需要考虑“过桥”的问题,设计最优切割路径方案的思路如下:
- 首先根据布局图中的参数信息,确定钢板的初始位置、切割起始点、终止点和边界线;
- 然后建立数学模型,求解最优路径函数 f ( x ) f(x) f(x)和对应的拉格朗日乘子,得到最优切割路径;
- 在最优切割路径中,确定需要“过桥”的位置和数目;
- 根据需要“过桥”的位置和数目,重新设计最优切割路径,使得相邻零件可以通过“过桥”的方式连接在一起;
- 最后计算出最优切割路径的空程总长度 L L L。
由于小零件尺寸较小,为防止小零件掉落,需要采用“过桥”的方式使相邻零件连接成一个大尺寸零件。假设椭圆的长轴为a,短轴为b,小矩形零件的宽度为w,长度为l,过桥的宽度为2,则横向过桥的数量为𝑁1 = ⌊(a-2l)/w⌋,纵向过桥的数量为𝑁2 = ⌊(b-2l)/w⌋。过桥的位置应该在椭圆的中心线上,因此横向过桥的位置为𝑥1 = (a-2l-𝑁1w)/2,纵向过桥的位置为𝑥2 = (b-2l-𝑁2w)/2。
将N4中的小圆形切割件看做一个整体,它的切割路径可以按照问题3的方法进行优化,再将过桥的路径加入其中。因此,最优切割路径方案为:先切割椭圆,然后切割小圆形切割件,最后按照过桥的数量和位置进行过桥切割。
空程总长度为: L = N 1 ∗ 2 + N 2 ∗ 2 + ( a − 2 l − N 1 ∗ w ) + ( b − 2 l − N 2 ∗ w ) + 2 ∗ N 1 + 2 ∗ N 2 + 2 ∗ N 1 ∗ x 1 + 2 ∗ N 2 ∗ x 2 + 4 ∗ N 1 ∗ N 2 + 4 ∗ N 1 ∗ N 1 + 4 N 2 ∗ N 2 L = N_1*2 + N_2*2 + (a-2l-N_1*w) + (b-2l-N_2*w) + 2*N_1 + 2*N_2 + 2*N_1*x1 + 2*N_2*x2 + 4*N_1*N_2 + 4*N_1*N_1 + 4N_2*N_2 L=N1∗2+N2∗2+(a−2l−N1∗w)+(b−2l−N2∗w)+2∗N1+2∗N2+2∗N1∗x1+2∗N2∗x2+4∗N1∗N2+4∗N1∗N1+4N2∗N2
更多内容具体可以看看我的下方名片!里面包含有华中杯一手资料与分析!
另外在赛中,我们也会陪大家一起解析华中杯的一些方向
关注 CS数模 团队,数模不迷路~