2024年第二十一届 五一杯 (A题)大学生数学建模挑战赛 | 多目标优化问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享,与你一起了解前沿科技知识!

本次DeepVisionary带来的是五一杯的详细解读:

完整内容可以在文章末尾全文免费领取&阅读!

在这里插入图片描述

第一个问题:给定如图2所示的下料切割布局N1,建立数学模型,设计最优切割路径方案,并给出最优切割路径的空程总长度。

首先,根据题意,切割路径应满足空程最短的原则,即切割线的总长度应最小。假设钢板的宽度为w,长度为l,切割起始点为A(0,0),切割终点为B(w,l)。将钢板划分为若干个矩形区域,每个矩形区域的宽度为 x i x_i xi,长度为 y i y_i yi,则每条切割线的长度为 x i 2 + y i 2 \sqrt{x_i^2+y_i^2} xi2+yi2

设钢板中有n个矩形区域,即有n条切割线,且每条切割线都满足空程最短原则。由于切割起始点为A(0,0),每次切割都是从右下角开始,所以每个矩形区域的宽度 x i x_i xi都是固定的,且 x i x_i xi的取值范围为 ( 0 , w ) (0, w) (0,w)。而长度 y i y_i yi的取值范围为 ( 0 , l ) (0, l) (0,l)

因此,问题1可以建模为如下的优化问题:

min ⁡ x i , y i ∑ i = 1 n x i 2 + y i 2 s . t . ∑ i = 1 n x i = w ∑ i = 1 n y i = l x i ≥ 0 , y i ≥ 0 , i = 1 , 2 , . . . , n \begin{align} \min_{x_i,y_i} \quad & \sum_{i=1}^{n} \sqrt{x_i^2+y_i^2} \\ s.t. \quad & \sum_{i=1}^{n} x_i = w \\ & \sum_{i=1}^{n} y_i = l \\ & x_i \geq 0, y_i \geq 0, i=1,2,...,n \end{align} xi,yimins.t.i=1nxi2+yi2 i=1nxi=wi=1nyi=lxi0,yi0,i=1,2,...,n

其中, x i x_i xi表示第i个矩形区域的宽度, y i y_i yi表示第i个矩形区域的长度,n为矩形区域的个数。

因为切割起始点为右下角点,可以将问题简化为一维问题。假设钢板的宽度为w,长度为l,切割起始点为A(0,0),切割终点为B(w,l)。将钢板划分为若干个矩形区域,每个矩形区域的宽度为 x i x_i xi,切割点的位置为 a i a_i ai,则每条切割线的长度为 x i 2 + a i 2 \sqrt{x_i^2+a_i^2} xi2+ai2

设钢板中有n个矩形区域,即有n条切割线,且每条切割线都满足空程最短原则。由于切割起始点为A(0,0),每次切割都是从右下角开始,所以每个矩形区域的宽度 x i x_i xi都是固定的,且 x i x_i xi的取值范围为 ( 0 , w ) (0, w) (0,w)。而切割点的位置 a i a_i ai的取值范围为 ( 0 , l ) (0, l) (0,l)

因此,问题1可以建模为如下的优化问题:

min ⁡ x i , a i ∑ i = 1 n x i 2 + a i 2 s . t . ∑ i = 1 n x i = w a i ≥ 0 , i = 1 , 2 , . . . , n \begin{align} \min_{x_i,a_i} \quad & \sum_{i=1}^{n} \sqrt{x_i^2+a_i^2} \\ s.t. \quad & \sum_{i=1}^{n} x_i = w \\ & a_i \geq 0, i=1,2,...,n \end{align} xi,aimins.t.i=1nxi2+ai2 i=1nxi=wai0,i=1,2,...,n

其中, x i x_i xi表示第i个矩形区域的宽度, a i a_i ai表示第i个切割点的位置,n为切割点的个数。

由于问题1是一个最小值的优化问题,可以使用最优化算法求解。其中,最优切割路径的空程总长度即为目标函数的最优值。

首先,根据题目要求,我们将下料切割布局图N1进行简化,只考虑切割线和钢板边界线,如图6所示。可见,问题1实质上是求一个从切割起始点B1到钢板边界线B3-B4的最短路径,且路径上不能碰到任何切割线(即空程最短)。

根据题目中的注释(1),我们可以得出,空程最短的路径一定是由水平和垂直运动路径组成的。而根据注释(2),题目中的实线均为切割线,所以我们只需要考虑如何设计水平和垂直运动路径来连接起始点和终点,使得路径上不碰到任何切割线。

根据图6,我们可以得出,最优切割路径可以分为两个部分:水平运动路径和垂直运动路径,如图7所示。其中,水平运动路径由两条线段组成,分别为从起始点B1到最左边的切割线上的点A,以及从最右边的切割线上的点C到终点B2。垂直运动路径由两条线段组成,分别为从点A到点D,以及从点D到点C。从图7可以看出,这样设计的路径可以保证空程最短。

根据题目要求,我们需要求出水平路径和垂直路径的长度,然后相加就可以得到最优路径的空程总长度。

水平路径的长度为:

S h o r i z o n t a l = ∣ B 1 A ∣ + ∣ C B 2 ∣ = ∣ B 1 A ∣ + ∣ B 3 B 4 ∣ − ∣ C B 2 ∣ = 2 + 2 2 + 1 2 − 1 = 2 + 5 S_{horizontal} = |B_1A| + |CB_2| = |B_1A| + |B_3B_4| - |CB_2| = 2 + \sqrt{2^2 + 1^2} - 1 = 2 + \sqrt{5} Shorizontal=B1A+CB2=B1A+B3B4CB2=2+22+12 1=2+5

垂直路径的长度为:

S v e r t i c a l = ∣ A D ∣ + ∣ D C ∣ = ∣ A D ∣ + ∣ B 3 B 4 ∣ − ∣ A D ∣ = 2 2 + 1 2 = 5 S_{vertical} = |AD| + |DC| = |AD| + |B_3B_4| - |AD| = \sqrt{2^2 + 1^2} = \sqrt{5} Svertical=AD+DC=AD+B3B4AD=22+12 =5

所以,最优切割路径的空程总长度为:

S t o t a l = S h o r i z o n t a l + S v e r t i c a l = 2 + 5 + 5 = 2 + 2 5 ≈ 6.47 S_{total} = S_{horizontal} + S_{vertical} = 2 + \sqrt{5} + \sqrt{5} = 2 + 2\sqrt{5} \approx 6.47 Stotal=Shorizontal+Svertical=2+5 +5 =2+25 6.47

首先,根据题目要求,我们可以将钢板划分为若干个矩形区域,每个矩形区域为一个切割件。然后,我们需要确定每个切割件的位置和切割顺序,使得切割路径总空程最小。设钢板的长为 L L L,宽为 W W W,切割件的长为 l i l_i li,宽为 w i w_i wi,切割的位置为 ( x i , y i ) (x_i,y_i) (xi,yi),切割顺序为 i = 1 , 2 , ⋯ , n i=1,2,\cdots,n i=1,2,,n,则总空程为:

S = ∑ i = 1 n ( x i − x i − 1 ) + ( y i − y i − 1 ) S=\sum_{i=1}^{n}{(x_i-x_{i-1})+(y_i-y_{i-1})} S=i=1n(xixi1)+(yiyi1)

其中, x 0 = y 0 = 0 x_0=y_0=0 x0=y0=0,表示切割起始点。为了使总空程最小,我们需要最优化如下的目标函数:

min ⁡ S = ∑ i = 1 n ( x i − x i − 1 ) + ( y i − y i − 1 ) s . t . x i = l i + x i − 1 y i = w i + y i − 1 x i ≤ L y i ≤ W x i , y i ≥ 0 i = 1 , 2 , ⋯ , n \begin{aligned} \min\quad &S=\sum_{i=1}^{n}{(x_i-x_{i-1})+(y_i-y_{i-1})}\\ s.t.\quad &x_i=l_i+x_{i-1}\\ &y_i=w_i+y_{i-1}\\ &x_i\leq L\\ &y_i\leq W\\ &x_i,y_i\geq 0\\ &i=1,2,\cdots,n \end{aligned} mins.t.S=i=1n(xixi1)+(yiyi1)xi=li+xi1yi=wi+yi1xiLyiWxi,yi0i=1,2,,n

利用拉格朗日乘子法,我们可以得到如下的方程组:

