2024数学建模国赛高教社杯D题:问题3最简单思路代码解析

        在这个问题中,我们的目标是优化反潜作战中的投弹策略,以最大化命中潜艇的概率。通过调整投弹阵列的间隔(ab),以及引爆深度(Z_trigger),我们可以设计出最优的投弹策略。代码主要通过三种投弹策略来计算命中概率,并使用粒子群优化(PSO)算法对这些策略进行优化。以下是详细的解题思路:

1. 基础参数与潜艇定位
  • 定位误差:潜艇的水平定位误差服从正态分布,设定为 sigma_x = 50sigma_y = 50。这些参数用于生成潜艇的位置。
  • 炸弹阵列:投弹区域是一个 3x3 的矩阵,每个单元格代表一个炸弹的投放位置。
# 创建一个3x3的炸弹位置阵列
def bomb_positions():
    return np.array([[0, 0], [0, 1], [0, 2],
                     [1, 0], [1, 1], [1, 2],
                     [2, 0], [2, 1], [2, 2]])
2. 命中概率计算
  • 计算未命中区域的概率:炸弹未命中潜艇时,该区域会被排除在外,从而更新后续炸弹的命中概率。
# 计算未命中区域的概率(在正态分布中排除掉的区域)
def calc_excluded_prob(x, y, sigma_x, sigma_y, radius):
    prob_x = norm.cdf(x + radius, 0, sigma_x) - norm.cdf(x - radius, 0, sigma_x)
    prob_y = norm.cdf(y + radius, 0, sigma_y) - norm.cdf(y - radius, 0, sigma_y)
    return prob_x * prob_y

炸弹命中概率:根据炸弹与潜艇的距离计算命中概率。如果炸弹在潜艇的杀伤半径内,则命中概率较高,否则随着距离增加命中概率下降。

# 计算炸弹的命中概率
def calc_hit_prob(bomb_pos, sub_pos, base_prob, rem_prob):
    dist = np.sqrt((bomb_pos[0] - sub_pos[0]) ** 2 + (bomb_pos[1] - sub_pos[1]) ** 2)
    if dist <= radius:
        return base_prob * rem_prob
    else:
        return base_prob * rem_prob / (dist / radius)
3. 三种投弹策略
  • 策略一:斜方向投弹
    • 沿 3x3 矩阵的对角线投放炸弹。逐步排除未命中的区域,从而提高后续投弹的命中概率。
def diagonal_bombing(positions, sub_pos, base_prob):
    results = []
    rem_prob = 1.0
    diagonal_pos = [positions[0], positions[4], positions[8]]

    for pos in diagonal_pos:
        hit_prob = calc_hit_prob(pos, sub_pos, base_prob, rem_prob)
        results.append(hit_prob)
        excl_prob = calc_excluded_prob(pos[0], pos[1], sigma_x, sigma_y, radius)
        rem_prob -= excl_prob
        base_prob *= rem_prob

    while len(results) < 9:
        results.append(0)

    return results

策略二:中心扩展投弹

  • 先投放中心炸弹,再投放上下左右的炸弹,最后投放四角的炸弹。这种策略对称性强,适合潜艇更可能位于中心的情况。
def center_out_bombing(positions, sub_pos, base_prob):
    results = []
    rem_prob = 1.0
    center_pos = positions[4]
    neighbors = [positions[1], positions[3], positions[5], positions[7]]
    corners = [positions[0], positions[2], positions[6], positions[8]]

    hit_prob = calc_hit_prob(center_pos, sub_pos, base_prob, rem_prob)
    results.append(hit_prob)
    excl_prob = calc_excluded_prob(center_pos[0], center_pos[1], sigma_x, sigma_y, radius)
    rem_prob -= excl_prob
    base_prob *= rem_prob

    for pos in neighbors + corners:
        hit_prob = calc_hit_prob(pos, sub_pos, base_prob, rem_prob)
        results.append(hit_prob)
        excl_prob = calc_excluded_prob(pos[0], pos[1], sigma_x, sigma_y, radius)
        rem_prob -= excl_prob
        base_prob *= rem_prob

    return results

策略三:顺时针/逆时针投弹

  • 按照顺时针或逆时针顺序投放炸弹,从边缘向内逐渐覆盖潜艇的可能位置。
def circular_bombing(positions, sub_pos, base_prob, clockwise=True):
    results = []
    rem_prob = 1.0

    if clockwise:
        order = [positions[0], positions[1], positions[2], positions[5], positions[8],
                 positions[7], positions[6], positions[3], positions[4]]
    else:
        order = [positions[0], positions[3], positions[6], positions[7], positions[8],
                 positions[5], positions[2], positions[1], positions[4]]

    for pos in order:
        hit_prob = calc_hit_prob(pos, sub_pos, base_prob, rem_prob)
        results.append(hit_prob)
        excl_prob = calc_excluded_prob(pos[0], pos[1], sigma_x, sigma_y, radius)
        rem_prob -= excl_prob
        base_prob *= rem_prob

    return results
4. 优化策略
  • 使用粒子群优化(PSO)算法来调整投弹间隔(ab)以及引爆深度(Z_trigger),以找到最优参数组合,使总命中概率最大化。
