问题1的求解:
目前更新资料完整版:
2024五一赛A题保姆级建模思路26页+1-3问可执行代码完整版+后续成品论文+各类可视化图表https://www.jdmm.cc/file/2710585
任务1(N1布局):
目标:从特定的切割起始点B1开始,最小化空程。
钢板尺寸:100单位宽,50单位高。
矩形切割区域尺寸:40单位宽,20单位高。
矩形位置:距左边界20单位,距底边界15单位。
步骤1:定义切割点坐标
使用文档中提供的坐标定义方法,确定B1、A1、A2、A3和A4点的坐标。
步骤2:计算B1到A1的直线距离(空程)
使用文档中的公式计算B1到A1的直线距离。
步骤3:计算顺时针切割路径长度
分别计算A1到A2、A2到A3、A3到A4和A4回到A1的长度。
步骤4:计算总路径长度
将B1到A1的空程与切割路径长度相加,得到总路径长度。
步骤5:优化策略
考虑文档中提到的优化策略,如最短路径优化、启发式方法和减少转角次数。
步骤6:实施和验证
使用贪心策略作为起始方案,从B1移动到A1,然后顺时针切割整个矩形。
步骤7:模拟和计算
根据文档中的模拟和计算,我们已经得到了从B1到A1的直线距离、矩形的切割路径长度和总路径长度。
步骤8:优化和调整
如果需要进一步减少空程,考虑调整切割起始点或矩形位置。
问题2具体分析
- 外边界:锯齿状,可能需要精确的路径计算来优化角度和转角。
- 内部切割:
- 四个圆形:每个圆的半径为3单位。
- 一个椭圆形:需要具体的尺寸和位置。
切割路径规划
1. 路径起点:题目可能指定了一个起始点,通常位于钢板的一个角上。
2. 顺序:考虑从外部锯齿开始切割还是先切内部形状,这取决于如何最小化空程。
3. 路径优化:使用数学模型来决定切割的最佳顺序和路径。
感谢你提供的问题2(N2布局)的图形数据。我们可以从这个图中提取具体的尺寸和布局信息,以设计最优的切割路径。
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, Rectangle
import numpy as np
# 定义点的坐标
points = [(0,0),(0,25),(8,25),(8,30),(0,30),(0,50),(8,50),(8,55),(0,55),(0,80),
(20,80),(20,65),(25,65),(25,80),(45,80),(45,65),(50,65),(50,80),(70,80),(70,65),(75,65),(75,80),(100,80),
(100,0),(75,0),(75,15),(70,15),(70,0),(50,0),(50,15),(45,15),(45,0),(25,0),(25,15),(20,15),(20,0),(0,0)
]
# 定义连接顺序,例如按照点的索引顺序连接
order = list(range(len(points))) # 使用list(range(len(points)))来简化索引列表的创建
# 提取按照指定顺序的坐标
x = [points[i][0] for i in order]
y = [points[i][1] for i in order]
# 创建图形和轴
fig, ax = plt.subplots()
# 绘制点
ax.scatter(x, y, color='red')
# 连接点
ax.plot(x, y, marker='o') # 'o'表示点的形状
# 添加圆形和椭圆形
circles = [(10, 75, 3), (35, 75, 3), (60, 75, 3), (85, 75, 3)]
ellipse = (60, 40, 15, 20) # 中心x, 中心y, 横轴长度, 纵轴长度
for cx, cy, radius in circles:
circle = Circle((cx, cy), radius, color='blue', fill=False)
ax.add_patch(circle)
ell = Ellipse((ellipse[0], ellipse[1]), 2*ellipse[2], 2*ellipse[3], color='green', fill=False)
ax.add_patch(ell)
# 椭圆参数
h, k = 60, 40 # 椭圆中心
a, b = 15, 20 # 横轴和纵轴半径
# 矩形参数
rect_width, rect_height = 3, 2 # 矩形的宽度和高度
cols, rows = 4, 3 # 列数和行数
x_spacing = 6 # 左右相邻矩形中心的距离
y_spacing = 5 # 上下相邻矩形中心的距离
# 矩形网格的起始点计算
start_x = h - (cols - 1) * x_spacing / 2
start_y = k - (rows - 1) * y_spacing / 2
# 添加矩形
for i in range(rows):
for j in range(cols):
rect_x = start_x + j * x_spacing
rect_y = start_y + i * y_spacing
rect = Rectangle((rect_x - rect_width / 2, rect_y - rect_height / 2), rect_width, rect_height, edgecolor='blue', facecolor='none')
ax.add_patch(rect)
# 设置图表标题和坐标轴标签
ax.set_title('Connect Points in Specific Order with Circles and Ellipse')
ax.set_xlabel('X Coordinate')
ax.set_ylabel('Y Coordinate')
# 设置显示范围
ax.set_xlim(-10, 110)
ax.set_ylim(-10, 90)
# 显示网格线
ax.grid(True)
# 显示图表
plt.show()
# 定义模拟退火算法的参数
initial_temp = 1000
min_temp = 1
steps = 1000
# 路径扰动函数
def perturb_path(path):
if len(path) < 2:
# 如果路径中没有足够的点来交换,直接返回原路径
return path
i, j = np.random.randint(0, len(path), 2)
path[i], path[j] = path[j], path[i]
return path
# 模拟退火算法框架
def simulated_annealing(points, circles, ellipse, rect_grid, initial_temp, min_temp, steps):
# 将所有矩形件中心点、圆形中心点、椭圆中心点加入到路径中
current_path = list(rect_grid) + [circles[0][0], circles[0][1]] + [ellipse[0], ellipse[1]]
current_cost = calculate_cost(current_path, points)
for _ in range(steps):
temp = initial_temp * (min_temp + (initial_temp - min_temp) * np.exp(-_ / steps))
new_path = perturb_path(current_path)
new_cost = calculate_cost(new_path, points)
if new_cost < current_cost or np.random.rand() < np.exp(-(new_cost - current_cost) / temp):
current_cost = new_cost
current_path = new_path
return current_path, current_cost
# 成本计算函数
def calculate_cost(path, points):
cost = 0
for i in range(len(path) - 1):
cost += distance(path[i], path[i + 1])
return cost
# 距离计算函数
def distance(p1, p2):
return np.linalg.norm(np.array(p1) - np.array(p2))
# 矩形网格的生成(简化示例,需要根据实际问题调整)
rect_grid = [(start_x + i * x_spacing, start_y + j * y_spacing) for i in range(cols) for j in range(rows)]
# 找到最优路径
optimal_path, optimal_cost = simulated_annealing(points, circles, ellipse, rect_grid, initial_temp, min_temp, steps)
# 输出最优路径和成本
print(f"Optimal cutting path: {optimal_path}")
print(f"Optimal cutting path cost: {optimal_cost}")
问题2具体分析
- 整个钢板尺寸:宽度80单位,高度不确定,但根据图示可以推断。
- 锯齿形边界:顶部有多个凸起和凹进的锯齿状边界。
- 圆形和椭圆形:
- 四个圆形,每个半径为3单位,分布在椭圆形周围。
- 一个较大的椭圆形位于中心位置,椭圆的尺寸大概为宽40单位、高20单位。
切割路径规划
1. 优化顺序:可能需要先从外部锯齿开始切割,因为这样可以最小化到达内部形状的移动距离。
2. 内部形状:对于圆形和椭圆,确定最短路径访问所有形状的顺序。
3. 减少空程:可能需要考虑一个接一个地切割形状,或者寻找一种方法将路径连续进行以减少回头路。
为了更具体地进行路径设计和优化,我们需要决定一个具体的切割起始点。通常,起始点设置在边缘的某个角落会是个好选择,因为这可以最大限度地减少初始移动的空程。然后,我们可以利用数学算法(如遗传算法、模拟退火等)来优化从一个切割点到另一个切割点的移动路径。
我们从模拟一个简单的贪心策略开始,这个策略尽可能直接地从一个圆形到另一个圆形,最后切割椭圆形,同时考虑锯齿形边界的切割。
首先,我们将构建一个模拟的贪心策略来处理问题2的切割任务。这个策略将尽量按照从最近的一个切割形状到下一个最近的切割形状进行移动,以此减少空程。考虑到布局中有四个圆形和一个椭圆,我们可以从一个角落的起点开始,先切割最近的圆形,然后依次切割其他圆形,最后切割椭圆。
步骤
1. 确定起始点:通常选择钢板的一个角作为起始点,考虑到布局,我们可以选择左上角作为起点。
2. 计算到每个切割形状的距离:从起始点计算到每个圆的中心和椭圆的中心的距离。
3. 按最短距离顺序切割:使用贪心算法确定切割顺序。
4. 模拟路径:计算实际的空程和切割路径。
数据整理
首先,我们需要整理并确认每个形状的准确位置。提供的图中有尺寸标注,但为了简化,我们可以假设椭圆位于布局中心,圆形分布在其周围。我们将基于这些信息来计算距离和建立模型。
以下是计算和模拟这一切割过程的代码。
import numpy as np
设定起始点,假设为左上角
起始点 = (0, 0)
圆形和椭圆的中心坐标
圆心坐标 = [
(20 + 5 + 3, 20 + 5 + 3), 第一个圆,中心在(28, 28)
(20 + 5 + 20 + 5 + 3, 20 + 5 + 3), 第二个圆,中心在(53, 28)
(20 + 5 + 20 + 5 + 20 + 5 + 3, 20 + 5 + 3), 第三个圆,中心在(78, 28)
(20 + 5 + 20 + 5 + 20 + 5 + 25 + 5 + 3, 20 + 5 + 3) 第四个圆,中心在(108, 28)
]
椭圆中心 = (50, 20 + 15 + 10) 假设椭圆在布局中心,坐标(50, 45)
将椭圆中心添加到圆心坐标列表中
圆心坐标.append(椭圆中心)
计算从起始点到每个圆心的距离
距离列表 = [np.sqrt((x - 起始点[0]) 2 + (y - 起始点[1]) 2) for x, y in 圆心坐标]
用贪心算法选择最近的切割点顺序
切割顺序 = sorted(range(len(距离列表)), key=lambda k: 距离列表[k])
输出计算的距离和切割顺序
距离列表, 切割顺序
根据计算结果,我们已经得到了从起始点(假设为钢板的左上角)到每个圆心的距离,以及椭圆中心的距离。这些距离和切割顺序如下:
- 第一个圆的中心(位于28, 28)距离为约39.6单位
- 第二个圆的中心(位于53, 28)距离为约59.9单位
- 椭圆中心(位于50, 45)距离为约67.3单位
- 第三个圆的中心(位于78, 28)距离为约82.9单位
- 第四个圆的中心(位于108, 28)距离为约111.6单位
贪心算法得出的切割顺序是:首先切割第一个圆,然后切割第二个圆,接着
切割椭圆,再切割第三个圆,最后切割第四个圆。
切割路径模拟
现在,我们可以模拟这个切割路径来计算总的空程和切割路径。切割路径将按照上述顺序从一个切割点移动到下一个切割点。每次移动后,我们将计算并累加这些移动的距离,同时计算切割路径。
接下来,我们计算总的移动距离(包括到达每个圆的空程和从一个圆到下一个圆的移动)。
在模拟的切割路径中,总的移动距离(包括到达第一个切割点的空程以及切割点之间的移动)约为144.6单位。这个结果反映了从左上角起始点开始,按照最短距离优化顺序访问所有圆形和椭圆的路径长度。
这个距离是一个初步估计,实际操作中可能还需要考虑切割工具的转向、加速、减速等因素,这些都可能影响最终的效率和空程。如果需要更精确的路径优化或想应用更复杂的算法(如遗传算法或模拟退火等),我们可以进一步探讨如何实现这些优化策略。
接下来,我们将处理问题3(N3布局),根据题目描述,这个布局比N2更复杂,包括一个椭圆形以及在椭圆内部多切割出12个矩形件,这些矩形在椭圆中的位置是对称分布的。
问题2的求解