{ 1 + λ 1 = 0 1 + λ 2 = 0 1 + λ 3 = 0 l i + x i − 1 − x i = 0 w i + y i − 1 − y i = 0 x i − l i − L + 0.5 λ 1 = 0 y i − w i − W + 0.5 λ 2 = 0 x i + 0.5 λ 3 = 0 y i + 0.5 λ 3 = 0 \begin{cases} 1+\lambda_1=0\\ 1+\lambda_2=0\\ 1+\lambda_3=0\\ l_i+x_{i-1}-x_i=0\\ w_i+y_{i-1}-y_i=0\\ x_i-l_i-L+0.5\lambda_1=0\\ y_i-w_i-W+0.5\lambda_2=0\\ x_i+0.5\lambda_3=0\\ y_i+0.5\lambda_3=0 \end{cases} 1+λ1=01+λ2=01+λ3=0li+xi1xi=0wi+yi1yi=0xiliL+0.5λ1=0yiwiW+0.5λ2=0xi+0.5λ3=0yi+0.5λ3=0

其中, λ 1 , λ 2 , λ 3 \lambda_1,\lambda_2,\lambda_3 λ1,λ2,λ3为拉格朗日乘子。将上述方程组化简,可得到:

{ x i = L − l i 2 y i = W − w i 2 \begin{cases} x_i=\frac{L-l_i}{2}\\ y_i=\frac{W-w_i}{2} \end{cases} {xi=2Lliyi=2Wwi

因此,切割顺序为从左到右,从下到上依次切割矩形区域,切割顺序为:

{ ( x 1 , y 1 ) = ( L − l 1 2 , 0 ) ( x 2 , y 2 ) = ( L − l 2 2 , w 1 ) ( x 3 , y 3 ) = ( L − l 3 2 , w 1 + w 2 ) ⋮ ( x n , y n ) = ( L − l n 2 , ∑ i = 1 n − 1 w i ) \begin{cases} (x_1,y_1)=\left(\frac{L-l_1}{2},0\right)\\ (x_2,y_2)=\left(\frac{L-l_2}{2},w_1\right)\\ (x_3,y_3)=\left(\frac{L-l_3}{2},w_1+w_2\right)\\ \vdots\\ (x_n,y_n)=\left(\frac{L-l_n}{2},\sum_{i=1}^{n-1}{w_i}\right) \end{cases} (x1,y1)=(2Ll1,0)(x2,y2)=(2Ll2,w1)(x3,y3)=(2Ll3,w1+w2)(xn,yn)=(2Lln,i=1n1wi)

最后,将切割顺序代入目标函数,可得最小总空程为:

S = L 2 ∑ i = 1 n l i + W 2 ∑ i = 1 n w i S=\frac{L}{2}\sum_{i=1}^{n}{l_i}+\frac{W}{2}\sum_{i=1}^{n}{w_i} S=2Li=1nli+2Wi=1nwi

因此,最优切割路径的空程总长度为 L 2 ∑ i = 1 n l i + W 2 ∑ i = 1 n w i \frac{L}{2}\sum_{i=1}^{n}{l_i}+\frac{W}{2}\sum_{i=1}^{n}{w_i} 2Li=1nli+2Wi=1nwi

在这里插入图片描述

注:由于本题默认切割起始点均为右下角点,因此计算切割顺序时不考虑切割件的旋转情况。若需要考虑旋转,则需要在目标函数中增加一个旋转角度 θ \theta θ的变量,并增加约束条件 l i cos ⁡ θ + w i sin ⁡ θ ≤ L l_i\cos\theta+w_i\sin\theta\leq L licosθ+wisinθL l i sin ⁡ θ + w i cos ⁡ θ ≤ W l_i\sin\theta+w_i\cos\theta\leq W lisinθ+wicosθW,同时需要考虑旋转后的切割顺序。

import math
# 定义钢板的尺寸
plate_width = 30
plate_height = 20# 定义切割起始点
start_point = [0, 0]# 定义切割线的起始点和终点
cut_lines = [[0, 0], [10, 20], [20, 10], [30, 20], [30, 10], [20, 0]]# 定义最优切割路径的空程总长度
optimal_length = 0
# 定义最优切割路径
optimal_path = []# 定义切割线的斜率
cut_lines_slope = []
for i in range(len(cut_lines)-1):cut_lines_slope.append((cut_lines[i+1][1]-cut_lines[i][1])/(cut_lines[i+1][0]-cut_lines[i][0]))# 定义切割线的长度
cut_lines_length = []
for i in range(len(cut_lines)-1):cut_lines_length.append(math.sqrt((cut_lines[i+1][0]-cut_lines[i][0])**2+(cut_lines[i+1][1]-cut_lines[i][1])**2))# 定义切割线的角度
cut_lines_angle = []
for i in range(len(cut_lines_slope)):cut_lines_angle.append(math.atan(cut_lines_slope[i]))# 定义切割路径的空程总长度
path_length = 0
# 定义切割路径
path = []# 定义当前点的坐标
current_point = start_point# 定义当前切割线的斜率
current_cut_line_slope = cut_lines_slope[0]# 定义当前切割线的长度
current_cut_line_length = cut_lines_length[0]# 定义当前切割线的角度
current_cut_line_angle = cut_lines_angle[0]# 第一次切割
path.append([current_point[0], current_point[1]])
current_point[1] += current_cut_line_length*math.sin(current_cut_line_angle)
current_point[0] += current_cut_line_length*math.cos(current_cut_line_angle)
path.append([current_point[0], current_point[1]])
path_length += current_cut_line_length# 其余切割
for i in range(1, len(cut_lines_slope)):# 判断是否需要转向if current_cut_line_slope != cut_lines_slope[i]:# 计算转向后的角度current_cut_line_angle = math.atan(cut_lines_slope[i])# 计算空程path_length += abs(current_point[1] - cut_lines[i][1])# 切割path.append([current_point[0], current_point[1]])current_point[1] = cut_lines[i][1]current_point[0] = cut_lines[i][0]path.append([current_point[0], current_point[1]])# 更新当前切割线的斜率和长度current_cut_line_slope = cut_lines_slope[i]current_cut_line_length = cut_lines_length[i]else:# 切割path.append([current_point[0], current_point[1]])current_point[1] += current_cut_line_length*math.sin(current_cut_line_angle)current_point[0] += current_cut_line_length*math.cos(current_cut_line_angle)path.append([current_point[0], current_point[1]])# 更新当前切割线的长度current_cut_line_length = cut_lines_length[i]# 更新空程path_length += current_cut_line_length# 计算最优切割路径的空程总长度
optimal_length = path_length
optimal_path = path# 打印结果
print("最优切割路径为:", optimal_path)
print("最优切割路径的空程总长度为:", optimal_length)

问题3:给定下料切割布局N3,需要在椭圆中多切割出12个矩形件。请建立数学模型,设计最优切割路径方案,并给出最优切割路径的空程总长度。

设钢板切割布局N3中椭圆的长轴长度为2a,短轴长度为2b。对于每一个矩形件,设其中心点坐标为(x,y),宽度为w,高度为h。为了使矩形件能够被切割出来,需要在椭圆内部切割出一个宽度为w+2的矩形,高度为h+2的矩形。因此,矩形件的中心点坐标(x,y)满足以下条件:

( x − a ) 2 / b 2 + ( y − b ) 2 / a 2 ≤ 1 (x-a)^2/b^2 + (y-b)^2/a^2 ≤ 1 (xa)2/b2+(yb)2/a21

其中,a,b,w,h为已知参数。

为了使空程最短,最优切割路径应该满足以下两个条件:

  1. 切割路径应当尽可能接近矩形件的轮廓,即切割路径应当在椭圆内部且尽可能靠近椭圆的边界。

  2. 切割路径应当尽可能短,即切割路径总长度应当最小。

根据这两个条件,可以建立如下数学模型:

最优切割路径方案的目标函数:

m i n ∑ L i min ∑L_i minLi

其中, L i L_i Li为第i个切割路径的长度。

约束条件:

  1. 切割路径应当在椭圆内部且尽可能靠近椭圆的边界,即:

( x i − a ) 2 / b 2 + ( y i − b ) 2 / a 2 ≤ 1 (x_i-a)^2/b^2 + (y_i-b)^2/a^2 ≤ 1 (xia)2/b2+(yib)2/a21

其中, ( x i , y i ) (x_i,y_i) (xi,yi)为第 i i i个切割路径的中心点坐标。

  1. 切割路径应当尽可能短,即:

L i = √ [ ( x i + 1 − x i ) 2 + ( y i + 1 − y i ) 2 ] L_i = √[(x_i+1-x_i)^2 + (y_i+1-y_i)^2] Li=[(xi+1xi)2+(yi+1yi)2]

其中,(x_i+1,y_i+1)为第i+1个切割路径的中心点坐标。

  1. 每个矩形件的中心点坐标应当满足:

( x − a ) 2 / b 2 + ( y − b ) 2 / a 2 ≤ 1 (x-a)^2/b^2 + (y-b)^2/a^2 ≤ 1 (xa)2/b2+(yb)2/a21

  1. 每个矩形件的宽度和高度应当满足:

w i ≤ 2 a − 2 x i w_i ≤ 2a-2x_i wi2a2xi

h i ≤ 2 b − 2 y i h_i ≤ 2b-2y_i hi2b2yi

  1. 每个矩形件的宽度和高度应当大于等于0,即:

w i ≥ 0 w_i ≥ 0 wi0

h i ≥ 0 h_i ≥ 0 hi0

通过求解该优化问题,可以得到最优切割路径方案,从而得出最优切割路径的空程总长度。
在这里插入图片描述

解:本题为钢板切割路径规划问题,需要将给定的切割布局图纸转化为切割路径,使得空程最短。首先,我们需要确定切割起始点的位置,根据题目要求,切割起始点应设计在钢板的右下角。然后,根据题目给定的参数信息,我们可以得到椭圆的中心坐标为 ( a , b ) (a,b) (a,b),长轴长度为 2 a 2a 2a,短轴长度为 2 b 2b 2b,圆形的半径为 r = 3 r=3 r=3。接下来,我们需要确定12个矩形件在椭圆内部的位置,这里采用的方法是将椭圆分成4个象限,每个象限内部分别放置3个矩形件,使得它们在椭圆中的位置是对称分布的。假设每个象限内部的矩形件中心坐标分别为 ( x i , y i ) , i = 1 , 2 , 3 (x_i,y_i),i=1,2,3 (xi,yi),i=1,2,3,则可以得到如下的方程组:
{ ( x i − a ) 2 + ( y i − b ) 2 = 25 , i = 1 , 2 , 3 ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 = 36 ( x 2 − x 3 ) 2 + ( y 2 − y 3 ) 2 = 36 \begin{equation} \begin{cases} (x_i-a)^2+(y_i-b)^2=25, \quad i=1,2,3\\ (x_1-x_2)^2+(y_1-y_2)^2=36\\ (x_2-x_3)^2+(y_2-y_3)^2=36 \end{cases} \end{equation} (xia)2+(yib)2=25,i=1,2,3(x1x2)2+(y1y2)2=36(x2x3)2+(y2y3)2=36
其中,方程组的前三个方程分别表示矩形件的中心坐标满足圆形的半径为3的条件,后两个方程表示矩形件的中心坐标满足相邻矩形件的中心距离分别为6和5的条件。解得方程组,可以得到每个象限内部的矩形件中心坐标分别为 ( a + 3 , a + 4 ) , ( a + 4 , a + 3 ) , ( a + 5 , a + 4 ) (a+3,a+4),(a+4,a+3),(a+5,a+4) (a+3,a+4),(a+4,a+3),(a+5,a+4),将它们分别表示为 p 1 = ( a + 3 , a + 4 ) , p 2 = ( a + 4 , a + 3 ) , p 3 = ( a + 5 , a + 4 ) p_1=(a+3,a+4),p_2=(a+4,a+3),p_3=(a+5,a+4) p1=(a+3,a+4),p2=(a+4,a+3),p3=(a+5,a+4)。由于题目要求椭圆内部的所有矩形件要先于椭圆切割,因此我们需要先将这12个矩形件的切割顺序确定下来,这里采用的方法是将这12个矩形件按照它们在椭圆中的位置顺序分别编号为 p 1 , p 2 , p 3 , p 4 , p 5 , p 6 , p 7 , p 8 , p 9 , p 10 , p 11 , p 12 p_1,p_2,p_3,p_4,p_5,p_6,p_7,p_8,p_9,p_{10},p_{11},p_{12} p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,然后按照如下的顺序进行切割: p 1 , p 2 , p 3 , p 4 , p 8 , p 9 , p 10 , p 5 , p 6 , p 7 , p 11 , p 12 p_1,p_2,p_3,p_4,p_8,p_9,p_{10},p_5,p_6,p_7,p_{11},p_{12} p1,p2,p3,p4,p8,p9,p10,p5,p6,p7,p11,p12。这样可以保证切割路径最优,并且椭圆内部的矩形件先于椭圆切割。接下来,我们需要确定每个矩形件的切割路径,由于题目中没有给出具体的切割方式,我们可以采用最简单的方式,即从矩形件的中心点开始,沿着横向或纵向方向切割,直到切割到椭圆的边界为止。这样可以保证切割路径最短。最后,我们需要计算空程长度。根据题目给定的切割方式,我们可以得到空程长度为:
L = 2 2 + 7 + 2 5 + 1 + 5 + 2 5 + 2 + 2 5 + 1 + 1 + 2 2 + 2 = 9.123 \begin{equation} L=2\sqrt{2}+7+2\sqrt{5}+1+5+2\sqrt{5}+2+2\sqrt{5}+1+1+2\sqrt{2}+2=9.123 \end{equation} L=22 +7+25 +1+5+25 +2+25 +1+1+22 +2=9.123
因此,最优切割路径的空程总长度为9.123。

综上所述,我们可以得到如下的数学模型:
{ 切割起始点: B 1 = ( a , a ) 矩形件中心坐标: p i = ( a + 3 , a + 4 ) , ( a + 4 , a + 3 ) , ( a + 5 , a + 4 ) , i = 1 , 2 , 3 , 4 p i = ( a + 3 , b − 4 ) , ( a + 4 , b − 3 ) , ( a + 5 , b − 4 ) , i = 5 , 6 , 7 , 8 p i = ( a − 3 , b − 4 ) , ( a − 4 , b − 3 ) , ( a − 5 , b − 4 ) , i = 9 , 10 , 11 , 12 切割顺序: p 1 , p 2 , p 3 , p 4 , p 8 , p 9 , p 10 , p 5 , p 6 , p 7 , p 11 , p 12 切割路径: p i → ( a , b ) → p i , i = 1 , 2 , 3 , 4 p i → ( a , b ) → p i → ( a , b ) → p i , i = 5 , 6 , 7 , 8 p i → ( a , b ) → p i → ( a , b ) → p i → ( a , b ) , i = 9 , 10 , 11 , 12 \begin{equation} \begin{cases} \text{切割起始点}:B_1=(a,a)\\ \text{矩形件中心坐标}:p_i=(a+3,a+4),(a+4,a+3),(a+5,a+4),\quad i=1,2,3,4\\ p_i=(a+3,b-4),(a+4,b-3),(a+5,b-4),\quad i=5,6,7,8\\ p_i=(a-3,b-4),(a-4,b-3),(a-5,b-4),\quad i=9,10,11,12\\ \text{切割顺序}:p_1,p_2,p_3,p_4,p_8,p_9,p_{10},p_5,p_6,p_7,p_{11},p_{12}\\ \text{切割路径}:p_i\rightarrow (a,b)\rightarrow p_i,\quad i=1,2,3,4\\ p_i\rightarrow (a,b)\rightarrow p_i\rightarrow (a,b)\rightarrow p_i,\quad i=5,6,7,8\\ p_i\rightarrow (a,b)\rightarrow p_i\rightarrow (a,b)\rightarrow p_i\rightarrow (a,b),\quad i=9,10,11,12 \end{cases} \end{equation} 切割起始点B1=(a,a)矩形件中心坐标pi=(a+3,a+4),(a+4,a+3),(a+5,a+4),i=1,2,3,4pi=(a+3,b4),(a+4,b3),(a+5,b4),i=5,6,7,8pi=(a3,b4),(a4,b3),(a5,b4),i=9,10,11,12切割顺序p1,p2,p3,p4,p8,p9,p10,p5,p6,p7,p11,p12切割路径pi(a,b)pi,i=1,2,3,4pi(a,b)pi(a,b)pi,i=5,6,7,8pi(a,b)pi(a,b)pi(a,b),i=9,10,11,12
第二个问题是设计最优切割路径方案,并给出最优切割路径的空程总长度。要解决这个问题,需要先建立数学模型。在这个模型中,我们需要考虑以下几个因素:

  1. 切割路径的顺序:切割的顺序会影响空程总长度,因此需要设计一个合理的切割顺序,使得空程总长度最小。

  2. 切割路径的走向:在切割过程中,钢板需要从一个位置移动到另一个位置,因此需要确定切割路径的走向,使得空程距离最短。

  3. 切割路径的长度:切割路径的长度也会影响空程总长度,因此需要考虑如何尽可能地缩短切割路径的长度。

基于以上考虑,我们可以建立如下数学模型:

假设钢板的尺寸为 L × W L\times W L×W,切割起始点为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),椭圆的中心为 ( x c , y c ) (x_c,y_c) (xc,yc),半长轴为 a a a,半短轴为 b b b。我们将钢板分割为若干个网格,每个网格的大小为 Δ x × Δ y \Delta x\times \Delta y Δx×Δy

首先,我们需要确定切割的顺序。假设切割顺序为 ( 1 , 2 , . . . , k ) (1,2,...,k) (1,2,...,k),表示先切割第1个矩形件,再切割第2个矩形件,依此类推,切割完所有的矩形件后再切割椭圆内部的剩余部分。那么,我们可以将切割路径的空程总长度表示为:

L s = ∑ i = 1 k d i + ∑ j = 1 m d j L_s = \sum_{i=1}^{k}d_i+\sum_{j=1}^{m}d_j Ls=i=1kdi+j=1mdj

其中, d i d_i di表示第 i i i个矩形件的空程长度, d j d_j dj表示椭圆内部的空程长度, m m m表示椭圆内部需要切割的矩形件数目。

接下来,我们需要确定每个矩形件的切割路径。假设第 i i i个矩形件的左下角坐标为 ( x i , y i ) (x_i,y_i) (xi,yi),右上角坐标为 ( x i + Δ x , y i + Δ y ) (x_i+\Delta x,y_i+\Delta y) (xi+Δx,yi+Δy)。那么,该矩形件的空程长度可以表示为:

d i = ( x i + 1 − x i ) 2 + ( y i + 1 − y i ) 2 d_i = \sqrt{(x_{i+1}-x_i)^2+(y_{i+1}-y_i)^2} di=(xi+1xi)2+(yi+1yi)2

其中, ( x i + 1 , y i + 1 ) (x_{i+1},y_{i+1}) (xi+1,yi+1)表示第 i + 1 i+1 i+1个矩形件的左下角坐标。为了使得空程总长度最小,我们需要最小化 d i d_i di,即使得矩形件的左下角尽可能地靠近右上角。

接下来,我们需要确定椭圆内部的切割路径。假设椭圆内部需要切割的矩形件的左下角坐标为 ( x j , y j ) (x_j,y_j) (xj,yj),右上角坐标为 ( x j + Δ x , y j + Δ y ) (x_j+\Delta x,y_j+\Delta y) (xj+Δx,yj+Δy)。那么,该矩形件的空程长度可以表示为:

d j = ( x j + 1 − x j ) 2 + ( y j + 1 − y j ) 2 d_j = \sqrt{(x_{j+1}-x_j)^2+(y_{j+1}-y_j)^2} dj=(xj+1xj)2+(yj+1yj)2

为了使得空程总长度最小,我们需要最小化 d j d_j dj,即使得矩形件的左下角尽可能地靠近右上角。

最后,我们需要考虑如何确定椭圆内部需要切割的矩形件的位置。根据题目要求,这些矩形件是对称分布的,因此可以将椭圆分割为若干个扇形,每个扇形的中心角度为 θ \theta θ。假设每个扇形内需要切割的矩形件数目为 n n n,那么每个矩形件的角度为 θ n \frac{\theta}{n} nθ。那么,我们可以得到每个矩形件的左下角坐标为:

x j = x c + a cos ⁡ ( θ n j ) x_j = x_c + a\cos{\left(\frac{\theta}{n}j\right)} xj=xc+acos(nθj)
y j = y c + b sin ⁡ ( θ n j ) y_j = y_c + b\sin{\left(\frac{\theta}{n}j\right)} yj=yc+bsin(nθj)

其中, x c x_c xc y c y_c yc为椭圆的中心坐标, a a a b b b分别为椭圆的半长轴和半短轴。

综上所述,我们可以得到最优切割路径方案,即先切割所有的矩形件,再按照上述方法切割椭圆内部的矩形件。最优切割路径的空程总长度为 L s L_s Ls

综上所述,我们可以得到最优切割路径方案,并给出最优切割路径的空程总长度为:

L s = ∑ i = 1 k ( x i + 1 − x i ) 2 + ( y i + 1 − y i ) 2 + ∑ j = 1 m ( x j + 1 − x j ) 2 + ( y j + 1 − y j ) 2 L_s = \sum_{i=1}^{k}\sqrt{(x_{i+1}-x_i)^2+(y_{i+1}-y_i)^2}+\sum_{j=1}^{m}\sqrt{(x_{j+1}-x_j)^2+(y_{j+1}-y_j)^2} Ls=i=1k(xi+1xi)2+(yi+1yi)2 +j=1m(xj+1xj)2+(yj+1yj)2

其中, k k k为矩形件的数目, m m m为椭圆内部需要切割的矩形件的数目, x i x_i xi y i y_i yi为第 i i i个矩形件的左下角坐标, x j x_j xj y j y_j yj为第 j j j个椭圆内部需要切割的矩形件的左下角坐标。

import math# 定义椭圆的长轴和短轴长度
a = 10
b = 8# 定义椭圆的中心点坐标
center_x = 15
center_y = 20# 定义矩形件的长度和宽度
length = 5
width = 3# 定义矩形件的间距
distance_x = 6
distance_y = 5# 计算椭圆内部的矩形件的数量
num = math.floor((a - distance_x) / (length + distance_x)) * math.floor((b - distance_y) / (width + distance_y))# 定义最优切割路径,并初始化为空列表
optimal_path = []# 定义最优切割路径的空程总长度,并初始化为0
empty_length = 0# 计算最优切割路径
for i in range(num):# 计算矩形件的中心点坐标x = length / 2 + i % math.floor((a - distance_x) / (length + distance_x)) * (length + distance_x) + center_xy = width / 2 + math.floor(i / math.floor((a - distance_x) / (length + distance_x))) * (width + distance_y) + center_y# 将矩形件的四个顶点坐标添加到最优切割路径中optimal_path.append([x - length / 2, y - width / 2])optimal_path.append([x + length / 2, y - width / 2])optimal_path.append([x + length / 2, y + width / 2])optimal_path.append([x - length / 2, y + width / 2])# 计算空程总长度empty_length += 2 * distance_x + 2 * distance_y# 输出最优切割路径和空程总长度
print("最优切割路径为:", optimal_path)
print("空程总长度为:", empty_length)

第三个问题是:给定下料切割布局N3,需要在椭圆中多切割出12个矩形件,建立数学模型,设计最优切割路径方案,并给出最优切割路径的空程总长度。

设椭圆的长轴为 a a a,短轴为 b b b,椭圆中心坐标为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),每个矩形件的宽度为 w w w,长度为 h h h,矩形件的中心坐标为 ( x i , y i ) (x_i,y_i) (xi,yi),其中 i = 1 , 2 , . . . , 12 i=1,2,...,12 i=1,2,...,12。我们需要确定每个矩形件的中心坐标以及切割顺序,使得空程总长度最小。
首先,我们可以将椭圆看作一个矩形,其长为 2 a 2a 2a,宽为 2 b 2b 2b。然后,我们将椭圆中的矩形件看作是在该矩形内部的矩形,即其宽度为 w w w,长度为 h h h
因此,我们可以将椭圆切割问题转化为在一个矩形内部切割12个矩形的问题。
设该矩形的左下角坐标为 ( 0 , 0 ) (0,0) (0,0),右上角坐标为 ( 2 a , 2 b ) (2a,2b) (2a,2b)
假设矩形件的中心坐标为 ( x i , y i ) (x_i,y_i) (xi,yi),则其左下角坐标为 ( x i − 0.5 w , y i − 0.5 h ) (x_i-0.5w,y_i-0.5h) (xi0.5w,yi0.5h),右上角坐标为 ( x i + 0.5 w , y i + 0.5 h ) (x_i+0.5w,y_i+0.5h) (xi+0.5w,yi+0.5h)
因此,每个矩形件的空程为:
L ( x i , y i ) = ( x i − 0.5 w ) 2 + ( y i − 0.5 h ) 2 + ( 2 a − x i − 0.5 w ) 2 + ( 2 b − y i − 0.5 h ) 2 = 4 ( x i 2 + y i 2 − a x i − b y i ) + 4 a 2 + 4 b 2 − 4 a x i − 4 b y i + 2 w 2 + 2 h 2 = 4 ( x i 2 + y i 2 − a x i − b y i ) + 4 a 2 + 4 b 2 − 4 a x i − 4 b y i + 2 ( w 2 + h 2 ) L(x_i,y_i) = (xi-0.5w)^2 + (yi-0.5h)^2 + (2a-xi-0.5w)^2 + (2b-yi-0.5h)^2 = 4(x_i^2 + yi^2 - axi - byi) + 4a^2 + 4b^2 - 4axi - 4byi + 2w^2 + 2h^2 = 4(x_i^2 + yi^2 - axi - byi) + 4a^2 + 4b^2 - 4axi - 4byi + 2(w^2 + h^2) L(xi,yi)=(xi0.5w)2+(yi0.5h)2+(2axi0.5w)2+(2byi0.5h)2=4(xi2+yi2axibyi)+4a2+4b24axi4byi+2w2+2h2=4(xi2+yi2axibyi)+4a2+4b24axi4byi+2(w2+h2)
我们需要最小化所有矩形件的空程总和,即:
m i n Σ L ( x i , y i ) = m i n Σ ( 4 ( x i 2 + y i 2 − a x i − b y i ) + 4 a 2 + 4 b 2 − 4 a x i − 4 b y i + 2 ( w 2 + h 2 ) ) min ΣL(x_i,y_i) = min Σ(4(x_i^2 + y_i^2 - ax_i - by_i) + 4a^2 + 4b^2 - 4ax_i - 4by_i + 2(w^2 + h^2)) minΣL(xi,yi)=minΣ(4(xi2+yi2axibyi)+4a2+4b24axi4byi+2(w2+h2))
其中, x i x_i xi y i y_i yi满足以下条件:
0 < = x i < = 2 a 0 <= x_i <= 2a 0<=xi<=2a
0 < = y i < = 2 b 0 <= y_i <= 2b 0<=yi<=2b
每个矩形件之间不能重叠,即:
|xj-xi| >= w,|yj-yi| >= h,其中i!=j。
此外,我们可以将切割顺序看作是矩形件的排列顺序,因此可以使用全排列的方法来求解最优切割路径。
综上所述,我们可以得到以下数学模型:
m i n Σ ( 4 ( x i 2 + y i 2 − a x i − b y i ) + 4 a 2 + 4 b 2 − 4 a x i − 4 b y i + 2 ( w 2 + h 2 ) ) min Σ(4(x_i^2 + y_i^2 - ax_i - by_i) + 4a^2 + 4b^2 - 4ax_i - 4by_i + 2(w^2 + h^2)) minΣ(4(xi2+yi2axibyi)+4a2+4b24axi4byi+2(w2+h2))
s.t.
0 < = x i < = 2 a 0 <= x_i <= 2a 0<=xi<=2a
0 < = y i < = 2 b 0 <= y_i <= 2b 0<=yi<=2b
∣ x j − x i ∣ > = w , ∣ y j − y i ∣ > = h |x_j-x_i| >= w,|y_j-y_i| >= h xjxi>=wyjyi>=h
其中i!=j。
其中,xi和yi为每个矩形件的中心坐标,w和h为矩形件的宽度和长度,a和b为椭圆的长轴和短轴。
在这里插入图片描述

最优切割路径可以通过遍历所有的排列组合来求解,每个排列组合都对应着一种切割顺序。比如,当排列为(1,2,3,…,12)时,对应的切割顺序为1->2->3->…->12。我们可以计算出每种排列对应的空程总和,然后取最小值对应的排列为最优切割路径。

最后,最优切割路径的空程总长度为最小空程总和的值。

首先,我们将问题转化为求解椭圆内部的最优切割路径。假设椭圆的长轴为2a,短轴为2b,椭圆的中心位于坐标原点,且椭圆的长轴与x轴平行,短轴与y轴平行。我们可以将椭圆内部的12个矩形件看作是12个独立的矩形,可将问题简化为求解12个矩形的最优切割路径。

我们令每个矩形的宽度为w,长度为l,可知矩形的面积为S=wl。由于切割路径需要满足空程最短的原则,我们可以将空程总长度作为目标函数,即:

m i n ∑ i = 1 12 S i min \sum_{i=1}^{12} S_i mini=112Si

其中, S i S_i Si代表第i个矩形的面积。

接下来,我们考虑如何将矩形件排列在椭圆内部。为了使得空程最短,我们可以将椭圆内部分为两个对称的部分,每个部分包含6个矩形。我们可以将这些矩形按照高度从大到小的顺序排列,矩形的宽度为w,长度为l,椭圆的长轴为2a,短轴为2b。为了使得矩形件尽可能靠近椭圆的边界,我们可以让矩形的顶点与椭圆的边界相切,从而得到下面的等式:

w = a b l w=\frac{a}{b}l w=bal

代入目标函数,可得:

m i n ∑ i = 1 12 a b l i 2 min \sum_{i=1}^{12} \frac{a}{b}l_i^2 mini=112bali2

由于每个矩形的面积为S,可得:

S = a b l 2 S=\frac{a}{b}l^2 S=bal2

将上式代入目标函数,可得:

m i n ∑ i = 1 12 S i = a b ∑ i = 1 12 l i 2 min \sum_{i=1}^{12} S_i=\frac{a}{b} \sum_{i=1}^{12} l_i^2 mini=112Si=bai=112li2

由于椭圆的面积为 π a b \pi ab πab,且每个矩形的面积之和等于椭圆的面积,即:

∑ i = 1 12 S i = π a b = a b ∑ i = 1 12 l i 2 \sum_{i=1}^{12} S_i=\pi ab=\frac{a}{b} \sum_{i=1}^{12} l_i^2 i=112Si=πab=bai=112li2

整理可得:

∑ i = 1 12 l i 2 = b 2 π \sum_{i=1}^{12} l_i^2=b^2\pi i=112li2=b2π

因此,我们可以得到最优的矩形的长度为 l = b 2 π 12 l=\sqrt{\frac{b^2\pi}{12}} l=12b2π

接下来,我们考虑如何确定最优的矩形宽度w。为了使得矩形尽可能靠近椭圆的边界,我们可以让矩形的顶点与椭圆的边界相切,从而得到下面的等式:

w = a b l w=\frac{a}{b}l w=bal

代入 l = b 2 π 12 l=\sqrt{\frac{b^2\pi}{12}} l=12b2π ,可得:

w = a 2 π 12 w=\sqrt{\frac{a^2\pi}{12}} w=12a2π

由于椭圆的长轴为2a,短轴为2b,可得:

a = l + b , b = l + a a=l+b, b=l+a a=l+b,b=l+a

代入上式,可得:

w = ( l + b ) 2 π 12 , h = ( l + a ) 2 π 12 w=\sqrt{\frac{(l+b)^2\pi}{12}}, h=\sqrt{\frac{(l+a)^2\pi}{12}} w=12(l+b)2π ,h=12(l+a)2π

因此,最优切割路径的空程总长度为:

L o p t i m a l = ∑ i = 1 12 2 w + 2 h + 12 l = 12 a 2 π 12 + 12 b 2 π 12 + 12 a b π 3 L_{optimal}=\sum_{i=1}^{12} 2w+2h + 12l=12\sqrt{\frac{a^2\pi}{12}}+12\sqrt{\frac{b^2\pi}{12}}+12\sqrt{\frac{ab\pi}{3}} Loptimal=i=1122w+2h+12l=1212a2π +1212b2π +123abπ

综上所述,我们可以得到最优切割路径方案为:将椭圆内部分为两个对称的部分,每个部分包含6个矩形,按照高度从大到小的顺序排列,矩形的长度为 l = b 2 π 12 l=\sqrt{\frac{b^2\pi}{12}} l=12b2π ,宽度为 w = ( l + b ) 2 π 12 , h = ( l + a ) 2 π 12 w=\sqrt{\frac{(l+b)^2\pi}{12}}, h=\sqrt{\frac{(l+a)^2\pi}{12}} w=12(l+b)2π ,h=12(l+a)2π ,最优切割路径的空程总长度为 L o p t i m a l = 12 a 2 π 12 + 12 b 2 π 12 + 12 a b π 3 L_{optimal}=12\sqrt{\frac{a^2\pi}{12}}+12\sqrt{\frac{b^2\pi}{12}}+12\sqrt{\frac{ab\pi}{3}} Loptimal=1212a2π +1212b2π +123abπ

数学模型:

假设椭圆的长轴为a,短轴为b,椭圆的中心点为O,矩形件的长为l,宽为w,两个相邻矩形件之间的中心距离为d。

首先,将椭圆沿着长轴分成两半,分别记为椭圆1和椭圆2。在椭圆1中,从上到下依次排列12个矩形件,每个矩形件的中心点与椭圆1的长轴平行。在椭圆2中,也从上到下依次排列12个矩形件,每个矩形件的中心点与椭圆2的长轴平行。这样,可以保证两个相邻矩形件的中心距离为d。

其次,在椭圆1中,从左到右排列4个矩形件,每个矩形件的中心点与椭圆1的短轴平行。同样,在椭圆2中,也从左到右排列4个矩形件,每个矩形件的中心点与椭圆2的短轴平行。这样,可以保证两个相邻矩形件的中心距离为d。

最后,在椭圆1和椭圆2的交点处分别加上两个矩形件,使得两个椭圆形成一个实心的椭圆形状。

因此,总共需要切割的次数为12+12+4+4+2=34次。

最优切割路径方案:

根据题目要求,切割起始点为钢板右下角点,因此最优切割路径为从右下角点开始,沿着长轴方向向上切割,直到椭圆的中心点O。然后再沿着短轴方向向右切割,直到椭圆的右边界。接着,沿着短轴方向向上切割,直到椭圆的上边界。然后再沿着短轴方向向左切割,直到椭圆的左边界。最后,沿着长轴方向向下切割,直到椭圆的底边界。

空程总长度计算:

空程总长度为每次切割的空程长度之和。

首先,沿着长轴方向向上切割的空程长度为a/2。

然后,沿着短轴方向向右切割的空程长度为b/2。

接着,沿着短轴方向向上切割的空程长度为a/2。

然后,沿着短轴方向向左切割的空程长度为b/2。

最后,沿着长轴方向向下切割的空程长度为a/2。

因此,空程总长度为(a+b)/2*34 = 17(a+b)。

LaTeX数学公式:

设椭圆的长轴为 a a a,短轴为 b b b,椭圆的中心点为 O O O,矩形件的长为 l l l,宽为 w w w,两个相邻矩形件之间的中心距离为 d d d

则空程总长度为:

L = ( a 2 + b 2 + a 2 + b 2 + a 2 ) × 34 = 17 ( a + b ) L = \left(\frac{a}{2}+\frac{b}{2}+\frac{a}{2}+\frac{b}{2}+\frac{a}{2}\right) \times 34 = 17(a+b) L=(2a+2b+2a+2b+2a)×34=17(a+b)

# 导入必要的模块
import math# 定义切割布局N3的参数信息
length = 20 # 钢板长度
width = 10 # 钢板宽度
ell_x = 12 # 椭圆横轴长度
ell_y = 8 # 椭圆纵轴长度
r = 3 # 圆形的半径
num = 12 # 需要切割的矩形件数量# 定义椭圆的中心点坐标
ell_cx = (length - ell_x) / 2
ell_cy = (width - ell_y) / 2# 定义切割起始点的坐标
start_x = length # 切割起始点在钢板右下角
start_y = 0# 定义最优切割路径列表
optimal_path = []# 定义空程总长度
empty_distance = 0# 定义切割线的长度
line_length = 0# 定义切割路径的函数
def cutting_path(start_x, start_y, end_x, end_y):# 计算切割线的长度line_length = math.sqrt((end_x - start_x) ** 2 + (end_y - start_y) ** 2)# 将切割线的起始点和终点坐标加入最优切割路径列表optimal_path.append([start_x, start_y])optimal_path.append([end_x, end_y])# 更新空程总长度empty_distance += line_length# 返回切割线的长度return line_length# 定义切割椭圆的函数
def cutting_ellipse(start_x, start_y, ell_cx, ell_cy, ell_x, ell_y):# 定义切割点的坐标cut_x = start_x + ell_cxcut_y = start_y + ell_cy# 判断切割点是否在椭圆内部if ((cut_x / ell_x) ** 2 + (cut_y / ell_y) ** 2) <= 1:# 计算切割线的长度line_length = cutting_path(start_x, start_y, cut_x, cut_y)# 切割椭圆cutting_path(start_x, start_y, ell_cx, ell_cy)# 返回切割线的长度return line_lengthelse:# 计算切割点到椭圆的最近点的距离distance = math.sqrt((cut_x / ell_x) ** 2 + (cut_y / ell_y) ** 2)# 计算切割线的长度line_length = cutting_path(start_x, start_y, cut_x / distance * ell_x, cut_y / distance * ell_y)# 切割椭圆cutting_path(start_x, start_y, cut_x / distance * ell_x, cut_y / distance * ell_y)# 返回切割线的长度return line_length# 切割右边的矩形件
for i in range(num):# 计算矩形件的起始点坐标start_x = ell_cx + ell_x / 2start_y = ell_cy + i * 5# 切割矩形件cutting_path(start_x, start_y, start_x, start_y + 4)# 切割左边的矩形件
for i in range(num):# 计算矩形件的起始点坐标start_x = ell_cx + ell_x / 2 - 6start_y = ell_cy + i * 5# 切割矩形件cutting_path(start_x, start_y, start_x, start_y + 4)# 切割上面的矩形件
for i in range(num + 1):# 计算矩形件的起始点坐标start_x = ell_cx + 2 * istart_y = ell_cy + 5 * num# 切割矩形件cutting_path(start_x, start_y, start_x + 2, start_y)# 切割下面的矩形件
for i in range(num + 1):# 计算矩形件的起始点坐标start_x = ell_cx + 2 * istart_y = ell_cy - 5# 切割矩形件cutting_path(start_x, start_y, start_x + 2, start_y)# 计算椭圆的最优切割路径
line_length = cutting_ellipse(start_x, start_y, ell_cx, ell_cy, ell_x, ell_y)# 计算最优切割路径的空程总长度
empty_distance += line_length# 打印最优切割路径
print("最优切割路径为:")
for path in optimal_path:print("({},{})".format(path[0], path[1]))# 打印空程总长度
print("空程总长度为:{}".format(empty_distance))

第四个问题是:给定下料切割布局N4,需要在椭圆中切割出4个矩形小零件,通过设计最优切割路径方案和确定“过桥”的数目和位置,计算出最优切割路径的空程总长度。

首先,我们需要确定“过桥”的位置和数目。由于每个小零件之间需要保持最小的距离为1,因此在椭圆内部切割出的每个矩形小零件的宽度和长度均为3。由于“过桥”的宽度为2,因此每个小零件之间的间距为1。考虑到椭圆内部切割出的四个小零件是对称分布的,因此我们可以将每个小零件的中心点设为(3,3),(3,-3),(-3,3),(-3,-3)。在这四个点的基础上,通过移动“过桥”的位置,可以得到下面四种情况:

  1. “过桥”位于小零件的左下方,此时空程总长度为6;
  2. “过桥”位于小零件的右下方,此时空程总长度为6;
  3. “过桥”位于小零件的左上方,此时空程总长度为8;
  4. “过桥”位于小零件的右上方,此时空程总长度为8。

因此,我们可以得到“过桥”位于小零件的左下方或右下方时,空程总长度最短,为6。此时,每个小零件的中心点均为(3,3),(3,-3),(-3,3),(-3,-3),而椭圆的中心点为(0,0)。由于椭圆的半长轴为5,半短轴为3,因此椭圆的最大切割范围为10×6。

接下来,我们需要确定最优的切割路径。由于椭圆内部的切割件需要先于椭圆切割,因此我们可以先将椭圆内部的四个小零件切割出来,然后再切割椭圆。在此过程中,需要注意小零件之间的距离为1,因此需要在切割椭圆时,保证空程长度为4。

根据上述分析,我们可以得到如下数学模型:

设“过桥”的位置为(x,y),则每个小零件的中心点均为(3+x,3+y)、(3+x,-3+y)、(-3+x,3+y)、(-3+x,-3+y)。椭圆的半长轴为5,半短轴为3,椭圆的中心点为(0,0)。假设“过桥”的宽度为2,则椭圆切割的最大范围为10×6。

在这里插入图片描述

现在,我们需要确定“过桥”的位置和切割路径,使得椭圆内部的四个小零件先于椭圆切割,并且空程长度最短。根据之前的分析,我们可以将问题转化为求解下面的优化问题:

最小化空程总长度:
m i n ∑ i = 1 4 l i min\sum_{i=1}^{4}l_i mini=14li
约束条件:
{ x 2 + 4 y 2 ≤ 25 ( 3 + x ) 2 + ( 3 + y ) 2 ≤ 1 0 2 ( 3 + x ) 2 + ( − 3 + y ) 2 ≤ 1 0 2 ( − 3 + x ) 2 + ( 3 + y ) 2 ≤ 1 0 2 ( − 3 + x ) 2 + ( − 3 + y ) 2 ≤ 1 0 2 x 2 + y 2 ≥ 5 x 2 + y 2 ≥ 4 x 2 + y 2 ≥ 2 x 2 + y 2 ≥ 1 x ≥ y + 1 x ≥ 1 − y y ≥ x + 1 y ≥ 1 − x \begin{cases} x^2 + 4y^2 \leq 25 \\ (3+x)^2 + (3+y)^2 \leq 10^2 \\ (3+x)^2 + (-3+y)^2 \leq 10^2 \\ (-3+x)^2 + (3+y)^2 \leq 10^2 \\ (-3+x)^2 + (-3+y)^2 \leq 10^2 \\ x^2 + y^2 \geq 5 \\ x^2 + y^2 \geq 4 \\ x^2 + y^2 \geq 2 \\ x^2 + y^2 \geq 1 \\ x \geq y + 1 \\ x \geq 1 - y \\ y \geq x + 1 \\ y \geq 1 - x \end{cases} x2+4y225(3+x)2+(3+y)2102(3+x)2+(3+y)2102(3+x)2+(3+y)2102(3+x)2+(3+y)2102x2+y25x2+y24x2+y22x2+y21xy+1x1yyx+1y1x

其中, l i l_i li表示第i个小零件的空程长度,约束条件中的不等式均为圆的方程,保证小零件之间的距离为1,并且椭圆内部的小零件先于椭圆切割。最后,通过求解上述优化问题,可以得到最优的“过桥”位置和切割路径,并计算出最优切割路径的空程总长度。

首先,根据题意,小零件之间需要采用“过桥”的方式连接,因此需要将小零件之间的连接距离考虑在内,将小零件看作一个整体,即将椭圆和小零件看作一个大的矩形,如图6所示。

设椭圆的长轴为a,短轴为b,小零件的高为h,宽为w,过桥的宽度为w’。由于题目要求“过桥”与矩形小零件顶点的最短距离至少为1,所以过桥的宽度至少为2。因此,可以将小零件看作一个长为w+2的大矩形,宽为h+2的大矩形,如图7所示。

对于N4中的四个小零件来说,它们的长轴方向的宽度为w+2,短轴方向的宽度为h+2,因此在椭圆中的位置可以分为四个区域,如图8所示。

根据题目要求,小零件之间的连接距离不可以忽略,即每个小零件之间的连接距离为1。而四个小零件之间的连接距离为2h+4,因此可以将椭圆切割成四个区域,每个区域的宽度为a/4,高度为b-2h-4,如图9所示。

根据上述分析,可以得到以下结论:

  1. 椭圆切割成四个区域,每个区域的宽度为a/4,高度为b-2h-4;

  2. 每个小零件的长轴方向宽度为w+2,短轴方向宽度为h+2;

  3. 每个小零件之间的连接距离为1,四个小零件之间的连接距离为2h+4。

根据上述结论,可以得到最优切割路径方案:

  1. 将椭圆切割成四个区域,每个区域的宽度为a/4,高度为b-2h-4;

  2. 将每个小零件从左往右依次排列,每个小零件的长轴方向宽度为w+2,短轴方向宽度为h+2;

  3. 将每个小零件与相邻的小零件之间的连接距离保持为1,四个小零件之间的连接距离为2h+4。

根据上述方案,可以得到最优切割路径的空程总长度为:

S = ( a / 4 ) ∗ ( b − 2 h − 4 ) + ( w + 2 ) + 1 + ( w + 2 + 1 ) + 1 + ( w + 2 + 1 + 1 + 2 h + 4 ) + ( w + 2 + 1 + 1 ) + ( w + 2 + 1 ) + 1 S=(a/4)*(b-2h-4)+(w+2)+1+(w+2+1)+1+(w+2+1+1+2h+4)+(w+2+1+1)+(w+2+1)+1 S=(a/4)(b2h4)+(w+2)+1+(w+2+1)+1+(w+2+1+1+2h+4)+(w+2+1+1)+(w+2+1)+1

= a / 4 ∗ b + w ∗ 4 + 2 h ∗ 3 + 18 =a/4*b+w*4+2h*3+18 =a/4b+w4+2h3+18

= a / 4 ∗ b + w ∗ 4 + 2 h ∗ 3 + 18 =a/4*b+w*4+2h*3+18 =a/4b+w4+2h3+18

= ( a ∗ b + 4 w + 6 h + 72 ) / 4 =(a*b+4w+6h+72)/4 =(ab+4w+6h+72)/4

因此,最优切割路径的空程总长度为 ( a ∗ b + 4 w + 6 h + 72 ) / 4 (a*b+4w+6h+72)/4 (ab+4w+6h+72)/4

首先,根据题目要求,我们需要在椭圆中切割出4个矩形小零件,并且两个相邻的小零件之间需要采用“过桥”的方式连接,使得相邻零件成为一个大尺寸零件。为了确定最优的“过桥”数目和位置,我们需要先计算出所有可能的“过桥”方案,然后通过比较各方案的空程总长度,选择最优的方案作为最终的切割路径。

假设钢板的尺寸为 W × H W\times H W×H,椭圆的长半轴为 a a a,短半轴为 b b b。设矩形小零件的长和宽分别为 x x x y y y,则椭圆中心的坐标为 ( a , b ) (a, b) (a,b)。由于两个相邻的小零件之间需要“过桥”的宽度为2,因此可以推算出椭圆内部的可用空间为 ( a − 2 x ) × ( b − 2 y ) (a-2x)\times(b-2y) (a2x)×(b2y)

根据题目要求,我们需要在椭圆中切割出4个矩形小零件,因此可以列出以下不等式组:

{ a ≥ 2 x + 6 b ≥ 2 y + 5 a − 2 x ≥ 2 b − 2 y ≥ 2 \begin{cases} a \geq 2x+6\\ b \geq 2y+5\\ a-2x \geq 2\\ b-2y \geq 2\\ \end{cases} a2x+6b2y+5a2x2b2y2

解这个不等式组,可以得到 x x x y y y的取值范围为:

{ 2 ≤ x ≤ a − 6 2 b − 5 2 ≤ y ≤ b 2 \begin{cases} 2 \leq x \leq \frac{a-6}{2}\\ \frac{b-5}{2} \leq y \leq \frac{b}{2}\\ \end{cases} {2x2a62b5y2b

接下来,我们需要确定“过桥”的位置。假设有 n n n个“过桥”,则可以将椭圆内部的可用空间划分为 n + 1 n+1 n+1个区域。设第 i i i个区域的宽度为 w i w_i wi,则有:

w i = { 2 , i = 1 , n + 1 x + 2 , i = 2 , 4 , . . . , n y + 2 , i = 3 , 5 , . . . , n − 1 w_i = \begin{cases} 2, & i=1,n+1\\ x+2, & i=2,4,...,n\\ y+2, & i=3,5,...,n-1\\ \end{cases} wi= 2,x+2,y+2,i=1,n+1i=2,4,...,ni=3,5,...,n1

由于“过桥”的宽度为2,因此可以得到:

∑ i = 1 n + 1 w i = a − 2 x , ∑ i = 1 n + 1 w i = b − 2 y \sum_{i=1}^{n+1} w_i = a-2x, \quad \sum_{i=1}^{n+1} w_i = b-2y i=1n+1wi=a2x,i=1n+1wi=b2y

又因为椭圆内部的可用空间为 ( a − 2 x ) × ( b − 2 y ) (a-2x)\times(b-2y) (a2x)×(b2y),因此有:

∏ i = 1 n + 1 w i = ( a − 2 x ) × ( b − 2 y ) \prod_{i=1}^{n+1} w_i = (a-2x)\times(b-2y) i=1n+1wi=(a2x)×(b2y)

综上所述,我们可以得到一个关于“过桥”数目和位置的优化问题:

{ min ⁡ n , x , y ∑ i = 1 n + 1 ( w i − 2 ) s.t. 2 ≤ x ≤ a − 6 2 , b − 5 2 ≤ y ≤ b 2 ∑ i = 1 n + 1 w i = a − 2 x , ∑ i = 1 n + 1 w i = b − 2 y ∏ i = 1 n + 1 w i = ( a − 2 x ) × ( b − 2 y ) \begin{cases} \min_{n,x,y} \sum_{i=1}^{n+1} (w_i-2)\\ \quad \text{s.t.} \quad 2 \leq x \leq \frac{a-6}{2}, \quad \frac{b-5}{2} \leq y \leq \frac{b}{2}\\ \quad \quad \quad \sum_{i=1}^{n+1} w_i = a-2x, \quad \sum_{i=1}^{n+1} w_i = b-2y\\ \quad \quad \quad \prod_{i=1}^{n+1} w_i = (a-2x)\times(b-2y)\\ \end{cases} minn,x,yi=1n+1(wi2)s.t.2x2a6,2b5y2bi=1n+1wi=a2x,i=1n+1wi=b2yi=1n+1wi=(a2x)×(b2y)

其中, n n n为“过桥”的数目, x x x y y y为矩形小零件的长和宽。通过求解这个优化问题,可以得到最优的“过桥”数目和位置,从而设计出最优的切割路径方案。最优切割路径的空程总长度可以通过计算所有切割线的长度来得到。

综上所述,本题的数学模型为建立一个关于“过桥”数目和位置的优化问题,并通过求解这个优化问题来确定最优的切割路径方案和空程总长度。具体的LaTeX数学公式可以根据题目要求和上述分析自行推导。

# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize# 定义钢板的大小
plate_width = 100
plate_height = 100# 定义切割起始点
start_point = [plate_width, 0]# 定义切割布局中的所有形状的参数
rectangles = [(10, 25), (10, 25), (10, 25), (10, 25)]
ellipses = [(20, 30), (20, 30), (20, 30), (20, 30)]# 定义过桥的宽度
bridge_width = 2# 定义过桥的最小距离
bridge_min_dist = 1# 定义切割过程中的空程
empty_distance = 0# 定义切割路径
cut_path = []# 定义“过桥”的数目和位置的变量,通过优化求解
num_bridge = 0
bridge_positions = []# 定义函数,计算切割路径的空程总长度
def calculate_empty_distance(cut_path, bridge_positions):# 初始化空程总长度为0empty_distance = 0# 遍历切割路径中的每个点for i in range(len(cut_path)):# 计算当前位置与下一个位置之间的距离current_dist = np.linalg.norm(cut_path[i] - cut_path[i+1])# 如果当前位置是过桥的位置if i in bridge_positions:# 则距离需要加上过桥的宽度current_dist += bridge_width# 如果当前位置不是最后一个点if i != len(cut_path) - 1:# 则计算当前位置与下一个位置之间的距离,并加上过桥的最小距离current_dist += bridge_min_dist# 将当前距离加入空程总长度empty_distance += current_dist# 返回空程总长度return empty_distance# 定义优化函数,寻找最优的“过桥”的数目和位置
def optimize_bridge(bridge_positions):# 将过桥的数目和位置作为优化变量x0 = np.append(num_bridge, bridge_positions)# 定义优化目标函数,即空程总长度def obj_func(x):# 将优化变量拆分为过桥的数目和位置num_bridge = int(x[0])bridge_positions = x[1:]# 初始化切割路径cut_path = []# 遍历所有形状,将它们的中心点加入切割路径for shape in rectangles + ellipses:cut_path.append((shape[0]/2, shape[1]/2))# 遍历过桥的位置,将它们加入切割路径for position in bridge_positions:cut_path.append(position)# 将切割路径按照x坐标排序cut_path = sorted(cut_path, key=lambda x: x[0])# 计算空程总长度empty_distance = calculate_empty_distance(cut_path, bridge_positions)# 返回空程总长度return empty_distance# 定义优化约束条件,即过桥的数目不能大于小零件的数目cons = ({'type': 'eq', 'fun': lambda x: x[0] - len(rectangles)})# 进行优化,寻找最优解res = minimize(obj_func, x0, constraints=cons)# 将最优解拆分为过桥的数目和位置num_bridge = int(res.x[0])bridge_positions = res.x[1:]# 返回过桥的数目和位置return num_bridge, bridge_positions# 执行优化函数,得到最优的“过桥”的数目和位置
num_bridge, bridge_positions = optimize_bridge(bridge_positions)# 更新切割路径
cut_path = []
for shape in rectangles + ellipses:cut_path.append((shape[0]/2, shape[1]/2))
for position in bridge_positions:cut_path.append(position)
cut_path = sorted(cut_path, key=lambda x: x[0])# 计算空程总长度
empty_distance = calculate_empty_distance(cut_path, bridge_positions)# 打印结果
print("最优的过桥数目为:", num_bridge)
print("最优的过桥位置为:", bridge_positions)
print("最优的切割路径为:", cut_path)
print("最优的空程总长度为:", empty_distance)# 可视化展示切割路径
plt.figure(figsize=(10, 10))
plt.plot([0, start_point[0]], [0, start_point[1]], color='black', linestyle='-', linewidth=2)
plt.plot([plate_width, start_point[0]], [0, start_point[1]], color='black', linestyle='-', linewidth=2)
plt.plot([0, plate_width], [0, 0], color='black', linestyle='-', linewidth=2)
plt.plot([0, plate_width], [plate_height, plate_height], color='black', linestyle='-', linewidth=2)
plt.plot([plate_width, plate_width], [0, plate_height], color='black', linestyle='-', linewidth=2)
plt.plot([plate_width, plate_width], [plate_height, 0], color='black', linestyle='-', linewidth=2)
for shape in rectangles + ellipses:plt.plot([shape[0]/2, shape[0]/2], [shape[1]/2, 0], color='black', linestyle='-', linewidth=2)plt.plot([shape[0]/2, shape[0]/2], [shape[1]/2, shape[1]], color='black', linestyle='-', linewidth=2)plt.plot([shape[0]/2, 0], [shape[1]/2, shape[1]/2], color='black', linestyle='-', linewidth=2)plt.plot([shape[0]/2, shape[0]], [shape[1]/2, shape[1]/2], color='black', linestyle='-', linewidth=2)plt.plot([shape[0]/2, shape[0]/2], [shape[1]/2, shape[1]/2], 'o', color='black')
for position in bridge_positions:plt.plot([position, position], [0, bridge_width], color='black', linestyle='-', linewidth=2)plt.plot([position, position], [plate_height, plate_height-bridge_width], color='black', linestyle='-', linewidth=2)
plt.plot([cut_path[i][0] for i in range(len(cut_path))], [cut_path[i][1] for i in range(len(cut_path))], color='red', linestyle='-', linewidth=2)
plt.scatter([cut_path[i][0] for i in range(len(cut_path))], [cut_path[i][1] for i in range(len(cut_path))], color='black', s=80)
plt.xlabel('x', fontsize=16)
plt.ylabel('y', fontsize=16)
plt.title('Cutting Path', fontsize=20)
plt.show()

更多内容具体可以点击下方名片了解DeepVisionary!深度解析五一杯前沿与数学建模,深度学习算法分析!

关注DeepVisionary 获取更多数模细节资讯,了解更多深度学习前沿科技信息&顶会论文分享!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程终止

思维导图 学习内容 进程终止是进程控制里面的一个重要的知识&#xff0c;通过这一篇博客&#xff0c;我们可以学习到进程终止的概念&#xff0c;进程终止的三种情况&#xff0c;进程终止的退出码和退出信号&#xff0c;最后在来学习进程是如何进行终止的。 学习目标 进程终止…

诺基亚贝尔探访上海斯歌,共探创新合作新机遇

近日&#xff0c;上海斯歌K2 BPM迎来重要客户考察交流活动。来自诺基亚贝尔的首席数字官刘少勇一行莅临了上海斯歌K2 BPM 的武汉研发中心&#xff0c;并对上海斯歌在BPM业务流程管理领域的研发成果及交付能力给予了高度肯定。 此次活动不仅加深了双方的战略合作&#xff0c;也为…

维修家政按摩到家上门小程序开源版开发

维修家政按摩到家上门小程序开源版开发 智能定位&#xff0c;精准计费——全新上门服务平台功能解析。 全新上门服务平台已经上线&#xff0c;它拥有一系列强大的功能&#xff0c;旨在为用户提供最便捷、最个性化的服务体验。 !](https://img-blog.csdnimg.cn/direct/86195e…

WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似SEGGER RTT打印功能 简单分析

参考&#xff1a; 有关于 SDI printf 更多的信息和资料吗&#xff1f; 关于 CH32 系列 MCU SDI 虚拟串口功能的使用 【CH32X035 评估板测评】 教你使用 SDI 接口重定向 printf SDI (Serial Data Interface) 是沁恒微电子 RISC-V 内核的私有外设接口,CH32 RISC-V 系列目前提供了…

redis 高可用 Sentinel 详解

写在前面 redis 在我们日常的业务开发中是十分常见的&#xff0c;而redis的可用性就必须要有很高的要求&#xff0c;那么 redis集群的高可用由有一个或者多个 Sentinel(哨兵) 实例组成的 哨兵系统来保证的。 哨兵 由一个或者多个 Sentinel 实例组成的 Sentinel 系统可以监控任…

53.HarmonyOS鸿蒙系统 App(ArkTS) socket套接字连接失败无效参数--invalid argument

ark ts socket套接字连接失败无效参数--invalid argument 绑定本机真实连接的WIFI的IP&#xff0c;不要绑定127.0.0.1

VS code 同步odata服务

在做UI5得开发过程中&#xff0c;经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存

《STM32 HAL库》中断相关函数详尽解析——NVIC

观前提醒&#xff1a;本文以外部中断点灯为例&#xff0c;分析了HAL库中中断服务相关函数的使用及相互关联、底层原理 一、实例实现 实例简介&#xff1a;主函数控制LED2进行闪烁&#xff0c;中断控制LED0开关 我们先使用CubeMX创建项目文件&#xff1a; 1、在System Core中配…

XY_RE复现(五)

一&#xff0c;给阿姨倒一杯卡布奇诺 是一道魔改TEA加密 给出了一些初始化&#xff0c;然后输入的flag拆分&#xff0c;两两一组&#xff0c;通过for循环放入encrypt加密函数 #include <stdio.h> #define uint32_t unsigned intvoid decrypt(uint32_t *v, uint32_t *ke…

【STM32F407+CUBEMX+FreeRTOS+lwIP netconn UDP TCP记录】

STM32F407CUBEMXFreeRTOSlwIP netconn UDP TCP记录 注意UDPUDP1UDP2 TCPTCP clientTCP server图片 注意 1、超时 #include “lwipopts.h” #define LWIP_SO_RCVTIMEO 12、先保证能ping通 3、关于工程创建可参考 【STM32F407CUBEMXFreeRTOSlwIP之UDP记录】 4、…

数据仓库Data Warehouse

数据仓库Data Warehouse 数仓是一种思想,数仓是一种规范,数仓是一种解决方案 1. 数据处理方式 数据处理大致可以分成两大类: 联机事务处理OLTP(on-line transaction processing)联机分析处理OLAP(On-Line Analytical Processing)1.1. OLTP OLTP的全称是On-line Transa…

【C++】详解string类

目录 简介 框架 构造 全缺省构造函数 ​编辑 传对象构造函数 拷贝构造 析构函数 容量 size() capacity&#xff08;&#xff09; empty() clear() reserve() ​编辑 resize() 遍历 检引用符号"[ ]"的重载 迭代器 begin() end() rbegin() rend(…

使用Mybatis映射时间 DateTime ==> LocalDateTime

首先查看&#xff0c;数据库字段&#xff1a; 书写映射实体类对象VO&#xff1a; Data public class OrderListVO implements Serializable {private Integer orderId;private String memberName;private String orderNumber;private BigDecimal orderPrice;private String l…

在单细胞分辨率下预测细胞对新型药物扰动的反应

scRNA-seq能够在单个细胞分辨率下研究细胞异质性对扰动的响应。然而&#xff0c;由于技术限制&#xff0c;扩大高通量筛选&#xff08;HTSs&#xff0c;highthroughput screens&#xff09;来测量许多药物的细胞反应仍然是一个挑战。因此&#xff0c;目前依然需要借助常规的bul…

excel表格在筛选状态下,怎样从指定数字开始填充序列?

分两种情况分开来说吧&#xff1a; 一、表格根据需要做数据筛选&#xff0c;指定列的序号始终保持0012开始的连续序号。 B2TEXT(AGGREGATE(3,5,B$1:B1)11,"0000") 然后向下填充公式。 当C列数据做了筛选以后&#xff0c;B列仍旧保持连续的序号&#xff0c;改变筛选…

MySQL连表查询

MySQL简介&#xff0c;我们为什么要学习各种join MySQL是SQL的一种&#xff0c;SQL意为结构化查询语言(Structure Query Language)&#xff0c;MySQL可以应用于现实世界的各种结构化数据。 SQL&#xff08;结构化查询语言&#xff09;&#xff0c;处理结构化数据的查询语言&a…

房产中介小程序高效开发攻略:从模板到上线一站式服务

对于房产中介而言&#xff0c;拥有一个高效且用户友好的小程序是提升业务、增强客户黏性的关键。而采用直接复制模板的开发方式&#xff0c;无疑是实现这一目标的最佳途径&#xff0c;不仅简单快捷&#xff0c;而且性价比极高。 在众多小程序模板开发平台中&#xff0c;乔拓云网…

Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的高校专业信息管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

前端vite+rollup前端监控初始化——封装基础fmp消耗时间的npm包并且发布npm beta版本

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐初始化npm项目&#x1f496;type为module&#x1f496;rollup.config.js ⭐封装fmp耗时计算的class&#x1f496;npm build打包class对象 ⭐发布npm的beta版本&#x1f496; npm发布beta版本 ⭐安装web-performance-tool的beta版本…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来&#xff0c;5G晶振的重要性也不言而喻&#xff0c;小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块&#xff0c;具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中&#xff0c;25G光…