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_x
    y = 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_cx
    cut_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_length

    else:
        # 计算切割点到椭圆的最近点的距离
        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 / 2
    start_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 - 6
    start_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 * i
    start_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 * i
    start_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):
    # 初始化空程总长度为0
    empty_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 获取更多数模细节资讯,了解更多深度学习前沿科技信息&顶会论文分享!

  • 58
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
2021五一数模A思路+参考资料+a代码疫苗生产优化问题 问题 1:本需要对于每箱疫苗在所有工位上的生产时间进行描述性统计分析,由于先前对于 不同类型的疫苗进行模拟实验,根据已经掌握的实验数据直接进行描述性分析即可。可以通过 EXCEL、SPSS、R 语言等数据处理软件直接进行分析,建议分析完成之后分别对于均值、方差、 最值、概率分布等不同的指标解释其数理意义以及描述不同工位生产疫苗的能力水平,方便为下一 步的研究打基础。难点在于数据的处理。 问题 2:根据附件中所给出的数据,先对其所有的数据求出平均值。将平均值作为参考指标。 题目中原先说明必须按照 CJ1-CJ2-CJ3-CJ4 的顺序完成 4 个工位都进行了加工才算加工完成。当一 种疫苗进入生产步骤之后,必须完成该步骤的生产才可以安排下一种疫苗进入。由于目标函数是实 现生产时间最短,本提供两种可选方案,原理相通。一、可以选择使用 LINGO 软件安排最优线 路,设定每一个步骤所需要实现的时间长短以及该疫苗所需要完成加工的总时间,尽可能实现每一 个加工步骤都有不同类型的疫苗在进行加工,如果每一个加工步骤都能保证中间加工的空挡不断层, 即可实现加工效率的最优化。二、最优化算法中可以使用 TSP 算法安排最优的线路,通过该算法 也可以获得最优的加工顺序。要点在于本选用生产的平均值作为参考指标,大大降低了计算步骤 的难度。难点在于计算好每一类型的疫苗加工生产过程中所需要的总时间和不同加工步骤之间相距 的时间差的,其中的变量在于不同的疫苗进入加工步骤的顺序。加工步骤不可以变动顺序。 问题 3:本问题 2 最明显的区别就是每个工位生产疫苗的时间不再使用平均值来进行代替 了。问题 1 种研究了不同的指标来反映不同工位生产疫苗的能力水平,可以在其中进行选取即可完 成时间变量的选择。题目要求交货总时间比问题 2 的总时间缩短 5%,即在原先问题的基础之上进 行优化目标。根据优化算法来进行生产顺序调度安排,本建议使用禁忌搜索算法来寻求最优解, 该算法可以避免陷入局部最优。求解过程与问题 2 相近,不再赘述。确定完成生产顺序之后,由于 生产的每一个过程中的时间并不是一个确定值,而是分布于一个相近的区间内,所以可以通过区间 估计来确定概率数值。本也可以使用遗传算法进行求解,确定完成遗传算法的变异率,通过代码 的计算可以完成。 问题 4:本再次引入新的限制条件,限制生产条件和生产时间。每一天时间长度为 16 小时, 且要求必须完成某一种疫苗的全部生产过程才可以开始生产别的种类的疫苗。生产时间长度可以使 用问题一中给出的相关指标变量从而确定单一产品的时间。当确定完成时间之后,分别对于所有的 产品生产的时间进行计算即可得出所需要的生产时间。时间指标可以是一个变动的过程,由于生产 的时间必须为天数的整数单位(达不到一天按一天计算,若一天内能完成两项任务,可以一天安排 两种疫苗的生产),生产任务不可以拆分,所以需要读者有耐心选择正确的计算方法计算出不同疫 苗产品的生产时间以及规划不同疫苗的生产周期。由于已经限定了可靠性为 90%,生产时间最短 即可。使用不同疫苗产品的生产总时间作为目标变量,通过调动不同的疫苗产品作为自变量的生产 过程,确定约束条件即可计算出预期时间。 问题 5:安排生产计划是一项运筹规划类型题目。根据附件给出的不同疫苗产品的报价、生产 疫苗所需要的时间、不同产品疫苗的最大任务数量进行线性规划,难点在于线性规划的约束条件是 函数关系,根据生产单一疫苗所需要的时间进行确定相关参数。销售额=疫苗的出厂价格×出厂数 量,则控制不同的疫苗的产量可以通过神经网络模型等深度学习算法进行自动求解。规划模型的条 件和生产的顺序可以通过模型计算过程自动求得最优解。由于神经网络模型自身容易陷入局部收敛 的死循环中,可以加入优化算法对该模型进行优化。切记全文所使用的优化算法一定不能重复。可 以参考:遗传算法、蚁群算法、粒子群算法等。 备注:由于生产过程的不确定性,所以生产单一疫苗的时间确定需要根据实际模拟的数据进行 确定。题目问题 2 要求使用平均值进行确定,别的题目仍然可以使用,但是有能力的话建议使用 别的指标进行确定。
2023 第八届数维杯大学生数学建模挑战赛b要求我们通过建立数学模型来解决问题。在解答这道之前,我们首先需要理解题目的要求和条件。 经过分析题目内容,我们可以得知该要求我们确定三幅相互切线连接的圆的半径和切点位置。首先,我们可以通过计算出三个切点的坐标来确定切点位置。可以利用已知条件,使用平行四边形法则,得到切点的坐标。然后,我们可以根据切点坐标计算出三个圆之间的距离,从而求出圆的半径。 为了建立数学模型解决问题,我们可以做如下步骤: 第一步,确定切点坐标:根据已知条件,计算出三个切点的坐标。假设三个切点坐标分别为A(x1, y1),B(x2, y2),C(x3, y3)。 第二步,计算圆心坐标:利用平行四边形法则,根据已知的切点坐标可以求得三个圆心的坐标。令圆心坐标分别为O1(xo1, yo1),O2(xo2, yo2),O3(xo3, yo3)。 第三步,计算半径:利用已知的切点和圆心坐标,可以计算出三幅圆之间的距离。令圆的半径分别为r1,r2,r3。 最后,我们可以将以上三步整合在一起,建立数学模型来解决问题。运用相关的几何原理和计算方法,可以计算出题目要求的圆的半径和切点位置。 总的来说,通过建立数学模型,可以解决2023 第八届数维杯大学生数学建模挑战赛b。我们可以分步骤确定切点坐标和圆心坐标,进而计算出圆的半径。这样,我们就能够满足题目的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值