# 优化目标函数,用于计算总命中概率
def optimize_strategy(x):
    a, b, Z_trigger = x
    sub_pos = generate_sub_position()
    positions = bomb_positions()

    base_prob = Z_trigger / 200.0

    diag_probs = diagonal_bombing(positions, sub_pos, base_prob)
    center_probs = center_out_bombing(positions, sub_pos, base_prob)
    circ_probs = circular_bombing(positions, sub_pos, base_prob, clockwise=True)

    total_prob = sum(diag_probs) + sum(center_probs) + sum(circ_probs)
    return -total_prob  # 取负值用于最小化问题

# 使用PSO优化a, b, Z_trigger
lb = [20, 20, 170]
ub = [60, 60, 190]
best_params, best_prob = pso(optimize_strategy, lb, ub, swarmsize=30, maxiter=50)

最后,根据优化结果选择最优策略并进行排序。

strategies = [("斜方向投弹", sum(diag_probs)),
              ("中心扩展投弹", sum(center_probs)),
              ("顺时针投弹", sum(circ_probs))]

sorted_strategies = sorted(strategies, key=lambda x: x[1], reverse=True)

for i, (name, prob) in enumerate(sorted_strategies):
    print(f"第 {i + 1} 名: {name}, 总命中概率: {prob:.4f}")

通过分析潜艇的定位误差,调整投弹阵列的间隔和定深引信的引爆深度,结合三种不同的投弹策略(斜方向、中心扩展、顺时针/逆时针),并使用粒子群优化算法进行参数优化,我们成功设计出了最优的投弹方案,使潜艇被命中的概率最大化。

一问、二问解题思路可看我历史文章

2024数模D题一问思路

2024数模D题二问思路

### 回答1: 这道目是一道典型的数学建模目,需要我们运用数学知识和编程技巧来解决。 首先,我们需要对目进行分析,了解目的要求和限制条件。目要求我们设计一种算法,能够在给定的时间内,对大量的数据进行处理,找出其中的规律和特征。同时,目还要求我们对算法的效率进行评估,以便优化算法的性能。 针对这个要求,我们可以考虑使用数据结构和算法来解决问题。具体来说,我们可以使用哈希表来存储数据,以便快速查找和比较。同时,我们可以使用动态规划算法来优化算法的性能,以便在给定的时间内完成数据处理任务。 具体的实现过程中,我们可以先将数据进行预处理,将其转化为适合哈希表存储的格式。然后,我们可以使用哈希表来存储数据,并使用动态规划算法来优化算法的性能。最后,我们可以对算法的效率进行评估,以便进一步优化算法的性能。 总之,这道目需要我们综合运用数学知识和编程技巧,设计出一种高效的算法,以便在给定的时间内完成数据处理任务。 ### 回答2: 2022数学建模国赛高教社杯c是一道关于运动员参赛策略的问题。该给出了一个比赛规则:每个参赛队员可以参加3项不同的比赛项目,并且每个项目最多可以有两名队员参加。同时,比赛中每个队员的得分会被计算得到一个最终的成绩。现在需要选出合适的参赛队员和比赛项目,使得最终的团队得分最高。 首先,我们需要对数据进行初步的分析。目给出的数据包括每个队员的个人得分、参赛项目的得分以及每个队员与比赛项目的配对得分。我们可以根据这些数据,计算出每个队员在不同比赛项目中的得分预期值(期望得分)以及参加不同项目组成的团队的得分预期值。 接着,我们可以建立一个决策模型,将问题进行抽象和形式化。我们可以将每个参赛队员表示为一个节点,将每个比赛项目表示为一个状态。同时,我们可以定义一组关系来表示每个队员与比赛项目之间的配对得分。我们可以使用图论的方法对这些关系进行建模。 然后,我们可以根据模型的数学形式,使用优化算法来求解最优解。具体来说,可以使用整数规划的方法来进行求解。我们可以将参赛队员和比赛项目分别表示为整数变量,使用线性规划的方法对目标函数进行建模,然后通过整数规划算法进行求解。 最后,我们需要对模型的结果进行验证和分析。我们可以使用敏感性分析方法,来确定模型对各个参数的变化的敏感性。同时,我们还可以使用实际数据对模型进行校验,检测模型的准确性和可靠性。 总之,2022数学建模国赛高教社杯c涉及到运动员参赛策略的问题,需要使用数学建模的方法对问题进行抽象和形式化,然后使用优化算法进行求解。这种方法可以有效地解决各种具有复杂约束和限制条件的决策问题。 ### 回答3: 2022数学建模国赛高教社杯c是一道基于图论分析和传染病模型的目。该目要求建立一个模型,分析社交网络中的疾病传播。 首先,我们需要建立一个社交网络图模型,该图模型由节点和边组成,其中节点表示社交网络中的人,边表示人与人之间的关系。接下来,我们可以使用连通性分析算法,计算该社交网络图的连通分量,以确定该社交网络的组成结构。 随后,我们通过传染病模型来分析疾病在社交网络中的传播过程。一般地,我们可以使用SIR模型描述传染病的传播过程,其中S表示易感者,I表示感染者,R表示康复者。在传染病传播的过程中,我们可以通过标注每个节点的状态(易感、感染、康复),并建立基于疾病传播动态的演化模型,以预测社交网络中的疾病传播趋势。 最后,我们可以采用疾病传播模型的结果,对该社交网络中的个体和群体提出控制策略。例如,我们可以通过隔离病患、接种疫苗等控制措施,来降低社交网络中疾病的传播速率,从而保护社会公众的健康和安全。 总之,该目旨在通过建立社交网络图模型和使用传染病模型分析社交网络中的疾病传播过程,为控制社交网络中疾病传播提供决策支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值