温馨提示:这篇文章已超过453天没有更新,请注意相关的内容是否还可用!
摘要:在即将到来的2024年第二十一届五一杯大学生数学建模挑战赛(A题)中,本次比赛涉及数学建模完整代码及建模过程的全解全析。挑战者们将展示他们的数学建模能力,通过完整的代码和详细解析过程,解决复杂的实际问题。这场比赛将考验学生的数学技能、创新思维和解决问题的能力。
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为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第二个问题是给定下料切割布局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 f(i−1,j)+(xi−xi−1)2+(yi−yi−1)2 f(i,j−1)+(xj−xj−1)2+(yj−yj−1)2 1x=xc+acosθy=yc+bsinθ(x−xc)2+(y−yc)2=d2(x−xc)2/a2+(y−yc)2/b2=1x=xc±a2+b2 ady=yc±a2+b2 bd(x−xc)2+(y−yc)2=(d+w/2)2(x−xc)2/a2+(y−yc)2/b2=1x=xc±a2+b2 a(d+w/2)y=yc±a2+b2 b(d+w/2)dp[j]+c(j+1,i)+c(i,j+1)∣0≤j
还没有评论,来说两句吧...