2023 国赛B题,高教社杯建模解析,小鹿学长带队指引全代码文章与思路
我是小鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~比赛的时候常规的数据分析办法 以及线性规划算法,一般来说在比赛中会经常考到~要保持积极的心态,不断提高建模和解决问题的能力。相信这回也能给大家一个非常好的帮助!
题目一
问题背景和目标:
在海洋勘测中,测量海底深度是一项关键任务。多波束测深系统可以同时发射多个声波波束,提高了测量效率。然而,为了确保测量精度和全覆盖,需要建立一个模型,计算每个波束的覆盖宽度和相邻波束之间的重叠率。
基本参数定义:
首先,我们定义一些基本参数,以便建立模型:
- D:海水深度,表示从水表面到海底的距离(单位:米)。
- θ:多波束换能器的开角,表示每个波束的发射角度(单位:度)。
- α:坡度,表示测线与水平面的夹角,用来考虑海底的坡度(单位:度)。
模型建立步骤:
现在,我们将详细说明建立多波束测深覆盖宽度和重叠率的模型的步骤:
步骤 1:计算单个波束的覆盖宽度 W:
单个波束的覆盖宽度表示波束在海底上的宽度。我们使用以下公式来计算它:
这个公式的理解如下:
- tan(2θ) 表示半开角的正切值,它与波束的宽度有关。
- cos(α) 考虑了海底的坡度对覆盖宽度的影响。
- 2D 表示声波在水中往返的距离,与海水深度 D 相关。
步骤 2:计算相邻波束之间的重叠率 η:
重叠率是指相邻两个波束之间的覆盖重叠部分与波束宽度的比率。我们使用以下公式来计算重叠率:
其中,d 表示相邻两个波束之间的距离。
步骤 3:满足重叠率要求:
问题中要求相邻条带之间应有 10%~20% 的重叠率。因此,我们需要调整测线的间距 d 以满足这一要求。通常,可以尝试不同的间距值并计算相应的重叠率,以找到合适的间距,使得重叠率在要求范围内。
步骤 4:计算不同位置的覆盖宽度和重叠率:
使用上述步骤,我们可以在不同距离中心点的位置计算出覆盖宽度 W 和相邻波束之间的重叠率 η。这可以通过改变距离中心点的位置来模拟不同的测线布局。
步骤 5:保存结果:
最后,将计算结果整理成表格的形式,包括测线距中心点的距离、海水深度、覆盖宽度 W 和与前一条测线的重叠率 η。这些结果可以帮助确定最佳的测量布局,以满足数据收集的要求。
python代码:
import pandas as pd
import math
from openpyxl import Workbook
# 定义计算覆盖宽度的函数
def calculate_coverage_width(D, theta, alpha):
return 2 * D * math.tan(math.radians(theta / 2)) * math.cos(math.radians(alpha))
# 海水深度、多波束换能器的开角和坡度
D = 70 # 海水深度(单位:米)
theta = 120 # 多波束换能器的开角(单位:度)
alpha = 1.5 # 坡度(单位:度)
# 测线距中心点的距离(单位:米)
distances = [-800, -600, -400, -200, 0, 200, 400, 600, 800]
# 计算覆盖宽度和重叠率
coverage_widths = [calculate_coverage_width(D, theta, alpha) for _ in distances]
overlap_rates = [coverage_widths[i] / (2 * abs(distances[i])) for i in range(len(distances))]
# 将结果保存到DataFrame#见完整版
Matlab:
% 定义海水深度、多波束换能器的开角和坡度
D = 70; % 海水深度(单位:米)
theta = 120; % 多波束换能器的开角(单位:度)
alpha = 1.5; % 坡度(单位:度)
% 测线距中心点的距离(单位:米)
distances = [-800, -600, -400, -200, 0, 200, 400, 600, 800];
% 计算覆盖宽度和重叠率
coverage_widths = zeros(size(distances));
overlap_rates = zeros(size(distances));
for i = 1:length(distances)
% 计算单波束的覆盖宽度
coverage_widths(i) = 2 * D * tan(deg2rad(theta/2)) * cos(deg2rad(alpha));
% 计算与前一条测线的重叠率#见完整版
问题二
建立多波束测深覆盖宽度的数学模型可以通过以下步骤来完成,使用的主要算法是基于几何关系和三角函数的计算:
问题背景和目标:
在问题2中,我们考虑一个矩形待测海域,海域的形状和坡度可能导致覆盖宽度在不同位置和方向上变化。我们的目标是建立一个模型,可以计算在给定参数下,多波束测深的覆盖宽度。
基本参数定义:
首先,我们定义一些基本参数,以便建立模型:
- D:海水深度,表示从水表面到海底的距离(单位:米)。
- β:测线方向与海底坡面的法向在水平面上投影的夹角,用来考虑海底的坡度(单位:度)。
- θ:多波束换能器的开角,表示每个波束的发射角度(单位:度)。
模型建立步骤:
现在,我们将详细说明建立多波束测深覆盖宽度的模型的步骤:
步骤 1:计算单个波束的覆盖宽度 W:
单个波束的覆盖宽度表示波束在海底上的宽度。我们使用以下公式来计算它:
这个公式的理解如下:
- tan(2θ) 表示半开角的正切值,它与波束的宽度有关。
- cos(β) 考虑了海底的坡度对覆盖宽度的影响。
- 2D 表示声波在水中往返的距离,与海水深度 D 相关。
步骤 2:计算覆盖宽度的变化:
根据不同的测线方向夹角 β,我们可以计算在不同方向上的覆盖宽度。通常,需要考虑 360 度中的各个方向,并计算每个方向上的覆盖宽度。
步骤 3:保存结果:
将计算结果整理成表格的形式,包括测量船距海域中心点处的距离(可以用海里作为单位)、测线方向夹角、以及对应的覆盖宽度。这些结果可以帮助确定多波束测深系统的覆盖情况。
算法和数学公式:
- 算法主要是基于几何关系和三角函数的计算,包括使用正切函数计算半开角的正切值,以及使用余弦函数考虑海底坡度的影响。
# 导入所需的库
import pandas as pd # 用于处理数据和创建DataFrame
import math # 用于数学计算
from openpyxl import Workbook # 用于创建和保存Excel文件
# 定义计算覆盖宽度的函数
def calculate_coverage_width(D, theta, beta):
return 2 * D * math.tan(math.radians(theta / 2)) * math.cos(math.radians(beta))
# 海水深度、多波束换能器的开角和坡度
D = 120 # 海水深度(单位:米)
theta = 120 # 多波束换能器的开角(单位:度)
alpha = 1.5 # 坡度(单位:度)
# 测量船距海域中心点处的距离(单位:海里)
distances_in_nautical_miles = [0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1]
# 转换为米
问题三
要设计一组测量长度最短、可以完全覆盖整个待测海域的测线,并且相邻条带之间的重叠率满足10%到20%的要求,可以采取以下步骤:
步骤 1:确定测线的方向
首先,我们需要确定测线的方向,以确保可以完全覆盖整个待测海域。由于海域是一个南北长2海里、东西宽4海里的矩形,我们可以选择在南北方向上布置一系列测线。
步骤 2:计算测线间距
要设计测线,我们需要计算相邻测线之间的距离,以满足10%到20%的重叠率要求。重叠率可以定义为:
重叠率(η)
其中,d 是相邻两条测线的间距,W 是单个波束的覆盖宽度。
步骤 3:计算最短测线长度
要计算最短测线长度,我们可以使用三角形的几何关系。考虑到海域的坡度,我们可以使用以下关系来计算最短测线长度:
其中,最短L最短 是最短测线的长度。
步骤 4:确定测线位置
从海域的中心点开始,按照选定的测线方向,依次布置测线,确保相邻测线之间的距离满足重叠率要求,并且最短测线的长度尽可能短。这可以通过调整相邻测线之间的间距来实现。
步骤 5:检查覆盖情况
设计好测线后,需要检查是否满足完全覆盖整个待测海域的要求。可以通过绘制测线的图形来进行可视化检查。
步骤 6:保存测线信息
将设计好的测线的位置和长度等信息保存下来,以备后续使用。
import math
# 定义海域尺寸和参数
width_nautical_miles = 4 # 海域宽度(海里)
length_nautical_miles = 2 # 海域长度(海里)
depth_meters = 110 # 海水深度(米)
beam_angle_degrees = 120 # 多波束换能器的开角(度)
slope_degrees = 1.5 # 坡度(度)
# 将海里转换为米
width_meters = width_nautical_miles * 1852
length_meters = length_nautical_miles * 1852
# 计算单个波束的覆盖宽度
beam_angle_radians = math.radians(beam_angle_degrees)
coverage_width = 2 * depth_meters * math.tan(beam_angle_radians / 2) * math.cos(math.radians(slope_degrees))
# 计算最短测线长度#见完整代码
题目四
要解决问题4,我们需要使用给定的海水深度数据来设计一组测线,以满足以下要求:
- 沿测线扫描形成的条带要尽可能地覆盖整个待测海域。
- 相邻条带之间的重叠率要尽量控制在20%以下。
- 测线的总长度要尽可能短。
以下是解决问题4的一种方法:
步骤1:数据预处理
首先,我们需要导入并预处理给定的海水深度数据。这些数据将用于确定海域的地形,以便设计测线。
步骤2:确定测线方向
选择一条初始测线,通常可以从海域的中心点开始,然后确定测线的方向。在这个方向上,我们将逐渐添加测线,以覆盖整个海域。
步骤3:计算测线覆盖区域
从初始测线开始,沿着选定的方向逐渐添加测线,以便测线扫描形成的条带尽可能地覆盖整个海域。可以使用一定的间隔或根据海域地形进行调整。
步骤4:计算重叠率
在计算测线位置时,要注意相邻条带之间的重叠率。可以通过测量相邻测线之间的重叠区域来计算重叠率。
步骤5:优化测线
根据计算结果,可以尝试不同的测线布局,以优化总测线长度,并确保满足重叠率要求。
步骤6:计算指标
一旦设计好测线,可以计算以下指标:
- 测线的总长度。
- 漏测海区占总待测海域面积的百分比。
- 在重叠区域中,重叠率超过20%部分的总长度。
要计算这些指标,需要考虑测线的位置和重叠区域。
这个问题的解决方案可能需要使用优化算法,例如贪婪算法或遗传算法,以获得最佳测线布局。
本题使用贪婪算法,
贪婪算法是一种常用于解决组合优化问题的启发式算法,它通常以每一步的局部最优选择来构建全局最优解。在问题4中,我们可以使用贪婪算法来设计一组测线,以满足要求并尽可能减少总测线长度。
以下是使用贪婪算法解决问题4的一种方法:
步骤1:数据预处理 首先,导入并预处理给定的海水深度数据,将其转化为一个合适的数据结构,例如二维数组或矩阵,以便于后续计算。
步骤2:确定初始测线 选择一个初始测线的起始点,通常可以从海域的中心点开始。确定测线的起始方向,这将是我们贪婪算法的出发点。
步骤3:迭代添加测线 开始迭代过程,不断添加新的测线以覆盖尚未覆盖的海域。迭代的具体步骤如下:
a. 计算当前测线方向上的一个新测线的位置。这可以通过考虑前一条测线的位置、海域地形数据和所选方向来实现。新测线的位置应该尽量满足覆盖整个海域和控制重叠率的要求。
b. 检查新测线是否与已有的测线重叠过多,如果超过了20%的限制,则进行调整,确保重叠率在可接受范围内。
c. 添加新测线,并将其纳入已有的测线集合中。
d. 检查是否已经覆盖了整个海域,如果是,则停止迭代;否则,返回步骤a。
步骤4:计算指标 一旦设计好测线,可以计算以下指标:
- 测线的总长度:将所有测线的长度相加即可。
- 漏测海区占总待测海域面积的百分比:根据测线的覆盖情况和海域地形数据计算未覆盖的海区面积占总海域面积的百分比。
- 在重叠区域中,重叠率超过20%部分的总长度:根据已有的测线和重叠情况计算重叠区域的长度并统计超过20%的部分。
步骤5:优化测线(可选) 如果需要进一步优化总测线长度,可以考虑对已有的测线布局进行调整,以寻找更优解。这可以使用其他优化算法来实现,例如遗传算法。
贪婪算法是一种常用于解决组合优化问题的启发式算法,它通常以每一步的局部最优选择来构建全局最优解。在问题4中,我们可以使用贪婪算法来设计一组测线,以满足要求并尽可能减少总测线长度。
import numpy as np
# 定义海域尺寸和参数
width_nautical_miles = 4 # 海域宽度(海里)
length_nautical_miles = 5 # 海域长度(海里)
depth_meters = 110 # 海水深度(米)
beam_angle_degrees = 120 # 多波束换能器的开角(度)
slope_degrees = 1.5 # 坡度(度)
# 将海里转换为米
width_meters = width_nautical_miles * 1852
length_meters = length_nautical_miles * 1852
# 定义遗传算法的参数
population_size = 50 # 种群大小
generations = 100 # 迭代次数
# 定义适应度函数
def fitness_function(chromosome):
# chromosome是一个测线布局的表示,具体格式根据需要定义
# 在这里,需要实现计算测线总长度以及满足重叠率要求的适应度评估方法
# 返回一个适应度值,目标是最小化该值
# 初始化种群#见完整版
完整代码+思路+论文如下提供:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)